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

发布时间:2026/9/11 18:31:11

用 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验证流程后再逐步增加复杂性。
延伸阅读

更多相关文章

2026/9/10 18:41:39

故障处理流程和规范

1、背景 目前架构团队负责公司很多核心服务,包括商品中心、订单中心、优惠券中心、用户中心、网关等等服务。作为主链路的关键核心,服务的稳定性和可靠性直接到影响到用户口碑和体验,同时也影响到公司的营收,所以线上服务的稳定性…

2026/9/10 3:28:03

linux tar解压tar文件报错

[rootkafka software]# tar -xzvf kafka_2.11-1.1.1.targzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting nowz 去掉测试: [rootkafka software]# tar -xvf kafka_2.11-1.1.1.tar成功了。 tar 参数解析: 解压…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码