Files
vibe_data_ana/__pycache__/data_analysis_agent.cpython-313.pyc

180 lines
20 KiB
Plaintext
Raw Normal View History

<EFBFBD>
,%^i<>V<00><00><><00>SrSSKrSSKrSSKrSSKJrJrJrJr SSK J
r
SSK J r SSK Jr SSKJr SSKJr SS KJr SS
KJr SS KJrJr "S S 5rg)ux
简化的 Notebook 数据分析智能体
仅包含用户和助手两个角
2. 图片必须保存到指定的会话目录中输出绝对路径禁止使用plt.show()
3. 表格输出控制超过15行只显示前5行和后5行
4. 强制使用SimHei字体plt.rcParams['font.sans-serif'] = ['SimHei']
5. 输出格式严格使用YAML共享上下文的单轮对话模式
<EFBFBD>N)<04>Dict<63>Any<6E>List<73>Optional)<01>create_session_output_dir)<01>format_execution_result)<01>extract_code_from_response)<01>load_and_profile_data)<01> LLMHelper)<01> CodeExecutor)<01> LLMConfig)<02>data_analysis_system_prompt<70>final_report_system_promptc <00>T<00>\rSrSrSrSS\S\S\S\4Sjjr S \S
\
\\ 44S jr S \S \
\\ 4S
\
\\ 44S jr S \S \
\\ 4S
\
\\ 44SjrS \S \
\\ 4S
\
\\ 44SjrSS\S\\S\S
\
\\ 44SjjrS
\4SjrS
\
\\ 44SjrS\\
\\ 4S
\4SjrSrSrg)<1C>DataAnalysisAgent<6E>u<>
数据分析智能体
职责:
- 接收用户自然语言需求
- 生成Python分析代码
- 执行代码并收集结果
- 基于执行结果继续生成后续分析代码
N<EFBFBD>
llm_config<EFBFBD>
output_dir<EFBFBD>
max_rounds<EFBFBD>force_max_roundsc<00><><00>U=(d
[5Ul[UR5UlX lX0lX@l/Ul/UlSUl SUl
SUl SUl g)u<>
初始化智能体
Args:
config: LLM配置
output_dir: 输出目录
max_rounds: 最大对话轮数
force_max_rounds: 是否强制运行到最大轮数忽略AI的完成信号
rN<>) r <00>configr <00>llm<6C>base_output_dirrr<00>conversation_history<72>analysis_results<74> current_round<6E>session_output_dir<69>executor<6F> data_profile)<05>selfrrrrs <20>H/Users/jeasonzhao/Desktop/iov_data_analysis_agent/data_analysis_agent.py<70>__init__<5F>DataAnalysisAgent.__init__$sb<00><00> !<21>/<2F>I<EFBFBD>K<EFBFBD><04> <0B><1C>T<EFBFBD>[<5B>[<5B>)<29><04><08>)<29><1C>$<24><0F> 0<><1D>$&<26><04>!<21> "<22><04><1D><1E><04><1A>"&<26><04><1F><1C><04> <0A><1E><04><19><00>response<73>returnc<00><00>URRU5nURSS5n[SU35 US:XaUR X5$US:XaUR X5$US:XaUR X5$[SUS35 UR X5$![a_n[S[U5S 35 [U5nU(aUR US
U05sS nA$UR U05sS nA$S nAff=f) u<>
统一处理LLM响应判断行动类型并执行相应操作
Args:
response: LLM的响应内容
Returns:
处理结果字典
<EFBFBD>action<6F> generate_codeu🎯 检测到动作: <20>analysis_complete<74>collect_figuresu⚠️ 未知动作类型: u按generate_code处理u⚠️ 解析响应失败: u.尝试提取代码并按generate_code处理<E5A484>codeN)
r<00>parse_yaml_response<73>get<65>print<6E>_handle_analysis_complete<74>_handle_collect_figures<65>_handle_generate_code<64> Exception<6F>strr )r"r'<00> yaml_datar*<00>e<>extracted_codes r#<00>_process_response<73>#DataAnalysisAgent._process_responseAs <00><00> <<3C><1C><08><08>4<>4<>X<EFBFBD>><3E>I<EFBFBD><1E>]<5D>]<5D>8<EFBFBD>_<EFBFBD>=<3D>F<EFBFBD> <11>*<2A>6<EFBFBD>(<28>3<> 4<><15>,<2C>,<2C><1B>5<>5<>h<EFBFBD>J<>J<><17>,<2C>,<2C><1B>3<>3<>H<EFBFBD>H<>H<><17>?<3F>*<2A><1B>1<>1<>(<28>F<>F<><15>3<>F<EFBFBD>8<EFBFBD>;T<>U<>V<><1B>1<>1<>(<28>F<>F<><46><18> <<3C> <11>/<2F><03>A<EFBFBD><06>x<EFBFBD>7e<37>f<> g<>7<><08>A<>N<EFBFBD><1D><1C>2<>2<>8<EFBFBD>f<EFBFBD>n<EFBFBD>=U<>V<>V<><17>-<2D>-<2D>h<EFBFBD><02>;<3B> ;<3B><>  <<3C>s<<00>AB"<00>B"<00>+B"<00>B"<00>"
D <03>,=D<03>)D <03>/D<03>D <03>D r7c<00>J<00>[S5 URSS5nSUUSS.$)u处理分析完成动作u✅ 分析任务完成<E5AE8C> final_reportu分析完成无最终报告r,F)r*r=r'<00>continue)r1r0)r"r'r7r=s r#r2<00>+DataAnalysisAgent._handle_analysis_completecs4<00><00> <0E>&<26>'<27> <20>}<7D>}<7D>^<5E>5U<35>V<> <0C>)<29>(<28> <20><1D> 
<EFBFBD>
r&c <00><><00>[S5 URS/5n/nUGH5nURSS5nUS:waSUS3nOSnURSU5nURS S
5n URS S
5n
URS S
5n [S USU35 [SU 35 [SU
35 [SU 35 URUUU U
U S.5 U (aL[RR U 5(a([SU 35 URUUU U
U S.5 GMU (a[SU 35 GM*[S5 GM8 SUUSS.$)u处理图片收集动作u📊 开始收集图片<E59BBE>figures_to_collect<63> figure_numberu未知<E69CAA>figure_z.pngzfigure_unknown.png<6E>filename<6D> file_pathr<00> description<6F>analysisu📈 收集图片 z: u 📂 路径: u 📝 描述: u 🔍 分析: )rBrDrErFrGu ✅ 文件存在: u ⚠️ 文件不存在: u ⚠️ 未提供文件路径r-T)r*<00>collected_figuresr'r>)r1r0<00>append<6E>os<6F>path<74>exists) r"r'r7rArH<00> figure_inforB<00>default_filenamerDrErFrGs r#r3<00>)DataAnalysisAgent._handle_collect_figuresps<><00><00> <0E>'<27>(<28>&<26>]<5D>]<5D>+?<3F><12>D<><1A><1E><19>-<2D>K<EFBFBD>'<27>O<EFBFBD>O<EFBFBD>O<EFBFBD>X<EFBFBD>F<>M<EFBFBD><1C><08>(<28>%,<2C>]<5D>O<EFBFBD>4<EFBFBD>#@<40> <20>#7<> <20>"<22><EFBFBD><EFBFBD>z<EFBFBD>3C<33>D<>H<EFBFBD>#<23><0F><0F> <0B>R<EFBFBD>8<>I<EFBFBD>%<25>/<2F>/<2F>-<2D><12><<3C>K<EFBFBD>"<22><EFBFBD><EFBFBD>z<EFBFBD>2<EFBFBD>6<>H<EFBFBD> <11>&<26>}<7D>o<EFBFBD>R<EFBFBD><08>z<EFBFBD>B<> C<> <11>$<24>Y<EFBFBD>K<EFBFBD>0<> 1<> <11>$<24>[<5B>M<EFBFBD>2<> 3<> <11>$<24>X<EFBFBD>J<EFBFBD>/<2F> 0<> <1E> $<24> $<24>%2<> (<28>!*<2A>#.<2E> (<28> <12> <0E><19>R<EFBFBD>W<EFBFBD>W<EFBFBD>^<5E>^<5E>I<EFBFBD>6<>6<><15>-<2D>i<EFBFBD>[<5B>9<>:<3A>!<21>(<28>(<28>)6<>$,<2C>%.<2E>'2<>$,<2C> <16><12><1D><19>7<> <09>{<7B>C<>D<><19>;<3B>=<3D>].<2E>b(<28>!2<> <20><1C> 
<EFBFBD>
r&c<00><><00>URSS5nU(d [U5nU(a`UR5nURS5(a:SSKnUR SSU5nUR SSU5nUR5nU(aV[ SU35 [ S 5 URRU5n[U5n[ S
U35 S UUUUS S .$[ S5 SSUS S.$)u!处理代码生成和执行动作r.rz```rNz^```[a-zA-Z]*\nz\n```$u🔧 执行代码:
z(----------------------------------------u📋 执行反馈:
r+T)r*r.<00>result<6C>feedbackr'r>uF⚠️ 未从响应中提取到可执行代码要求LLM重新生成<E7949F>invalid_responseu响应中缺少可执行代码)r*<00>errorr'r>)
r0r <00>strip<69>
startswith<EFBFBD>re<72>subr1r <00> execute_coder)r"r'r7r.rWrQrRs r#r4<00>'DataAnalysisAgent._handle_generate_code<64>s<00><00>
<19>}<7D>}<7D>V<EFBFBD>R<EFBFBD>(<28><04><14>-<2D>h<EFBFBD>7<>D<EFBFBD> <10><17>:<3A>:<3A><<3C>D<EFBFBD><13><EFBFBD><EFBFBD>u<EFBFBD>%<25>%<25><19><19>v<EFBFBD>v<EFBFBD>0<>"<22>d<EFBFBD>;<3B><04><19>v<EFBFBD>v<EFBFBD>i<EFBFBD><12>T<EFBFBD>2<><04><1B>z<EFBFBD>z<EFBFBD>|<7C><04> <0F> <11>(<28><14><06>/<2F> 0<> <11>(<28>O<EFBFBD><1A>]<5D>]<5D>/<2F>/<2F><04>5<>F<EFBFBD>/<2F>v<EFBFBD>6<>H<EFBFBD> <11>(<28><18>
<EFBFBD>3<> 4<>*<2A><1C> <20>$<24>$<24> <20> <0E> <0E> <12>Z<> [<5B>,<2C>9<>$<24> <20> <0E> r&<00>
user_input<EFBFBD>filesrc<00><> <00>/Ul/UlSUlSnU(aX0lO[ UR
U5Ul[ UR5UlURRSUR5 SnU(a![S5 [U5n[S5 XPl SU3nU(aUSSRU53- nU(a US US
3- n[S 5 [S U35 U(a[S SRU535 [SUR35 [SUR35 UR(a[SURS35 [S5 URRSUS.5 URUR:Ga<>U=RS- sl[SURS35 URR!5n["R$"US9n[SUSSS35 [SSU;35 UR&R)UR+5US9n [S U 35 UR-U 5n
U
R/S!5S":Xa(US- n[S#US$35 US%:<3A>a [S&5 GO<>OSnUR(d$U
R/S'S(5(d [S)5 GOZURRS*U S.5 U
S!S+:Xa~U
R/S,S5n URRSS-U 3S.5 URRURU
R/S.S5U
R/S/05U S0.5 O<>U
S!S1:Xa<>U
R/S2/5n U
R/S3/5n S4[1U 5S53n U (aU S6U 3- n URRSS7U S83S.5 URRURS1U U U S9.5 URUR:aGM<>URUR:<3A>a[S>URS?35 UR75$![2aHnS:[5U53n[S;U35 URRSS<US=3S.5 SnAN<>SnAff=f)@u<>
开始分析流程
Args:
user_input: 用户的自然语言需求
files: 数据文件路径列表
session_output_dir: 指定的会话输出目录(可选)
Returns:
分析结果字典
rrru 🔍 正在生成数据画像...u✅ 数据画像生成完毕u用户需求: u
数据文件: z, <20>
u<EFBFBD>
请根据上述【数据画像】中的统计信息如高频值、缺失率、数据范围来制定分析策略。如果发现明显的高频问题或异常分布请优先进行深度分析。u🚀 开始数据分析任务u📝 用户需求: u📁 数据文件: <20>📂 输出目录: u🔢 最大轮数: u⚡ 强制模式: 将运行满 u忽略AI完成信号z<============================================================<3D>user)<02>role<6C>content<6E>u
🔄 第 u
轮分析)<01>notebook_variablesu!🐛 [DEBUG] System Prompt Head:
Ni<EFBFBD>z ...
[...]u@🐛 [DEBUG] System Prompt Rules Check: 'stop_words' in prompt? <20>
stop_words)<02>prompt<70> system_promptu🤖 助手响应:
r*rSu⚠️ 连续失败次数: z/3<>uS❌ 连续3次无法获取有效响应分析终止。请检查网络或配置。r>Tu
✅ 分析完成<E68890> assistantr+rRu代码执行反馈:
r.rQ)<04>roundr.rQr'r-rH<00>missing_figuresu
已收集 u 个有效图片及其分析。uR
⚠️ 以下图片未找到,请检查代码是否成功保存了这些图片: u图片收集反馈:
u
请继续下一步分析。)rjr*rHrkr'uLLM调用错误: u❌ u发生错误: u请重新生成代码。u
⚠️ 已达到最大轮数 (u),分析结束)rrrrrrr r <00> set_variabler1r
r!<00>joinrrrI<00>get_environment_infor<00>formatr<00>call<6C>_build_conversation_promptr:r0<00>lenr5r6<00>_generate_final_report)r"r[r\r<00>consecutive_failuresr!<00>initial_promptrd<00>formatted_system_promptr'<00>process_resultrRrHrkr8<00> error_msgs r#<00>analyze<7A>DataAnalysisAgent.analyze<7A>s=<00><00>%'<27><04>!<21> "<22><04><1D><1E><04><1A> <20><1C> <1E>'9<> $<24>&?<3F><14>$<24>$<24>j<EFBFBD>'<0E>D<EFBFBD> #<23> %<25>T<EFBFBD>%<<3C>%<<3C>=<3D><04> <0A> <0A> <0A> <0A>"<22>"<22>#7<><14>9P<39>9P<39>Q<><1A> <0C> <10> <11>4<> 5<>0<><15>7<>L<EFBFBD> <11>0<> 1<>)<29><19>,<2C>J<EFBFBD><<3C>:<3A><0E> <10> <1A> 0<><14><19><19>5<EFBFBD>1A<31>0B<30>C<> C<>N<EFBFBD> <17> <1A><04>\<5C>N<EFBFBD>3@<04>A<04> A<04>N<EFBFBD> <0A>-<2D>/<2F> <0A>#<23>J<EFBFBD><<3C>0<>1<> <10> <11>'<27><04> <09> <09>%<25>(8<>'9<>:<3A> ;<3B> <0A>#<23>D<EFBFBD>$;<3B>$;<3B>#<<3C>=<3D>><3E> <0A>#<23>D<EFBFBD>O<EFBFBD>O<EFBFBD>#4<>5<>6<> <0F> <20> <20> <11>3<>D<EFBFBD>O<EFBFBD>O<EFBFBD>3D<33>Db<44>c<> d<> <0A>h<EFBFBD><0F> <0C>!<21>!<21>(<28>(<28>&<26>^<5E>)T<>U<><12> <20> <20>4<EFBFBD>?<3F>?<3F>2<> <10> <1E> <1E>!<21> #<23> <1E> <11>K<EFBFBD><04> 2<> 2<>3<>:<3A>><3E> ?<3F>^ <12>%)<29>]<5D>]<5D>%G<>%G<>%I<>"<22>+F<01>*L<>*L<>'9<>+<12>'<27><16>:<3A>;R<>SW<53>TW<54>;X<>:Y<>Yc<59>d<>e<><15>X<>Ye<59>jA<02>ZA<02>YB<02>C<02>D<02><1F>8<EFBFBD>8<EFBFBD>=<3D>=<3D><1F>:<3A>:<3A><<3C>"9<>)<29><12><08>
<16>,<2C>X<EFBFBD>J<EFBFBD>7<>8<>"&<26>!7<>!7<><08>!A<><0E>"<22>%<25>%<25>h<EFBFBD>/<2F>3E<33>E<>(<28>A<EFBFBD>-<2D>(<28><19>7<>8L<38>7M<37>R<EFBFBD>P<>Q<>+<2B>q<EFBFBD>0<><1D> s<>u<><1D>1<>,-<2D>(<28><1B>,<2C>,<2C>^<5E>5G<35>5G<35><1E><04>6<12>6<12><1A>1<>3<><19><15>)<29>)<29>0<>0<>(<28>X<EFBFBD>><3E><12>
"<22>(<28>+<2B><EFBFBD>><3E>-<2D>1<>1<>*<2A>b<EFBFBD>A<>H<EFBFBD><18>-<2D>-<2D>4<>4<>!'<27>6K<36>H<EFBFBD>:<3A>4V<34>W<><16>
<19>)<29>)<29>0<>0<>%)<29>%7<>%7<>$2<>$6<>$6<>v<EFBFBD>r<EFBFBD>$B<>&4<>&8<>&8<><18>2<EFBFBD>&F<>(0<> <1A><16>$<24>H<EFBFBD>-<2D>1B<31>B<>(6<>(:<3A>(:<3A>;N<>PR<50>(S<>%<25>&4<>&8<>&8<>9J<39>B<EFBFBD>&O<>O<EFBFBD>!+<2B>C<EFBFBD>0A<30>,B<>+C<>Cb<43>c<>H<EFBFBD>&<26> <20>&y<>{J<02>zK<02>%L<02>L<02><08><18>-<2D>-<2D>4<>4<>$*<2A>)><3E>x<EFBFBD>j<EFBFBD>He<48>'f<><1A><16><19>)<29>)<29>0<>0<>%)<29>%7<>%7<>&7<>1B<31>/><3E>(0<> <1A> <16>_<13> <20> <20>4<EFBFBD>?<3F>?<3F>2<>H <10> <1D> <1D><14><1F><1F> 0<> <11>4<>T<EFBFBD>_<EFBFBD>_<EFBFBD>4E<34>EU<45>V<> W<><13>*<2A>*<2A>,<2C>,<2C><><1D> <12>/<2F><03>A<EFBFBD><06>x<EFBFBD>8<> <09><15><04>Y<EFBFBD>K<EFBFBD>(<28>)<29><14>)<29>)<29>0<>0<> &<26>%3<>I<EFBFBD>;<3B>>Y<>#Z<><16><12><12><> <12>s-<00>.CR<00>6R<00>:B$R<00>BR<00>
S)<03>!>S$<03>$S)c<00><><00>/nURH=nUSnUSnUS:XaURSU35 M)URSU35 M? SRU5$)u构建对话提示词rarbr`u用户: u助手: r^)rrIrm)r"<00> prompt_parts<74>msgrarbs r#rq<00>,DataAnalysisAgent._build_conversation_prompt<70>sk<00><00><19> <0C><17>,<2C>,<2C>C<EFBFBD><16>v<EFBFBD>;<3B>D<EFBFBD><19>)<29>n<EFBFBD>G<EFBFBD><13>v<EFBFBD>~<7E><1C>#<23>#<23>h<EFBFBD>w<EFBFBD>i<EFBFBD>$8<>9<><1C>#<23>#<23>h<EFBFBD>w<EFBFBD>i<EFBFBD>$8<>9<> -<2D><16>{<7B>{<7B><<3C>(<28>(r&c<00><><00>/nURH;nURS5S:XdMURURS/55 M= [S5 [SUR35 [SUR
35 [S[ U5S35 URU5nURRUS S
S 9nURRU5nURS5S :XaURS U5nOSU;dSU;a[S5 UnOSn[S5 [RRURS5n[!USSS9n U R#U5 SSS5 [SU35 URUR
URUUR$UUS.$![an[SUS35 UnSnAN<>SnAff=f![a/n[S[U535 S[U53nSnAN<>SnAff=f!,(df  N<>=f![a!n[S[U535 SnAN<>SnAff=f)u生成最终分析报告r*r-rHu'
📊 开始生成最终分析报告...r_u🔢 总轮数: u📈 收集图片: u 个u<E4B8AA>你将会接收到一个数据分析任务的最终报告请求请根据提供的分析结果和图片信息生成完整的分析报告。i@)rfrg<00>
max_tokensr,r=z# z## uR⚠️ 未检测到标准YAML动作但内容疑似Markdown报告直接采纳uLLM未返回有效报告内容u⚠️ YAML解析失败 (u()直接使用原始响应作为报告Nu✅ 最终报告生成完成u!❌ 生成最终报告时出错: u报告生成失败: u最终分析报告.md<6D>wzutf-8)<01>encodingu📄 最终报告已保存至: u❌ 保存报告文件失败: )r<00> total_roundsrrHrr=<00>report_file_path)rr0<00>extendr1rrrr<00>_build_final_report_promptrrpr/r5r6rJrKrm<00>open<65>writer)
r"<00> all_figuresrQ<00>final_report_promptr'r7<00>final_report_contentr8r<><00>fs
r#rs<00>(DataAnalysisAgent._generate_final_report<72>sd<00><00><19> <0B><1A>+<2B>+<2B>F<EFBFBD><15>z<EFBFBD>z<EFBFBD>(<28>#<23>'8<>8<><1B>"<22>"<22>6<EFBFBD>:<3A>:<3A>.A<>2<EFBFBD>#F<>G<>,<2C> <0E>8<>:<3A> <0A>#<23>D<EFBFBD>$;<3B>$;<3B>#<<3C>=<3D>><3E> <0A> <20><14>!3<>!3<> 4<>5<>6<> <0A>#<23>C<EFBFBD> <0B>$4<>#5<>T<EFBFBD>:<3A>;<3B>#<23>=<3D>=<3D>k<EFBFBD>J<><1B>" C<01><1B>x<EFBFBD>x<EFBFBD>}<7D>}<7D>*<2A>n<02> <20>%<25><0E>H<EFBFBD> 0<> <20>H<EFBFBD>H<EFBFBD>8<>8<><18>B<> <09><1D>=<3D>=<3D><18>*<2A>.A<>A<>,5<>M<EFBFBD>M<EFBFBD>.<2E>(<28>,S<>)<29>
<1C>x<EFBFBD>'<27>5<EFBFBD>H<EFBFBD>+<<3C><1D>r<>s<>/7<>,<2C>/O<>,<2C> <12>0<> 1<><1E>7<EFBFBD>7<EFBFBD><<3C><<3C><04>(?<3F>(?<3F>AX<41>Y<><18> =<3D><15>&<26><03>g<EFBFBD>><3E>!<21><11><07><07>,<2C>-<2D>?<3F> <11>3<>4D<34>3E<33>F<> G<> #'<27>"9<>"9<> <20>.<2E>.<2E> $<24> 5<> 5<>!,<2C>$(<28>$=<3D>$=<3D>0<> 0<>
<EFBFBD>
<EFBFBD><EFBFBD>+<1D> 0<><15>1<>!<21><13>4\<5C>]<5D>^<5E>'/<2F>$<24><> 0<><30><19> C<01> <11>5<>c<EFBFBD>!<21>f<EFBFBD>X<EFBFBD>><3E> ?<3F>%9<>#<23>a<EFBFBD>&<26><18>#B<> <20><> C<01><>?<3F>><3E><><19> =<3D> <11>2<>3<EFBFBD>q<EFBFBD>6<EFBFBD>(<28>;<3B> <<3C> <<3C><> =<3D>s<EFBFBD><00>3G2<00>AG
<00>G2<00>G
<00>+G2<00>,G
<00>. G2<00>% H?<00>0H.<03>H?<00>
G/<03>G*<03>%G2<00>*G/<03>/G2<00>2
H+<03><%H&<03>&H+<03>.
H<<07>8H?<00>?
I*<03> I%<03>%I*r<>c<00><><00>SnU(atSn[US5Haup4URSS5nSU3nX#SUS3- nUS US3- nUS
URS S 5S3- nUS URSS5S3- nMc OSnSnSnURH<>n U RS5S:wdMU RS5(dM2U RS05n
U
RS5(dM\US- nUSUS3- nU
RS5(dM<>USU
RS5SSS3- nM<> [R"UR
UR URUUS9n U S- n U $)u*构建用于生成最终报告的提示词ru
生成的图片及分析:
rcrDu未知文件名z./z. <20>
u 相对路径: u 描述: rFu 无描述u 分析: rGu 无分析r^u
本次分析未生成图片。
rr*r-r.rQ<00>successu
代码块 u: 执行成功
<EFBFBD>outputu输出: N)rrr!<00>figures_summary<72>code_results_summaryu7
📁 **图片路径使用说明**
报告和图片都在同一目录下,请在报告中使用相对路径引用图片:
- 格式:![图片描述](./图片文件名.png)
- 示例:![营业总收入趋势](./营业总收入趋势.png)
- 这样可以确保报告在不同环境下都能正确显示图片
)<08> enumerater0rrrorrr!) r"r<>r<><00>i<>figurerD<00> relative_pathr<68><00>success_code_countrQ<00> exec_resultrfs r#r<><00>,DataAnalysisAgent._build_final_report_prompt<70>s<><00><00><1D><0F> <16>=<3D>O<EFBFBD>&<26>{<7B>A<EFBFBD>6<> <09><01>!<21>:<3A>:<3A>j<EFBFBD>2C<32>D<><08>"$<24>X<EFBFBD>J<EFBFBD><0F> <0A><1F>S<EFBFBD><02>8<EFBFBD>*<2A>B<EFBFBD>#7<>7<><0F><1F>%6<>}<7D>o<EFBFBD>R<EFBFBD>#H<>H<><0F><1F>[<5B><16><1A><1A>M<EFBFBD>;<3B>1W<31>0X<30>XZ<58>#[<5B>[<5B><0F><1F>[<5B><16><1A><1A>J<EFBFBD> <0B>1T<31>0U<30>UY<55>#Z<>Z<><0F>7<>C<01>O<EFBFBD> "<22><1C><1E><1A><1A>+<2B>+<2B>F<EFBFBD><15>z<EFBFBD>z<EFBFBD>(<28>#<23>'8<>8<>V<EFBFBD>Z<EFBFBD>Z<EFBFBD><06>=O<>=O<>$<24>j<EFBFBD>j<EFBFBD><18>2<EFBFBD>6<> <0B><1E>?<3F>?<3F>9<EFBFBD>-<2D>-<2D>&<26>!<21>+<2B>&<26>(<28>j<EFBFBD>9K<39>8L<38>L\<5C>,]<5D>]<5D>(<28>"<22><EFBFBD><EFBFBD>x<EFBFBD>0<>0<>,<2C>&<26>{<7B><EFBFBD><EFBFBD>x<EFBFBD>'@<40><11>'C<>&D<>D<EFBFBD>I<><1A>,<2C>,<2C>,<2C>2<>2<><1E>,<2C>,<2C>#<23>6<>6<><1D>*<2A>*<2A>+<2B>!5<> 
<EFBFBD><06> <0F><04> <04><06><16> r&c<00>b<00>/Ul/UlSUlURR 5 g)u重置智能体状态rN)rrrr <00>reset_environment)r"s r#<00>reset<65>DataAnalysisAgent.resets*<00><00>$&<26><04>!<21> "<22><04><1D><1E><04><1A> <0C> <0A> <0A>'<27>'<27>)r&) rrrrrr!r rrrr)N<>outputs<74>F)NN)<17>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__<5F>__doc__r r6<00>int<6E>boolr$rrr:r2r3r4rryrqrsr<>r<><00>__static_attributes__<5F>r&r#rrsg<00><00><08>!%<25>#<23><1C>!&<26> <1F><1D><1F><18><1F><18> <1F>
<1F> <1F>: <<3C>#<23> <<3C>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E> <<3C>D 
<EFBFBD><1B> 
<EFBFBD>(,<2C>S<EFBFBD>#<23>X<EFBFBD><0E> 
<EFBFBD> <0A>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E> 
<EFBFBD>>
<EFBFBD><1B>>
<EFBFBD>(,<2C>S<EFBFBD>#<23>X<EFBFBD><0E>>
<EFBFBD> <0A>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E>>
<EFBFBD>@1<0E><1B>1<0E>(,<2C>S<EFBFBD>#<23>X<EFBFBD><0E>1<0E> <0A>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E>1<0E>ff-<2D>#<23>f-<2D>d<EFBFBD>3<EFBFBD>i<EFBFBD>f-<2D>TW<54>f-<2D>cg<63>hk<68>mp<6D>hp<68>cq<63>f-<2D>P )<29>C<EFBFBD> )<29>F
<EFBFBD><04>S<EFBFBD>#<23>X<EFBFBD><0E>F
<EFBFBD>P3<16>d<EFBFBD>4<EFBFBD><03>S<EFBFBD><08>><3E>6J<36>3<16>s<EFBFBD>3<16>j*r&r)r<>rJ<00>json<6F>yaml<6D>typingrrrr<00>utils.create_session_dirr<00>utils.format_execution_resultr<00>utils.extract_coder <00>utils.data_loaderr
<00>utils.llm_helperr <00>utils.code_executorr <00>config.llm_configr <00>promptsrrrr<>r&r#<00><module>r<>s?<00><01><04>
<EFBFBD> <0B> <0B>,<2C>,<2C>><3E>A<>9<>3<>&<26>,<2C>'<27>K<>B*<2A>B*r&