☰
InternLM2.5-Chat Agent 实战:用 Lagent 构建代码解释器智能体并在 MATH 上进行推理与评估
2026/10/6 7:42:48 网站建设 项目流程
  • 大模型
  • 人工智能
  • 基础模型
  • AI Agent

【免费下载链接】InternLM

Official release of InternLM series (InternLM, InternLM2, InternLM2.5, InternLM3).

项目地址:https://gitcode.com/gh_mirrors/in/InternLM
点击查看免费下载

本指南以 agent/README.md 为核心,系统讲解如何基于 InternLM2.5-Chat 强大的代码解释器与工具调用能力,使用 Lagent 框架构建智能体(Agent),并在 MATH 数学基准上完成端到端的推理与自动化评估。读完本文,你将掌握依赖环境的搭建、ReAct 智能体的构建方法、streaming_inference.py全部命令行参数的语义,以及推理结果 jsonl 文件的结构与二次评估的完整流程。

背景:InternLM2.5-Chat 的 Agent 能力

InternLM2.5-Chat 于 2024 年 6 月 30 日开源,在代码解释器(code interpreter)和通用工具调用方面的能力得到进一步提升。它具备更强、更具泛化性的指令理解、工具筛选与结果反思(reflection)能力,可以更可靠地支持复杂智能体的搭建,支持对工具进行有效的多轮调用,从而完成较复杂的任务。在配合代码解释器的条件下,InternLM2.5-Chat 在 MATH 基准上可以达到与 GPT-4 相仿的水平;基于在数理和工具方面强大的基础能力,它还提供了实用的数据分析能力。

这与 model_cards/internlm2.5_7b.md 中关于 InternLM2.5-Chat 的描述相互印证:其通过监督微调(SFT)和在线 RLHF 对齐,在指令遵循、聊天体验和函数调用(function calling)方面表现更佳,被推荐用于下游应用。

数学代码解释器上的评测结果

以下是 InternLM2.5-Chat 在 MATH 测试集上使用数学代码解释器(Tool-Integrated)的评测结果:

模型是否集成工具MATH
InternLM2-Chat-7Bw/45.1
InternLM2-Chat-20Bw/51.2
InternLM2.5-7B-Chatw/63.0
gpt-4-0125-previeww/o64.2

可以看到,同为 7B 量级,InternLM2.5-7B-Chat 相比上一代 InternLM2-Chat-7B 提升了近 18 个百分点,体现了 Agent 范式 + 代码解释器对数学推理能力的大幅增益。需要说明的是,表中的 gpt-4-0125-preview 未集成工具,仅作为参考基线。

准备工作:安装依赖

仓库的 agent/requirements.txt 集中列出了运行 Agent 推理与评测所需的全部依赖:

pip install -r requirements.txt

该文件的关键依赖及其作用如下:

  • lagent @ git+https://github.com/InternLM/lagent@main:核心 Agent 框架,直接从 Lagent 仓库 main 分支安装;
  • lmdeploy>=0.2.2:LMDeploy 推理引擎后端,用于高效的流式推理与张量并行部署;
  • datasets:用于加载 MATH、GSM8K 等 HuggingFace 数据集;
  • jsonlines:读写 jsonl 格式的推理结果文件;
  • sympy==1.12:用于对模型输出的数学表达式做符号化简与等价性判定;
  • pebble:基于进程池的并发库,评估阶段用于并行计算得分;
  • numpy、tqdm:数值运算与进度条展示;
  • antlr4-python3-runtime==4.11.0、einops:LMDeploy 及模型运行时的配套依赖。

如果你希望直接复用文档中的 ReAct 示例代码,还需要自行安装streamlit(网页 Demo 用)以及 Lagent 对 HuggingFace 后端的可选依赖(见下文)。

用 Lagent 构建 InternLM2.5-Chat 智能体

agent/lagent.md 给出了 Lagent 的基本用法。Lagent 是一个轻量级、开源的基于大语言模型的智能体框架,支持快速将一个大语言模型转变为多种类型的智能体,并提供了一些典型工具(如搜索引擎、Python 解释器)为模型赋能。

安装 Lagent

通过 pip 安装(推荐):

pip install lagent

如果你希望修改框架源码,也可以从源码安装:

git clone https://github.com/InternLM/lagent.git cd lagent pip install -e .

注意:若需要运行 HuggingFace 模型(HFTransformer),请先执行pip install -e .[all]安装完整依赖。

构建一个 ReAct 智能体

下面的示例演示了如何用 InternLM2.5-Chat 构建一个同时具备搜索引擎和 Python 解释器能力的 ReAct 智能体:

# 导入 lagent 库中必要的模块与类 from lagent.agents import ReAct from lagent.actions import ActionExecutor, GoogleSearch, PythonInterpreter from lagent.llms import HFTransformer # 初始化基于 HFTransformer 的大语言模型,并指定模型名称 llm = HFTransformer('internlm/internlm2_5-7b-chat') # 初始化 Google 搜索工具,并传入你的 API Key search_tool = GoogleSearch(api_key='Your SERPER_API_KEY') # 初始化 Python 解释器工具 python_interpreter = PythonInterpreter() # 通过配置 ReAct agent 创建聊天机器人 chatbot = ReAct( llm=llm, # 传入大语言模型实例 action_executor=ActionExecutor( actions=[search_tool, python_interpreter] # 指定聊天机器人可执行的动作 ), ) # 向聊天机器人提出一个 LaTeX 格式的数学问题 response = chatbot.chat('若$z=-1+\sqrt{3}i$,则$\frac{z}{{z\overline{z}-1}}=\left(\ \ \right)$') # 打印聊天机器人的回答 print(response.response) # 输出智能体生成的回答 >>> $-\frac{1}{3}+\frac{\sqrt{3}}{3}i$

该示例清晰展示了 Lagent 的三层组合方式:llm负责生成推理与决策、ActionExecutor统一调度工具、actions列表声明可用工具集合。模型内部以 ReAct(Reasoning + Acting)循环的方式,交替输出自然语言推理和工具调用指令。

运行 ReAct 网页 Demo

Lagent 还提供了一个基于 Streamlit 的网页版交互 Demo,可方便地在浏览器中体验智能体对话:

# 需要先安装 streamlit # pip install streamlit streamlit run examples/react_web_demo.py

streaming_inference.py:全参数解析

agent/streaming_inference.py 是本仓库的核心推理与评估脚本。其逻辑源于 Microsoft 的 ToRA 项目(脚本头部有版权声明),通过 Lagent 的Internlm2Agent驱动模型在 MATH 测试集上"逐步推理 + 编写并执行 Python 代码"来解题。

脚本通过argparse定义了以下参数(定义见 参数解析入口):

参数默认值说明
--backendlmdeploy使用的推理框架,可选lmdeploy或hf(HuggingFace Transformers)
--model_pathinternlm/internlm2-chat-7b模型路径或 HuggingFace 模型标识符
--output_path(必填)推理结果保存路径,必须是jsonl文件
--batch_size100Agent 推理的批大小,脚本按此切分 MATH 测试集分批处理
--max_turn5智能体与环境之间最大交互轮数,即"推理-调用工具-拿到结果"的循环次数上限
--tp1张量并行(Tensor Parallelism)数,在 LMDeploy 后端下可能需要调整
--temperature0.1下一个 token 预测的温度参数
--top_p0.8Top-P 采样概率阈值
--top_k40Top-K 采样候选数
--stop_words['<\|action_end\|>', '<\|im_end\|>']停止词列表,遇到这些 token 即停止生成,可多次追加
--max_new_tokens512单次生成的最大新 token 数
--do_infer/--no-do_inferTrue是否启动模型推理;已准备好结果文件时可关闭(BooleanOptionalAction,需 Python > 3.8)
--do_evalFalse是否对推理结果进行评估
--overwriteFalse是否覆盖已存在的结果文件

源码级说明:这些采样参数(temperature、top_p、top_k、stop_words、max_new_tokens)会在init_agent中被透传给底层模型实例;而batch_size、max_turn则分别控制数据集的分批处理规模和 Agent 的单题最大交互轮数,直接决定推理耗时与解题成功率之间的权衡。--stop_words使用action='append',意味着可重复传入多个停止词。

在 MATH 测试集上推理并评估

完整流程:推理 + 评估

运行以下脚本,即可在 MATH 测试集上执行推理并在结束后自动评估:

python streaming_inference.py \ --backend=lmdeploy \ # 对于 HuggingFace 模型使用 hf --model_path=internlm/internlm2_5-7b-chat \ --tp=1 \ --temperature=1.0 \ --top_k=1 \ --output_path=math_lmdeploy.jsonl \ --do_eval

注意:--top_k=1与--temperature=1.0组合时生成接近贪心解码(每次只取概率最高 token),有利于评测的可复现性。

内部执行流程:从数据加载到结果落盘

从 预测主流程 可以看到,脚本内部按以下步骤工作:

  1. 加载lighteval/MATH数据集的test分片;
  2. 对每条样本做预处理:记录idx,将problem复制为query,并从官方solution中通过正则提取标准答案gt(例如提取\boxed{...}中的内容);
  3. 通过init_agent构建Internlm2Agent实例,批式调用agent.batch_chat解题;
  4. 把每一步的steps(包含 language 推理、tool 调用、environment 返回)写入 jsonl 文件,并从最后一步 language 内容中提取pred;
  5. 每批处理结束后调用agent._interpreter_executor.actions['IPythonInteractiveManager'].reset()重置解释器环境,避免状态串扰;
  6. 任何异常都会被捕获并记录到该样本的error字段,保证整个测试集不会因单题失败而中断。

关键源码:Agent 与后端的初始化

init_agent(见 agent/streaming_inference.py#L507-L535)展示了两种后端的构建方式:

  • lmdeploy 后端:使用LMDeployPipeline,配合INTERNLM2_META元模板与TurbomindEngineConfig(tp=tp)配置张量并行;
  • hf 后端:使用HFTransformer,同样绑定INTERNLM2_META。

无论哪种后端,最终都封装为Internlm2Agent,其protocol=Internlm2Protocol(meta_prompt=None, interpreter_prompt=DEFAULT_PROMPT)中,DEFAULT_PROMPT就是引导模型"逐步推理并编写 Jupyter 代码解题、最终用\boxed{}输出 LaTeX 结果"的系统提示(定义于 agent/streaming_inference.py#L48-L54);interpreter_executor则挂载了支持多进程并发的IPythonInteractiveManager(max_workers=200)作为代码执行环境。

输出文件格式:jsonl 逐行结构

--output_path指定的jsonl文件每一行是一条样本的完整推理记录,形如:

{ "problem": "The midpoint of the line segment between $(x,y)$ and $(2,4)$ is $(-7,0)$. Find $(x,y)$.", "level": "Level 3", "type": "Algebra", "solution": "Applying the midpoint formula gives $$\\left(\\frac{2+x}{2},\\frac{4+y}{2}\\right)=(-7,0).$$Solving $\\frac{2+x}{2}=-7$ for $x$ and $\\frac{4+y}{2} = 0$ for $y$ we find $(x,y)$ to be $\\boxed{(-16,-4)}$.", "idx": 306, "query": "The midpoint of the line segment between $(x,y)$ and $(2,4)$ is $(-7,0)$. Find $(x,y)$.", "gt": "(-16,-4)", "pred": [ "(-16,-4)" ], "steps": [ { "role": "language", "content": "To find the coordinates of the point $(x,y)$, we can use the midpoint formula. The midpoint $M$ of a line segment with endpoints $(x_1, y_1)$ and $(x_2, y_2)$ is given by:\n\n\\[M = \\left(\\frac{x_1 + x_2}{2}, \\frac{y_1 + y_2}{2}\\right)\\]\n\nGiven that the midpoint is $(-7,0)$ and one endpoint is $(2,4)$, we can set up equations to solve for $x$ and $y$.\n\nLet's start by setting up the equations based on the midpoint formula:\n\n\\[\\frac{x + 2}{2} = -7\\]\n\\[\\frac{y + 4}{2} = 0\\]\n\nNow, let's solve these equations using Python to find the values of $x$ and $y$." }, { "role": "tool", "content": { "name": "AsyncIPythonInteractiveManager", "parameters": { "command": "```python\nfrom sympy import symbols, Eq, solve\n\n# Define symbols\nx, y = symbols('x y')\n\n# Define equations based on the midpoint formula\neq1 = Eq((x + 2)/2, -7)\neq2 = Eq((y + 4)/2, 0)\n\n# Solve equations\nsolution = solve((eq1, eq2), (x, y))\n\nsolution\n```" } }, "name": "interpreter" }, { "role": "environment", "content": "{x: -16, y: -4}", "name": "interpreter" }, { "role": "language", "content": "After solving the equations, we find that the coordinates of the point $(x,y)$ are $(-16, -4)$. Therefore, the solution to the problem is:\n\n\\[\\boxed{(-16, -4)}\\]" } ], "error": null }

这段记录完整还原了一次典型的"工具增强"推理链:

  1. language 步骤:模型用自然语言阐述解题思路;
  2. tool 步骤:模型以 JSON 形式请求调用interpreter,命令体是一段调用 sympy 求解方程的 Python 代码;
  3. environment 步骤:代码解释器实际执行后返回{x: -16, y: -4};
  4. language 步骤:模型基于执行结果组织最终回答,并用\boxed{(-16,-4)}输出标准答案。

这也印证了前面的结论:InternLM2.5-Chat 的数学能力提升,关键并不在于"死记答案",而在于它能够自主生成可执行的代码、读取解释器的执行结果并据此推理反思。

跳过推理、直接评估

如果已经生成了上述格式的结果文件,无需重新推理,直接评估即可:

python streaming_inference.py \ --output_path=math_lmdeploy.jsonl \ --no-do_infer \ --do_eval

从 主入口逻辑 可以看到两个值得注意的细节:

  • 若结果文件已存在且未指定--overwrite,脚本会自动把do_infer置为False,并提示"如需覆盖请加--overwrite标志";
  • 若同时指定了推理与评估,脚本会通过subprocess以--no-do_infer --do_eval重新调用自身来完成评估,保证两个阶段职责分离。

评估原理:数值相等与符号相等

评估环节调用math_equal(见 agent/streaming_inference.py#L372-L451),其"判定两答案相等"的核心逻辑值得展开:

  • 数值相等:若预测与标准答案都能转为浮点数,则先做isclose相对误差比较(默认容差1e-4);若开启include_percentage,还会把标准答案的 1/100、1 倍、100 倍三种形态都纳入比较,兼容百分比表述差异;
  • 文本规范化相等:对字符串做去括号、去空白等规范化后比较;
  • 符号相等:分别尝试parse_latex(解析 LaTeX)与parse_expr(解析 Python 表达式),然后通过 sympy 的simplify(a - b) == 0判断两个表达式是否恒等;若简化失败,再退化为数值近似比较(rel_tol=1e-3);
  • 超时保护:symbolic_equal在超时选项开启时会放入独立进程执行并限制 1 秒超时(见call_with_timeout),防止个别表达式化简卡死主流程。

评估输出会汇总Num samples、Num scores、Sum scores、Timeout samples、Empty samples、Mean score,并按type(如 Algebra、Geometry 等)输出分题型得分。

补充范式:PAL(Program-Aided Language Models)

仓库中的 agent/pal_inference.py 提供了另一种"让模型写代码解题"的经典范式——PAL。与 Agent 的"推理 + 工具调用 + 反思"不同,PAL 由模型一次性生成完整的solution()函数代码,再交给 Python 解释器执行得到答案,更适合 GSM8K 这类直接求解的题目:

python pal_inference.py \ <model> \ <out_dir> \ [--dataset <dataset>] \ [--max_length <length>] \ [--top_p <threshold>] \ [--eoh <end token>] \ [--eoa <end token>] \ [--eos <end token>] \ [--temperature <temp>] \ [--time_out <time>] \ [--verbose, -v] \ [--append, -a]

其中--max_length默认 2048,--top_p默认 0.8,--temperature默认 1.0,--time_out默认 100 秒(执行代码的超时上限)。其在 GSM8K 上对 InternLM-Chat-7B 的带工具/不带工具评测对比为:不使用工具 34.5,使用工具 39.2,展示了程序化求解对数学推理的稳定增益。完整参数说明可参考 agent/pal_inference_zh-CN.md。

小结与建议

围绕 agent/README.md 的技术主线,本文完整覆盖了:InternLM2.5-Chat 的 Agent 与代码解释器能力背景、Lagent 框架的安装与 ReAct 智能体构建、streaming_inference.py的每个命令行参数、MATH 推理与评估的完整执行链路,以及 jsonl 结果文件的结构解析。几个实战要点总结如下:

  1. 后端选择:追求吞吐与多卡部署优先lmdeploy,需要原生 Transformers 生态兼容时选择hf;
  2. 采样配置:评测场景建议使用确定性较高的采样参数(如--top_k=1)以获得可复现结果,探索性场景再放开温度;
  3. 断点续跑:结果文件已存在时脚本默认跳过推理,可用--overwrite强制重新推理,避免重复耗时;
  4. 结果复用:jsonl 文件包含完整 steps,既是评测数据,也是分析模型工具调用行为的第一手素材。

后续可进一步结合 model_cards 中的各模型卡片,尝试在 InternLM2.5-20B-Chat 等更大规模模型上复现评测,观察规模与工具调用能力的关系;也可以基于同样的 Agent 框架,为智能体扩展更多自定义工具以覆盖数据分析、网页检索等更复杂的任务场景。

  • 大模型
  • 人工智能
  • 基础模型
  • AI Agent

【免费下载链接】InternLM

Official release of InternLM series (InternLM, InternLM2, InternLM2.5, InternLM3).

项目地址:https://gitcode.com/gh_mirrors/in/InternLM
点击查看免费下载

相关推荐

上一篇:三步轻松下载B站视频:免费开源工具永久保存任何想看的视频内容
下一篇:英雄联盟国服换肤终极教程:5分钟学会R3nzSkin免费解锁全皮肤

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询