基于LangChain开发AI智能体:实现自主规划与多工具调用实战
传统的聊天机器人通常只能进行单轮问答,面对需要联网搜索或复杂计算的请求往往无能为力。而AI智能体(Agent)的核心优势在于“自主性”:它能理解目标,自行规划步骤,并调用合适的工具去执行。使用LangChain框架,我们可以快速搭建一个基于ReAct(Reasoning + Acting)模式的智能体,让它像人类专家一样思考并行动。

AI智能体通过感知、规划、行动和反思的循环处理复杂任务
ReAct模式要求模型在每一步输出中交替进行“思考”和“行动”。思考阶段分析当前状态并决定下一步做什么,行动阶段则调用具体工具获取信息。这种机制让大模型突破了训练数据的时效性和知识边界,能够处理动态变化的真实世界任务。
要开始构建,首先确保本地环境已安装Python 3.8+,并通过pip安装核心依赖库。我们需要langchain用于编排逻辑,langchain-openai用于连接大模型,以及duckduckgo-search作为免费的搜索工具示例。
pip install langchain langchain-openai duckduckgo-search
1. 配置基础环境与模型连接
智能体的大脑是大语言模型(LLM)。在本例中,我们使用OpenAI的GPT-3.5-turbo或GPT-4,因为它们对指令遵循和函数调用的支持较为成熟。你需要准备一个有效的API Key。
在代码中初始化ChatOpenAI实例时,建议将temperature设置为0,以确保智能体在逻辑推理和工具调用时的稳定性,避免过于发散的创意影响任务执行的准确性。
import os
from langchain_openai import ChatOpenAI
# 设置环境变量或直接传入key
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
# 初始化模型,温度设为0以保证逻辑稳定
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

1. 配置基础环境与模型连接
2. 定义智能体可调用的工具
工具是智能体感知和操作外部世界的接口。LangChain提供了许多预置工具,也可以自定义。为了演示多工具调用,我们加载两个经典工具:DuckDuckGoSearchRun用于实时联网搜索,Calculator用于执行精确数学运算。
注意,必须为每个工具提供清晰的description(描述)。智能体正是依靠这些描述来判断在什么场景下应该使用哪个工具。如果描述模糊,智能体可能会选错工具或无法识别何时该调用工具。
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
# 加载预置工具:搜索和计算器
# tool_names对应LangChain内部注册的工具名称
tools = load_tools(["ddg-search", "llm-math"], llm=llm)

使用load_tools加载搜索和计算工具的Python代码片段
这里使用的llm-math工具实际上是一个组合工具,它会将数学问题转化为Python代码执行,比单纯的文本生成更准确。而ddg-search则允许智能体访问互联网获取最新信息,弥补模型训练数据截止日期的限制。
3. 初始化ReAct智能体
有了大脑(LLM)和手脚(Tools),接下来需要将它们组装起来。LangChain提供了initialize_agent函数,通过指定AgentType.ZERO_SHOT_REACT_DESCRIPTION,我们可以创建一个零样本ReAct智能体。
“零样本”意味着不需要提供额外的示例对话,模型直接根据工具描述和当前问题进行推理。handle_parsing_errors=True参数非常重要,它能防止因模型输出格式微小偏差导致的程序崩溃,提高智能体的鲁棒性。
# 初始化智能体
agent = initialize_agent(
tools=tools,
llm=llm,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
handle_parsing_errors=True,
verbose=True # 开启详细日志,观察思考过程
)
开启verbose模式后,控制台会打印出智能体内部的完整思维链:包括它提出的中间问题、选择的工具、工具返回的结果以及最终的整合答案。这对于调试和优化智能体行为至关重要。
4. 执行复杂任务并验证效果
现在,让我们给智能体出一个需要多步推理的题目:“查询今天北京的气温,并计算如果气温下降5度后的华氏温度是多少?”
这个问题涉及两个子任务:首先是联网搜索获取实时气温(工具1),然后是单位换算和减法计算(工具2)。普通的大模型无法知道今天的实时气温,也无法保证数学计算的绝对精确,但智能体可以。
query = "查询今天北京的气温,并计算如果气温下降5度后的华氏温度是多少?"
result = agent.run(query)
print(result)

控制台显示的Thought-Action-Observation思维链日志
运行上述代码,你将看到类似以下的执行流程:
- Thought: 我需要先搜索北京今天的气温。
- Action: ddg-search ["北京今天气温"]
- Observation: 搜索结果显示北京今天气温约为20摄氏度。
- Thought: 现在我需要计算 (20 - 5) 摄氏度转换为华氏度。公式为 F = C * 9/5 + 32。
- Action: Calculator [(20 - 5) * 9 / 5 + 32]
- Observation: 59.0
- Final Answer: 北京今天气温约20摄氏度,下降5度后为15摄氏度,即59华氏度。
这种分步执行确保了每个环节都有据可依。如果搜索失败,智能体可能会尝试更换关键词重试;如果计算出错,它会重新检查公式。这就是自主规划的价值所在。
5. 优化与注意事项
在实际生产环境中,直接使用initialize_agent可能不够灵活。对于更复杂的业务逻辑,建议使用LangChain Expression Language (LCEL) 来构建自定义链,或者使用create_react_agent等新式API,它们提供了更好的类型检查和流式输出支持。
此外,工具的安全性不容忽视。当智能体拥有执行代码或写入文件的权限时,务必在沙箱环境中运行,并对用户输入进行严格过滤,防止提示词注入攻击导致意外操作。

从基础工具扩展到数据库和API集成的架构演进
通过保留verbose=True输出的日志,你可以持续分析智能体的决策路径,优化工具的描述文案,甚至调整模型的Prompt模板,从而让智能体在特定领域表现得更加专业和可靠。这个基础框架可以作为起点,逐步接入数据库查询、API调用等更多专业工具,构建真正能解决复杂问题的AI助手。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













