ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于LangChain与工具调用构建AI智能体:从原理到实践

2026/8/4 4:49:45 拓冰建站 浏览量
基于LangChain与工具调用构建AI智能体:从原理到实践 在实际项目中我们越来越多地看到一种趋势以 ChatGPT 为代表的大型语言模型LLM正在从一个纯粹的对话式问答工具演变为一个能够自主操作外部工具、执行复杂任务的“智能体”Agent。这个过程很像一个浏览器从静态展示网页发展到能够运行脚本、调用插件、与用户深度交互的演变。因此将“ChatGPT 正成为智能体浏览器”这一概念落地意味着我们需要理解如何将 LLM 作为核心“大脑”通过工具调用Tool Calling或函数调用Function Calling来“浏览”和“操作”一个由 API、数据库、文件系统等构成的数字世界。本文将从工程实践角度带你理解智能体的核心架构并动手搭建一个能够查询天气、搜索信息、处理本地文件的简易智能体系统。1. 理解智能体从对话模型到“浏览器”的演变1.1 什么是智能体在传统软件开发中一个程序的功能是预先定义好的。而在智能体架构中核心是一个具备推理能力的 LLM如 ChatGPT它并不直接“知道”如何完成所有任务但可以根据用户指令动态地决定调用哪些外部工具Tools来完成任务。这些工具就像是浏览器中的插件或脚本扩展了 LLM 的能力边界。一个典型的智能体工作流程如下接收指令用户提出一个自然语言请求例如“查询北京今天的天气然后总结成一份简报”。意图解析与规划LLM 分析指令将其分解为一系列可执行的子任务查询天气、总结信息。工具调用LLM 识别出需要调用“天气查询 API”这个工具并生成符合该工具接口规范的调用参数如city: “北京”。执行与观察智能体框架执行工具调用获取结果如 JSON 格式的天气数据。结果整合与响应LLM 接收到工具返回的结果将其整合并生成最终的自然语言回复给用户。这个过程循环往复可以处理多步复杂任务LLM 在其中扮演了“决策者”和“协调者”的角色这正是“智能体浏览器”概念的体现——LLM 作为“浏览器内核”工具作为“扩展”共同完成对信息和服务世界的“浏览”与“操作”。1.2 核心组件LLM、工具与框架要构建一个智能体你需要三个核心部分LLM大语言模型提供推理和决策能力。可以是 OpenAI 的 GPT 系列、Anthropic 的 Claude或开源的 Llama、Qwen 等。它需要支持“函数调用”或“工具调用”功能。工具Tools封装了具体能力的函数或 API。例如get_weather(city: str) - str: 调用天气 API。search_web(query: str) - str: 执行网络搜索。read_file(filepath: str) - str: 读取本地文件。execute_sql(query: str) - list: 查询数据库。智能体框架Agent Framework负责编排整个流程。它管理 LLM 的会话将工具定义以特定格式如 OpenAI 的 Function Calling Schema提供给 LLM解析 LLM 的“工具调用”请求执行对应的工具函数并将结果返回给 LLM。常见的框架包括 LangChain、LlamaIndex、Semantic Kernel 以及各大云平台提供的 AI 应用开发工具。2. 环境准备与项目初始化我们将使用 Python 和 LangChain 框架来构建一个演示智能体。LangChain 提供了高度抽象化的智能体构建模块适合快速理解和原型开发。2.1 基础环境要求确保你的开发环境满足以下条件Python: 版本 3.8 或更高。包管理工具: pip 或 conda。网络访问: 能够访问所选 LLM 的 API例如 OpenAI API。对于本地模型则需要相应的推理服务。代码编辑器: VS Code, PyCharm 等。2.2 创建项目与安装依赖首先创建一个新的项目目录并初始化虚拟环境这能有效隔离依赖。# 创建项目目录 mkdir simple_ai_agent cd simple_ai_agent # 创建虚拟环境 (以 venv 为例) python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate激活虚拟环境后命令行提示符前通常会出现(venv)标识。接下来安装核心依赖。# 安装 LangChain 及其 OpenAI 集成包 pip install langchain langchain-openai # 安装用于网络搜索的工具包示例 pip install duckduckgo-search # 安装用于处理结构化数据的包 pip install pandas注意生产环境中务必使用requirements.txt或pyproject.toml文件来精确管理依赖版本避免因版本升级导致的不兼容问题。2.3 配置 LLM API 密钥我们将使用 OpenAI 的 GPT 模型作为 LLM 核心。你需要一个 OpenAI API 密钥。访问 OpenAI 平台创建 API Key。在项目中永远不要将密钥硬编码在代码里。推荐使用环境变量管理。# 在命令行中设置环境变量临时重启终端后失效 # Windows: setx OPENAI_API_KEY your-api-key-here # Linux/Mac: export OPENAI_API_KEYyour-api-key-here更稳妥的方式是使用.env文件配合python-dotenv库。pip install python-dotenv在项目根目录创建.env文件OPENAI_API_KEYsk-你的真实API密钥并在主程序开头加载from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的环境变量 # 现在可以通过 os.getenv(OPENAI_API_KEY) 获取密钥3. 构建第一个工具并集成到智能体我们将创建两个简单的工具一个模拟的天气查询工具和一个真实的网络搜索工具。3.1 定义工具函数在项目根目录创建my_tools.py文件。# my_tools.py import json from duckduckgo_search import DDGS def get_current_weather(location: str, unit: str celsius) - str: 获取指定城市的当前天气信息。 Args: location (str): 城市名例如 北京。 unit (str): 温度单位celsius 或 fahrenheit。 Returns: str: 格式化的天气信息字符串。 # 注意这是一个模拟函数。真实场景应调用如和风天气、OpenWeatherMap 等 API。 # 这里返回模拟数据以演示流程。 weather_data { location: location, temperature: 22, unit: unit, conditions: 晴朗微风, humidity: 65% } return json.dumps(weather_data, ensure_asciiFalse) def search_internet(query: str) - str: 使用 DuckDuckGo 在互联网上搜索信息。 Args: query (str): 搜索关键词。 Returns: str: 搜索结果的摘要文本。 try: with DDGS() as ddgs: # 获取最相关的几条结果 results list(ddgs.text(query, max_results3)) if not results: return 未找到相关信息。 # 将结果整合成一段文本 summary f关于 {query} 的搜索结果\n for i, r in enumerate(results, 1): summary f{i}. {r[title]}: {r[body][:150]}...\n return summary except Exception as e: return f搜索过程中发生错误{str(e)}3.2 使用 LangChain 创建智能体现在我们将使用 LangChain 的“工具调用”智能体模式将上述函数封装成工具并交给 LLM 调度。创建主程序文件main_agent.py。# main_agent.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_core.prompts import ChatPromptTemplate # 导入我们自定义的工具函数 from my_tools import get_current_weather, search_internet # 导入 LangChain 的工具装饰器用于将函数转换为智能体可识别的工具 from langchain.tools import tool # 1. 加载环境变量 load_dotenv() # 2. 将自定义函数包装成 LangChain Tool 对象 tool def weather_tool(location: str, unit: str celsius) - str: 调用此工具查询指定城市的天气。单位可选‘celsius’或‘fahrenheit’。 return get_current_weather(location, unit) tool def search_tool(query: str) - str: 调用此工具在互联网上搜索最新信息。 return search_internet(query) # 创建工具列表 tools [weather_tool, search_tool] # 3. 初始化 LLM # 使用 gpt-3.5-turbo 或 gpt-4-turbo它们均支持工具调用 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 4. 定义智能体的提示词系统指令 # 提示词用于指导 LLM 如何扮演智能体角色以及何时使用工具 prompt ChatPromptTemplate.from_messages([ (system, 你是一个乐于助人的AI助手。你可以使用工具来获取实时信息。 请遵循以下规则 1. 如果用户的问题涉及实时天气或最新事件请务必使用工具。 2. 使用工具时请确保参数准确。 3. 根据工具返回的结果用友好、清晰的语言回答用户。 4. 如果工具无法提供答案请如实告知用户。), (placeholder, {chat_history}), (human, {input}), (placeholder, {agent_scratchpad}), ]) # 5. 创建智能体 agent create_tool_calling_agent(llmllm, toolstools, promptprompt) # 6. 创建智能体执行器 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue) # 7. 运行智能体 if __name__ __main__: print(简易智能体已启动输入‘退出’或‘quit’结束对话。) while True: user_input input(\n你: ) if user_input.lower() in [退出, quit]: print(再见) break try: # 调用执行器 response agent_executor.invoke({input: user_input}) print(f\n助手: {response[output]}) except Exception as e: print(f\n执行出错: {e})3.3 代码关键点解析工具装饰器tool这是 LangChain 提供的装饰器它将一个普通的 Python 函数转换为智能体能识别的Tool对象。装饰器会自动从函数的文档字符串Docstring和类型注解中提取工具的描述和参数模式这对于 LLM 理解工具用途至关重要。提示词Prompt系统提示词是智能体的“宪法”。我们在这里明确告诉 LLM你是一个可以使用工具的助手在特定场景下如实时信息必须使用工具。清晰的指令能显著提升工具调用的准确率。create_tool_calling_agent这是 LangChain 提供的高级 API专门用于创建基于“工具调用”模式的智能体。它内部处理了 LLM 与工具之间的复杂交互逻辑。AgentExecutor这是智能体的运行时引擎。它负责循环执行“LLM思考 - 决定调用工具 - 执行工具 - 将结果返回给LLM”这个过程直到 LLM 认为可以给出最终答案。verboseTrue参数会在控制台打印详细的执行步骤非常适合调试。invoke方法这是触发智能体运行的入口传入用户输入。4. 运行验证与结果分析4.1 启动与基础对话测试在终端中确保处于虚拟环境并已设置好OPENAI_API_KEY运行程序python main_agent.py你会看到类似以下的启动信息然后进入交互模式简易智能体已启动输入‘退出’或‘quit’结束对话。首先测试一个不需要工具的问题你: 你好请介绍一下你自己。由于问题不涉及实时信息LLM 可能会直接基于自身知识回答不会触发工具调用。verbose输出会显示 LLM 的思考过程但最终response[‘output’]是直接的回答。4.2 触发工具调用测试接下来测试需要工具的问题你: 北京今天的天气怎么样观察控制台输出你会看到详细的verbose日志类似 进入新的 AgentExecutor 链... 思考用户想知道北京的天气我需要使用天气查询工具。 行动 { action: weather_tool, action_input: {location: 北京, unit: celsius} } 观察{location: 北京, temperature: 22, unit: celsius, conditions: 晴朗微风, humidity: 65%} 思考我已经获得了北京的天气信息现在可以回答用户了。 最终答案北京今天天气晴朗微风气温大约22摄氏度湿度65%。 链结束。 助手北京今天天气晴朗微风气温大约22摄氏度湿度65%。这个过程完美展示了智能体的工作流解析意图 - 选择工具weather_tool并生成参数 - 执行工具获取数据 - 整合数据生成回答。4.3 多步任务测试测试一个结合了搜索和总结的复杂指令你: 搜索一下最近关于人工智能在医疗领域的最新突破然后简要总结一下。智能体可能会先调用search_tool获取搜索结果后LLM 再基于这些结果进行总结。verbose日志会清晰地展示这两个步骤。5. 常见问题排查与调试在开发智能体时你可能会遇到以下典型问题。5.1 工具未被调用现象LLM 直接回答了关于实时信息的问题而没有调用工具。可能原因与排查提示词指令不明确检查系统提示词是否强烈要求 LLM 在特定场景下使用工具。可以强化指令如“你必须使用工具来回答关于天气或最新新闻的问题”。工具描述不清晰检查tool装饰器下函数的文档字符串。描述应准确说明工具的用途和适用场景让 LLM 能准确匹配。LLM 温度Temperature过高temperature参数控制输出的随机性。设为 0如示例可使输出更确定、更遵循指令。尝试将其设为 0。模型不支持工具调用确保使用的模型如gpt-3.5-turbo或gpt-4-turbo支持工具调用功能。5.2 工具调用参数错误现象LLM 决定调用工具但生成的参数格式错误或缺失导致工具执行失败。可能原因与排查函数类型注解缺失或错误LangChain 依赖类型注解如location: str来生成工具的模式。确保所有参数都有正确的类型注解。参数名不清晰使用语义明确的参数名如city_name比loc更好。在AgentExecutor中开启handle_parsing_errorsTrue这可以让执行器在参数解析失败时将错误信息返回给 LLM让其有机会重新生成正确的调用。agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue # 增加此参数 )5.3 网络或 API 错误现象工具调用因网络超时、API 密钥无效或第三方服务不可用而失败。排查检查OPENAI_API_KEY环境变量是否正确设置。在工具函数内部添加更详细的异常捕获和日志返回清晰的错误信息给 LLM。对于网络请求工具考虑增加超时设置和重试机制。5.4 智能体陷入循环现象智能体在“思考-行动”循环中无法停止或重复调用同一工具。可能原因与排查设置max_iterations和early_stopping_method在AgentExecutor中限制最大迭代次数防止无限循环。agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, max_iterations5, # 限制最多迭代5次 early_stopping_methodgenerate # 达到上限后强制生成最终答案 )工具返回的结果无法满足 LLM 生成最终答案的条件优化工具返回的信息结构使其更易于被 LLM 理解和总结。6. 进阶构建更健壮的生产级智能体上述示例是一个简单的学习原型。要将其用于更严肃的场景需要考虑以下方面。6.1 工具设计的工程化异步支持如果工具涉及网络 I/O如 API 调用应将其设计为异步函数并使用支持异步的智能体执行器如AgentExecutor(..., handle_parsing_errorsTrue, max_iterations5)以提高并发性能。错误处理与重试在工具内部实现完善的错误处理包括日志记录、异常捕获和可配置的重试逻辑。输入验证与清理在工具函数入口对参数进行验证和清理防止无效或恶意输入。速率限制与缓存对于调用外部 API 的工具实现速率限制以避免触发服务方限制。对结果进行适当缓存减少重复调用和成本。6.2 记忆与状态管理我们的简单示例是“无状态”的每次对话都是独立的。复杂的智能体需要记忆能力。会话记忆使用ConversationBufferMemory或ConversationSummaryMemory等 LangChain 组件让智能体记住之前的对话内容。长期记忆结合向量数据库如 Chroma, Pinecone将重要信息存入知识库供后续查询。6.3 智能体类型与模式选择LangChain 支持多种智能体类型适用于不同场景工具调用智能体Tool Calling Agent我们示例所用的类型现代且高效是 OpenAI 等模型的原生推荐方式。ReAct 智能体一种经典的“思考-行动”模式通过提示词让 LLM 显式输出Thought:、Action:、Observation:兼容性更广。规划与执行智能体适用于复杂任务先由一个大模型Planner制定详细计划再由另一个模型或系统Executor按步骤执行。选择取决于你的 LLM 能力、任务复杂度和对可控性的要求。6.4 监控、评估与成本控制日志记录详细记录每个用户请求、LLM 的思考过程、工具调用详情、耗时和最终响应。这对于调试和优化至关重要。评估设计测试用例评估智能体在关键任务上的准确率、工具调用正确率和响应时间。成本控制监控 API 调用尤其是 Token 消耗和工具调用如外部 API 费用的成本。设置预算和告警。将 ChatGPT 这类 LLM 发展为“智能体浏览器”本质上是将模型的认知能力与外部工具的执行能力相结合从而解决更广泛、更动态的现实世界问题。从工程角度看这要求开发者不仅会调用模型 API更要掌握工具抽象、流程编排、状态管理和错误处理等一系列技能。本文通过一个可运行的天气查询与搜索智能体示例展示了从环境搭建、工具定义、智能体集成到运行调试的完整路径。真正的挑战在于如何根据具体业务场景设计出稳定、高效、安全的工具集并设计出能够可靠调度这些工具的智能体逻辑。下一步你可以尝试集成数据库操作工具、企业内部系统 API或者引入向量数据库构建具有长期记忆和知识检索能力的更复杂智能体。