LangChain Agent 基础入门:LLM 外部工具调用
大语言模型(LLM)虽然具备强大的生成能力,但其知识训练数据存在时间局限性。当面对实时信息或需要精确计算的任务时,单纯依赖模型内部参数容易产生幻觉或无法回答。为了解决这一问题,可以结合本地知识库、在线搜索 API 或数学计算工具来增强模型能力。这些不属于大模型内部数据的资源被称为外部工具。
LangChain 框架提供了 Agent(代理)模块,使得大模型能够感知环境并调用外部工具,从而完成复杂任务。
Agent 是什么?
当大模型无法仅凭自身数据准确回复时,可能会产生一本正经的胡说八道。此时引入 Agent,可以让模型在遇到知识盲区时主动调用外部工具获取信息。
Agent 系统支持多智能体协作,即一个 Agent 的输出可以作为另一个 Agent 的输入。在这种架构下:
- LLM:负责生成预测、理解用户意图和处理输入文本。
- Agent:负责接口调用、文件处理、搜索策略制定及执行动作。
- 决策机制:当存在多个代理时,需要特定的框架来决定调用哪个工具,通常采用 ReAct 框架。
ReAct 框架详解
人类在日常行为中通常遵循'边观察、边思考,然后再行动'的模式。ReAct(Reasoning + Acting)框架的核心思想正是行动和推理的协同,将人类学习新任务并作出决策或再推理的能力赋予 LLM。
ReAct 工作流示例
以寻找胡椒瓶为例,LLM 会经历以下循环:
- Thought(思考):分析当前状态,决定下一步行动。
- Action(行动):选择工具并执行。
- Observation(观察):接收工具返回的结果。
- Repeat:根据观察结果继续思考,直到得出最终答案。
LangChain 中的 Agent 类对 ReAct 逻辑进行了封装和实现,开发者无需手动编写循环逻辑。
实战 Demo:大蒜价格查询与定价
本示例演示如何使用 Agent 让 LLM 找到大蒜的当前价格,并根据加价 20% 的逻辑计算售价。
核心逻辑
- 行动:在网上搜索当前成本价。
- 观察:分析搜索结果的价格高低。
- 思考:决定加价幅度。
- 行动:使用计算器计算最终售价。
1. 安装依赖
首先确保安装了必要的库。SerpAPI 是 Google 的搜索工具,用于查找实时价格。
!pip install langchain
!pip install openai
!pip install google-search-results
2. 配置 API Key
需要在环境变量中设置 OpenAI 和 SerpAPI 的密钥。
import os
os.environ["OPENAI_API_KEY"] = "Your_OpenAI_API_Key"
os.environ["SERPAPI_API_KEY"] = "Your_SerpAPI_API_Key"
3. 导入库
加载 LangChain 的工具加载器、Agent 初始化函数及 LLM 类。
# 加载工具
from langchain.agents import load_tools
# 初始化 agent 工具
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
4. 实例化 LLM 与 Agent
创建 LLM 实例,加载搜索和数学计算工具,并初始化 Agent。
llm = OpenAI(temperature=0)
# serpapi 负责搜索,llm-math 负责计算 20%
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# ZERO_SHOT_REACT_DESCRIPTION 表示使用 React 思维框架,不使用样本提示
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
5. 执行任务
运行 Agent 并传入自然语言指令。
agent.run("目前市场上大蒜子的平均价格是多少?如果我在此基础上加价 20% 卖出,应该如何定价?")
OpenAI 模型通常会输出详细的 Thought-Action-Observation 过程,并最终给出定价建议。
国产模型集成方案
原生 LangChain 主要支持 OpenAI 生态,对于文心一言、智谱 AI 等国产模型,通常需要自定义 LLM 类进行适配。
文心一言集成
需自定义 Wenxin_LLM 类继承自 LangChain 的 BaseLLM 接口。
import os
from dotenv import find_dotenv, load_dotenv
_ = load_dotenv(find_dotenv())
wenxin_api_key = os.environ.get("wenxin_api_key")
wenxin_secret_key = os.environ.get("wenxin_secret_key")
os.environ["SERPAPI_API_KEY"] = "Your_SerpAPI_API_Key"
from langchain.agents import load_tools, initialize_agent, AgentType
from wenxin_llm import Wenxin_LLM # 假设已自定义该类
llm = Wenxin_LLM(api_key=wenxin_api_key, secret_key=wenxin_secret_key)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("目前市场上大蒜子的平均价格是多少?如果我在此基础上加价 20% 卖出,应该如何定价?")
*注意:部分国产模型直接调用可能因上下文长度限制导致报错,需调整 Prompt 或截断策略。
智谱 AI 集成
类似地,智谱 AI 也需要自定义 LLM 适配器。
import os
zhipuai.api_key = "Your_Zhipu_API_Key"
os.environ["SERPAPI_API_KEY"] = "Your_SerpAPI_API_Key"
import zhipuai
from langchain.agents import load_tools, initialize_agent, AgentType
from zhipuai_llm import ZhipuAILLM # 假设已自定义该类
llm = ZhipuAILLM(model="chatglm_std", temperature=0, zhipuai_api_key=zhipuai.api_key)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("目前市场上大蒜子的平均价格是多少?如果我在此基础上加价 20% 卖出,应该如何定价?")
智谱模型通常能较好地完成搜索与计算任务,输出包含具体的 Action 和 Final Answer。
最佳实践与常见问题
1. 温度设置 (Temperature)
在 Agent 任务中,建议将 temperature 设置为 0 或较低值。Agent 需要遵循确定的逻辑流程,过高的随机性可能导致工具调用顺序混乱。
2. 工具选择
并非所有工具都适合所有场景。例如,llm-math 适合简单算术,复杂数学问题建议使用 Wolfram Alpha 插件。serpapi 适合实时信息,但需注意隐私合规。
3. 错误处理
Agent 可能会陷入死循环(如反复调用同一工具)。建议在 initialize_agent 时设置 max_iterations 限制最大步数,防止 Token 耗尽。
4. 自定义 LLM 注意事项
在使用非 OpenAI 模型时,务必确保自定义类实现了 generate 或 call 方法,且返回格式符合 LangChain 预期。同时注意模型的上下文窗口大小,长对话可能需要分段处理。
总结
通过 LangChain 的 Agent 模块,开发者可以将大模型从单纯的文本生成器转变为能够感知环境、调用工具的自主智能体。ReAct 框架提供了清晰的推理路径,而多样化的工具链则扩展了模型的能力边界。在实际应用中,结合合适的模型与工具,可以构建出解决复杂现实问题的 AI 应用。


