用 LangChain 构建一个 AI Agent:从零到一的实践指南

📅 2026/7/16 18:22:20
用 LangChain 构建一个 AI Agent:从零到一的实践指南
1. 引言什么是 AI Agent在人工智能领域AI Agent智能体是指能够感知环境、自主决策并执行行动以实现特定目标的程序实体。与传统脚本或简单 API 调用不同AI Agent 具备规划、记忆、工具使用和反思等高级能力使其能够处理复杂的多步骤任务。LangChain 作为一个强大的框架为构建此类 Agent 提供了模块化、可扩展的组件大大降低了开发门槛。本文将带你从零开始使用 LangChain 构建一个具备基础能力的 AI Agent。2. 环境准备与安装首先确保你的 Python 环境版本在 3.8 及以上。我们使用 pip 安装必要的包pip install langchain langchain-openai langchain-community此外你需要一个 OpenAI API 密钥或其他兼容 LangChain 的 LLM 服务密钥来驱动 Agent 的“大脑”。将其设置为环境变量export OPENAI_API_KEYyour-api-key-here3. 核心组件解析在 LangChain 中构建一个 Agent 通常涉及以下几个核心部分LLM (大语言模型)Agent 的决策核心如 GPT-4。Tools (工具)Agent 可以调用的外部函数如搜索、计算、数据库查询。Agent Executor运行 Agent 的引擎负责协调 LLM 的思考、工具调用和结果处理。Memory (记忆)使 Agent 能够在多轮对话中记住上下文。Prompt Template (提示词模板)指导 LLM 如何思考、规划和选择工具。4. 构建你的第一个 Agent让我们构建一个能进行数学计算和网络搜索的简单 Agent。4.1 定义工具首先我们创建两个工具一个计算器和一个搜索工具这里用 DuckDuckGo 搜索作为示例。from langchain.tools import Tool from langchain_community.tools import DuckDuckGoSearchRun import math def calculator(input_str: str) - str: 计算一个数学表达式。 try: # 安全评估数学表达式 result eval(input_str, {builtins: {}}, {math: math}) return str(result) except Exception as e: return f计算错误: {e} 创建工具实例 calc_tool Tool( nameCalculator, funccalculator, description用于计算数学表达式例如3 * 5 2 或 math.sqrt(16)。 ) search_tool DuckDuckGoSearchRun() 工具列表 tools [calc_tool, search_tool]4.2 初始化 LLM 和 Agent我们使用 OpenAI 的模型并选择 LangChain 内置的“零样本反应式”Agent 类型它适合简单工具调用。from langchain_openai import ChatOpenAI from langchain.agents import initialize_agent, AgentType llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) agent initialize_agent( tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 使用零样本反应式策略 verboseTrue, # 打印详细思考过程 handle_parsing_errorsTrue # 优雅处理解析错误 )4.3 运行 Agent现在你可以向 Agent 提问了result agent.run(请先计算 15 的平方根然后搜索一下 LangChain 的最新版本是什么。) print(result)当verboseTrue时你将在控制台看到 Agent 的完整思考链ReAct 模式Thought我需要先计算平方根然后再搜索。Action调用 Calculator 工具输入 “math.sqrt(15)”。Observation工具返回计算结果 “3.872983346207417”。Thought现在我需要搜索 LangChain 的最新版本。Action调用 DuckDuckGo Search 工具。Observation搜索返回相关信息。Final Answer整合信息并给出最终回答。5. 为 Agent 添加记忆能力上面的 Agent 是“无状态”的。为了让它在多轮对话中记住上下文我们需要引入 Memory。from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) 重新初始化带记忆的 Agent agent_with_memory initialize_agent( tools, llm, agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION, # 使用支持对话的 Agent 类型 verboseTrue, memorymemory, handle_parsing_errorsTrue ) 第一轮对话 response1 agent_with_memory.run(我的名字是小明。) print(response1) 第二轮对话Agent 会记得上一轮的内容 response2 agent_with_memory.run(我刚才说我叫什么名字) print(response2) # 应该能回答“小明”6. 进阶自定义工具与复杂工作流LangChain 的强大之处在于其模块化。你可以轻松集成自定义 API、数据库或任何函数作为工具。6.1 自定义工具示例获取天气import requests def get_weather(city: str) - str: 获取指定城市的天气模拟函数。 # 这里应调用真实的天气 API此处为模拟 weather_data { 北京: 晴25°C, 上海: 多云23°C, 深圳: 阵雨28°C } return weather_data.get(city, f未找到{city}的天气信息) weather_tool Tool( nameGetWeather, funcget_weather, description根据城市名称查询天气输入格式城市名例如北京。 ) 将新工具加入列表重新创建 Agent advanced_tools [calc_tool, search_tool, weather_tool] advanced_agent initialize_agent(advanced_tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue) result advanced_agent.run(今天北京的天气怎么样然后计算一下 98 除以 7。) print(result)6.2 使用 Agent 执行序列Sequential Chain对于更复杂的任务你可以将多个 Agent 或 LLM 调用串联起来。from langchain.chains import LLMChain, SimpleSequentialChain from langchain.prompts import PromptTemplate 第一个链生成问题 template1 你是一个问题生成器。根据主题{topic}生成一个有趣的问题。只输出问题。 prompt1 PromptTemplate(input_variables[topic], templatetemplate1) chain1 LLMChain(llmllm, promptprompt1) 第二个链回答问题 template2 你是一个知识渊博的助手。请回答以下问题{question}。回答要简洁。 prompt2 PromptTemplate(input_variables[question], templatetemplate2) chain2 LLMChain(llmllm, promptprompt2) 组合成序列链 overall_chain SimpleSequentialChain(chains[chain1, chain2], verboseTrue) final_output overall_chain.run(黑洞) print(final_output)7. 调试与最佳实践设置verboseTrue在开发阶段务必开启详细日志以观察 Agent 的思考过程便于定位问题。清晰的工具描述为每个工具提供准确、具体的description这是 LLM 能否正确选择工具的关键。错误处理使用handle_parsing_errorsTrue或自定义错误处理逻辑避免 Agent 因工具调用失败而崩溃。令牌数管理注意 Agent 运行过程中的上下文长度过长的记忆或中间步骤可能导致超出模型限制。从简单开始先用 1-2 个工具构建最小可行 Agent验证流程后再逐步增加复杂性。