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

发布时间:2026/11/1 8:25:10

用 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/10/31 18:30:12

故障处理流程和规范

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

2026/10/25 13:19:11

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/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

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

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