LangChain Agent 基础入门:LLM 外部工具调用
深入解析了 LLM 大模型结合外部工具的 Agent 机制。通过 LangChain 框架,利用 ReAct 模式实现推理与行动协同,解决了大模型知识时效性和幻觉问题。内容涵盖 Agent 核心原理、ReAct 工作流详解,并提供 OpenAI、文心一言及智谱 AI 的集成代码示例,演示了搜索与计算工具的实际应用,同时总结了最佳实践与常见问题解决方案。

深入解析了 LLM 大模型结合外部工具的 Agent 机制。通过 LangChain 框架,利用 ReAct 模式实现推理与行动协同,解决了大模型知识时效性和幻觉问题。内容涵盖 Agent 核心原理、ReAct 工作流详解,并提供 OpenAI、文心一言及智谱 AI 的集成代码示例,演示了搜索与计算工具的实际应用,同时总结了最佳实践与常见问题解决方案。

大语言模型(LLM)虽然具备强大的生成能力,但其知识训练数据存在时间局限性。当面对实时信息或需要精确计算的任务时,单纯依赖模型内部参数容易产生幻觉或无法回答。为了解决这一问题,可以结合本地知识库、在线搜索 API 或数学计算工具来增强模型能力。这些不属于大模型内部数据的资源被称为外部工具。
LangChain 框架提供了 Agent(代理)模块,使得大模型能够感知环境并调用外部工具,从而完成复杂任务。
当大模型无法仅凭自身数据准确回复时,可能会产生一本正经的胡说八道。此时引入 Agent,可以让模型在遇到知识盲区时主动调用外部工具获取信息。
Agent 系统支持多智能体协作,即一个 Agent 的输出可以作为另一个 Agent 的输入。在这种架构下:
人类在日常行为中通常遵循'边观察、边思考,然后再行动'的模式。ReAct(Reasoning + Acting)框架的核心思想正是行动和推理的协同,将人类学习新任务并作出决策或再推理的能力赋予 LLM。
以寻找胡椒瓶为例,LLM 会经历以下循环:
LangChain 中的 Agent 类对 ReAct 逻辑进行了封装和实现,开发者无需手动编写循环逻辑。
本示例演示如何使用 Agent 让 LLM 找到大蒜的当前价格,并根据加价 20% 的逻辑计算售价。
首先确保安装了必要的库。SerpAPI 是 Google 的搜索工具,用于查找实时价格。
!pip install langchain
!pip install openai
!pip install google-search-results
需要在环境变量中设置 OpenAI 和 SerpAPI 的密钥。
import os
os.environ["OPENAI_API_KEY"] = "Your_OpenAI_API_Key"
os.environ["SERPAPI_API_KEY"] = "Your_SerpAPI_API_Key"
加载 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
创建 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
)
运行 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 也需要自定义 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。
在 Agent 任务中,建议将 temperature 设置为 0 或较低值。Agent 需要遵循确定的逻辑流程,过高的随机性可能导致工具调用顺序混乱。
并非所有工具都适合所有场景。例如,llm-math 适合简单算术,复杂数学问题建议使用 Wolfram Alpha 插件。serpapi 适合实时信息,但需注意隐私合规。
Agent 可能会陷入死循环(如反复调用同一工具)。建议在 initialize_agent 时设置 max_iterations 限制最大步数,防止 Token 耗尽。
在使用非 OpenAI 模型时,务必确保自定义类实现了 generate 或 call 方法,且返回格式符合 LangChain 预期。同时注意模型的上下文窗口大小,长对话可能需要分段处理。
通过 LangChain 的 Agent 模块,开发者可以将大模型从单纯的文本生成器转变为能够感知环境、调用工具的自主智能体。ReAct 框架提供了清晰的推理路径,而多样化的工具链则扩展了模型的能力边界。在实际应用中,结合合适的模型与工具,可以构建出解决复杂现实问题的 AI 应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online