当前位置: 首页 > article >正文

别再死记硬背了!用LangChain的AgentExecutor,5分钟搞定你的第一个AI助手(附避坑指南)

5分钟实战用LangChain AgentExecutor打造你的第一个AI助手在AI技术快速发展的今天构建一个能理解并执行复杂任务的AI助手不再是遥不可及的梦想。LangChain作为当前最热门的AI开发框架之一其Agent系统让开发者能够轻松创建功能强大的AI应用。本文将带你从零开始用最简单的代码实现一个实用的AI助手同时避开新手常犯的错误。1. 为什么选择AgentExecutorLangChain的Agent系统本质上是一个思考-行动循环AI先思考需要做什么然后选择合适工具执行最后根据结果决定下一步。而AgentExecutor就是这个循环的发动机它自动处理了以下复杂问题工具调用管理自动选择和执行合适的工具错误处理当工具调用失败时自动恢复循环控制防止无限循环设置最大迭代次数中间状态维护保存执行过程中的临时结果相比手动实现这些功能AgentExecutor可以节省你80%以上的开发时间。下面是一个直观对比实现方式代码量错误处理执行效率可维护性手动循环100行需自定义中等差AgentExecutor10-20行内置完善高优2. 环境准备与安装在开始前确保你的开发环境满足以下要求# 推荐使用Python 3.9 python --version # 安装必要库 pip install langchain openai常见安装问题解决方案版本冲突建议使用虚拟环境python -m venv langchain-env source langchain-env/bin/activate # Linux/Mac langchain-env\Scripts\activate # WindowsOpenAI API密钥在代码中设置环境变量import os os.environ[OPENAI_API_KEY] 你的API密钥提示如果在中国大陆访问OpenAI有困难可以考虑使用合规的API代理服务但请确保遵守当地法律法规。3. 构建你的第一个AI助手让我们从一个简单的单词长度计算器开始逐步扩展功能。3.1 基础版单词长度计算from langchain.chat_models import ChatOpenAI from langchain.agents import tool, AgentExecutor from langchain.agents import initialize_agent # 定义工具 tool def get_word_length(word: str) - int: 返回单词的长度 return len(word) # 初始化模型和工具 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) tools [get_word_length] # 创建Agent agent initialize_agent( tools, llm, agentzero-shot-react-description, verboseTrue # 显示详细执行过程 ) # 运行Agent result agent.run(单词hello有多少个字母?) print(result)执行这段代码你会看到类似输出 Entering new AgentExecutor chain... 思考我需要计算单词hello的长度 行动调用get_word_length工具 行动输入{word:hello} 观察结果5 思考现在我知道最终答案了 最终答案单词hello有5个字母。 Finished chain. 单词hello有5个字母。3.2 进阶版添加计算器功能让我们增强助手的能力添加数学计算功能from langchain import LLMMathChain # 创建计算器工具 llm_math LLMMathChain.from_llm(llmllm) tools.append( Tool( nameCalculator, funcllm_math.run, description用于数学计算 ) ) # 重新初始化Agent agent initialize_agent( tools, llm, agentzero-shot-react-description, verboseTrue ) # 测试复合问题 question 单词langchain的长度加上5的平方是多少? result agent.run(question) print(result)典型输出 Entering new AgentExecutor chain... 思考我需要先计算单词langchain的长度然后计算5的平方最后相加 行动调用get_word_length工具 行动输入{word:langchain} 观察结果9 思考现在计算5的平方 行动调用Calculator工具 行动输入5的平方 观察结果25 思考现在将两个结果相加 行动调用Calculator工具 行动输入925 观察结果34 思考现在我知道最终答案了 最终答案单词langchain的长度加上5的平方等于34。 Finished chain. 单词langchain的长度加上5的平方等于34。4. 避坑指南在实际开发中你可能会遇到以下常见问题4.1 工具选择失败症状Agent无法正确选择工具或重复调用错误工具解决方案检查工具描述是否清晰降低temperature参数值建议0-0.3添加示例到prompt中# 改进后的工具定义 tool def get_word_length(word: str) - int: 当需要计算英文单词的字母数量时使用此工具。输入应为单个单词。 return len(word)4.2 无限循环症状Agent陷入无限思考循环解决方案设置max_iterations参数使用early_stopping_methodagent initialize_agent( tools, llm, agentzero-shot-react-description, max_iterations5, early_stopping_methodgenerate, verboseTrue )4.3 复杂任务处理对于多步骤复杂任务建议分解任务让Agent先规划步骤再执行添加记忆保存历史对话from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory(memory_keychat_history) agent initialize_agent( tools, llm, agentconversational-react-description, memorymemory, verboseTrue )5. 扩展你的AI助手现在你已经掌握了基础可以尝试添加更多实用功能5.1 添加网络搜索能力from langchain.utilities import DuckDuckGoSearchAPIWrapper search DuckDuckGoSearchAPIWrapper() tools.append( Tool( nameSearch, funcsearch.run, description用于查询当前事件或事实信息 ) ) # 测试搜索功能 agent.run(2023年诺贝尔文学奖得主是谁?)5.2 使用更强大的模型# 使用GPT-4模型 llm ChatOpenAI(modelgpt-4, temperature0) # 使用Anthropic Claude模型 # from langchain.chat_models import ChatAnthropic # llm ChatAnthropic(modelclaude-2)5.3 添加自定义工具创建一个获取天气的模拟工具tool def get_weather(city: str) - str: 获取指定城市的当前天气情况 # 这里应该是调用天气API的代码 # 为演示使用模拟数据 weather_data { 北京: 晴25°C, 上海: 多云28°C, 广州: 雷阵雨30°C } return weather_data.get(city, 天气信息暂不可用) tools.append(get_weather)6. 最佳实践根据实际项目经验总结出以下建议工具设计原则每个工具应专注单一功能输入输出类型要明确描述要准确详细性能优化对频繁调用的工具添加缓存设置合理的超时时间批量处理相似请求错误处理from langchain.schema import AgentAction, AgentFinish def handle_error(error) - str: 统一错误处理 print(f工具执行出错: {str(error)}) return 抱歉处理您的请求时出现问题请稍后再试。 agent initialize_agent( tools, llm, handle_parsing_errorshandle_error, verboseTrue )监控与日志使用LangSmith进行执行跟踪记录关键指标工具调用次数、成功率等# 启用LangSmith跟踪 import os os.environ[LANGCHAIN_TRACING_V2] true os.environ[LANGCHAIN_PROJECT] My AI Assistant7. 实际应用案例让我们看一个完整的天气预报助手示例from langchain.chat_models import ChatOpenAI from langchain.agents import tool, AgentExecutor from langchain.agents import initialize_agent from langchain.memory import ConversationBufferMemory import requests # 天气API工具 tool def get_weather(city: str) - dict: 获取城市天气预报返回温度、湿度和天气状况 # 这里使用模拟API响应 mock_data { 北京: {temp: 22, humidity: 40, condition: 晴}, 上海: {temp: 25, humidity: 75, condition: 多云}, 广州: {temp: 28, humidity: 85, condition: 雷阵雨} } return mock_data.get(city, {error: 城市不存在}) # 建议工具 tool def get_travel_suggestion(weather: dict) - str: 根据天气给出出行建议 condition weather[condition] if 雨 in condition: return 建议携带雨具 elif weather[temp] 26: return 建议穿着轻薄衣物 else: return 适宜出行 # 初始化系统 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.2) tools [get_weather, get_travel_suggestion] memory ConversationBufferMemory(memory_keychat_history) # 创建Agent agent AgentExecutor.from_agent_and_tools( agentchat-conversational-react-description, toolstools, llmllm, memorymemory, verboseTrue, max_iterations3 ) # 交互测试 questions [ 北京天气怎么样?, 我应该穿什么衣服?, 上海呢? ] for q in questions: print(f用户: {q}) response agent.run(q) print(f助手: {response}\n)这个示例展示了如何创建多个协同工作的工具维护对话上下文处理连续问题提供实用建议8. 调试技巧当你的Agent表现不如预期时可以尝试以下调试方法检查工具选择# 打印工具选择过程 def print_intermediate_steps(intermediate_steps): for action, observation in intermediate_steps: print(f行动: {action}) print(f观察: {observation}\n) agent initialize_agent( tools, llm, agentzero-shot-react-description, return_intermediate_stepsTrue, verboseTrue ) result agent(问题) print_intermediate_steps(result[intermediate_steps])简化问题先测试单个工具是否正常工作调整prompt有时需要微调Agent的提示词使用不同Agent类型# 尝试不同的Agent类型 agent_types [ zero-shot-react-description, chat-conversational-react-description, openai-functions ]检查工具描述确保描述准确反映工具功能9. 性能优化对于生产环境应用考虑以下优化措施工具缓存from functools import lru_cache lru_cache(maxsize100) tool def get_word_length(word: str) - int: 返回单词长度 return len(word)异步执行import asyncio async def async_agent_execution(): agent initialize_agent(tools, llm, agentzero-shot-react-description) tasks [ agent.arun(问题1), agent.arun(问题2) ] return await asyncio.gather(*tasks)批处理请求from langchain.chains import TransformChain def batch_processor(inputs): # 实现批处理逻辑 return {output: processed_results} batch_chain TransformChain( transformbatch_processor, input_variables[inputs], output_variables[output] )限制资源使用from langchain.agents import Tool from concurrent.futures import ThreadPoolExecutor def limited_tool_execution(tool_input): with ThreadPoolExecutor(max_workers5) as executor: future executor.submit(tool.run, tool_input) return future.result(timeout10)10. 安全注意事项开发AI助手时务必注意以下安全事项输入验证所有工具输入都应验证tool def safe_tool(input: str) - str: if not input.isalnum(): raise ValueError(输入包含非法字符) # 处理逻辑权限控制限制敏感工具的访问内容过滤对输出进行安全检查from langchain.output_parsers import CommaSeparatedListOutputParser from langchain.prompts import PromptTemplate template 只返回安全内容: 问题: {question} 安全回答: prompt PromptTemplate.from_template(template) chain prompt | llm | CommaSeparatedListOutputParser()API访问限制监控和限制API调用频率数据隐私不记录敏感用户数据11. 部署建议当准备部署你的AI助手时容器化部署FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [python, app.py]API封装from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class Request(BaseModel): question: str app.post(/ask) async def ask(request: Request): return {answer: agent.run(request.question)}监控设置记录执行指标设置告警阈值定期审核工具使用情况扩展架构使用消息队列处理高并发考虑分布式执行实现故障转移机制12. 未来扩展方向你的AI助手可以进一步发展多模态能力添加图像处理工具知识检索集成向量数据库工作流自动化连接Zapier等自动化平台个性化学习基于用户交互优化行为领域专业化针对医疗、法律等特定领域训练# 示例添加图像处理工具 tool def analyze_image(image_url: str) - str: 分析图像内容 # 调用图像识别API return 图像描述通过本文的实战指南你应该已经掌握了使用LangChain AgentExecutor创建AI助手的核心技能。记住最好的学习方式是实践——尝试修改示例代码添加你自己的工具逐步构建出功能丰富的AI助手。

相关文章:

别再死记硬背了!用LangChain的AgentExecutor,5分钟搞定你的第一个AI助手(附避坑指南)

5分钟实战:用LangChain AgentExecutor打造你的第一个AI助手 在AI技术快速发展的今天,构建一个能理解并执行复杂任务的AI助手不再是遥不可及的梦想。LangChain作为当前最热门的AI开发框架之一,其Agent系统让开发者能够轻松创建功能强大的AI应用…...

保姆级教程:在CentOS 7上一步步安装TongLINKQ 8.1.15.1服务端(含环境变量配置与常见问题排查)

保姆级教程:在CentOS 7上一步步安装TongLINKQ 8.1.15.1服务端(含环境变量配置与常见问题排查) 如果你正在CentOS 7环境下部署TongLINKQ消息中间件,这篇手把手教程将带你避开90%的安装陷阱。不同于通用安装手册,这里会深…...

AI 术语通俗词典:目标函数

目标函数是统计学、优化理论、机器学习和人工智能中非常常见的一个术语。它用来描述模型训练过程中真正要被优化的整体目标。换句话说,目标函数是在回答:模型训练时,最终到底要把什么量降到最小,或者把什么量提升到最大。 如果说损…...

虚幻引擎与外部系统通信:自定义二进制协议设计与实战指南

1. 项目概述:一个连接虚幻引擎与外部世界的桥梁如果你是一名游戏开发者,或者正在用虚幻引擎(Unreal Engine)打造任何形式的交互式应用,那么你一定遇到过这样的场景:你的UE应用需要和外部硬件(比…...

利用Taotoken用量看板精细化管理视频项目中的AI调用成本

利用Taotoken用量看板精细化管理视频项目中的AI调用成本 1. 视频制作中的AI成本挑战 在视频内容创作领域,从脚本生成到字幕制作,再到特效描述,大模型API已成为提升效率的重要工具。但不同项目、不同创作阶段对模型的需求差异显著&#xff0…...

基于MCP协议构建Supabase AI助手:安全连接与工具调用实践

1. 项目概述:一个连接Supabase与AI世界的桥梁如果你正在用Supabase构建应用,同时又想给应用加上AI能力,比如让AI助手帮你查数据库、管理用户,那你可能已经发现了一个痛点:Supabase和AI工具链之间,缺少一个标…...

强化世界模型:提升LLM智能体复杂决策能力

1. 项目背景与核心价值去年在开发对话系统时,我发现传统LLM智能体在复杂决策场景中经常出现"逻辑短路"——明明拥有海量知识,却无法做出符合物理规律或社会常识的判断。这个问题源于智能体缺乏对世界运行规律的深层理解。而强化世界模型&#…...

保姆级教程:用Docker Compose一键部署带MQTT插件的RabbitMQ(附MQTTX测试)

容器化部署实战:基于Docker Compose的RabbitMQ与MQTT插件集成指南 RabbitMQ作为企业级消息队列的标杆,其轻量级MQTT协议支持能力让它在物联网领域大放异彩。想象一下,你正在开发一个智能家居系统,需要同时处理设备传感器数据和后台…...

Android开发中的蓝牙与WiFi技术深度解析:从基础到实战

引言 在移动应用开发领域,蓝牙和WiFi技术扮演着核心角色,它们支持设备间通信、数据传输和网络连接,是构建智能家居、物联网(IoT)和可穿戴设备的关键。Android平台提供了强大的API支持,使开发者能够高效集成蓝牙和WiFi功能。本文聚焦于Android开发中蓝牙和WiFi技术的应用…...

移动端开发中的蓝牙与WiFi技术深度解析与实战指南

前言:移动端开发中的无线技术核心作用 在当今移动应用生态中,无线通信技术已成为不可或缺的支柱,其中蓝牙和WiFi作为两大主流协议,驱动着物联网(IoT)、智能家居、健康监测等领域的创新。蓝牙技术(特别是低功耗蓝牙BLE)专注于短距离、低功耗设备连接,如可穿戴设备和传感…...

基于RAG与领域微调的垂直行业智能问答系统构建实践

1. 项目概述:一个专为地产与土木工程打造的智能问答助手最近在GitHub上看到一个挺有意思的项目,叫mayam2-stack/real-estate-civil-eng-chatbot。光看这个名字,就能猜到个大概:这是一个基于MayaM2技术栈,专门服务于房地…...

医药行业AI智能数据管道:自动化整合与四维评分模型解析

1. 项目概述:一个为医药行业打造的AI智能数据管道如果你在生物医药、投资或市场准入领域工作,每天花几个小时手动查询ClinicalTrials.gov、FDA数据库、PubMed和USPTO,只为拼凑出一个竞品管线的大致轮廓,那么你一定会对这个工具产生…...

魔兽争霸3终极助手:5大核心功能彻底解决经典游戏兼容性问题

魔兽争霸3终极助手:5大核心功能彻底解决经典游戏兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为魔兽争霸3在现代电…...

Dify外部知识库代理:打通Confluence、API与网页,构建动态智能助手

1. 项目概述:一个为Dify注入外部知识源的智能代理最近在折腾AI应用开发,特别是用Dify这类低代码平台快速搭建智能助手时,遇到了一个挺普遍的问题:Dify内置的知识库功能虽然方便,但很多时候我们的数据并不在本地&#x…...

别再只用pickle存数据了!用h5py管理你的PyTorch/TensorFlow模型权重(附完整代码)

深度学习模型权重管理的进阶方案:h5py实战指南 在深度学习项目的生命周期中,模型权重的存储与管理往往成为容易被忽视却至关重要的环节。当面对BERT、ResNet等参数量庞大的模型时,传统的pickle或框架原生保存方法开始暴露出诸多局限性——文件…...

别再手动调参了!用麻雀算法SSA自动优化VMD分解参数(附MATLAB代码)

基于麻雀算法的VMD参数智能优化实战:从理论到故障诊断应用 在信号处理领域,变分模态分解(VMD)因其出色的非平稳信号分析能力而广受关注。然而,传统VMD应用中最大的痛点莫过于参数选择——模态数K和惩罚因子α的确定往往依赖经验或反复试错&am…...

PTA天梯赛L2-042题保姆级攻略:用C++ STL vector和sort轻松找出老板作息表的‘摸鱼’时间

PTA天梯赛L2-042题解:用侦探思维破解老板的"摸鱼"时间 最近在PTA天梯赛的题库中,有一道关于时间区间处理的题目引起了我的注意。题目描述了一位老板在网上晒出自己的作息时间表,却被眼尖的网友发现存在时间空白。这让我想起了一个有…...

【企业级低代码内核调试SOP】:7类典型NPE/ClassDefNotFound场景对照表,含JFR采样+Arthas增强脚本

更多请点击: https://intelliparadigm.com 第一章:企业级低代码内核调试SOP概述 企业级低代码平台的内核调试并非传统应用开发的简单延伸,而是融合了元数据驱动、可视化编排、运行时沙箱与动态渲染引擎的复合型工程实践。其SOP(标…...

别光看虚拟线程了!Java 21 里这个‘字符串模板’预览特性,能让你的代码清爽一大截

别光看虚拟线程了!Java 21 里这个‘字符串模板’预览特性,能让你的代码清爽一大截 如果你是一位长期与Java打交道的开发者,最近可能被Java 21的虚拟线程(Virtual Threads)刷屏了。这个特性确实令人兴奋,但今…...

C#实战:用滚球算法搞定点云凹包,GIS和游戏地形都能用

C#实战:用滚球算法实现点云凹包,解锁GIS与游戏地形新玩法 当我们需要从一堆散乱的点数据中勾勒出它们的边界轮廓时,凸包算法往往是最先想到的解决方案。但现实世界中的形状很少是完美的凸多边形——海岸线的蜿蜒、城市边界的曲折、游戏地形的…...

避坑指南:从HuggingFace下载模型到llama.cpp量化,我踩过的那些‘坑’(含CUDA 12.2环境配置)

避坑指南:从HuggingFace下载模型到llama.cpp量化实战全解析 在部署大语言模型的过程中,从模型下载到最终量化部署,每个环节都可能隐藏着各种"坑"。本文将分享我在实际项目中积累的经验教训,特别是那些官方文档中鲜少提及…...

用Python和PySide6打造你的专属量化看盘工具:从K线到MACD的完整绘图实战

用Python和PySide6打造你的专属量化看盘工具:从K线到MACD的完整绘图实战 在量化交易的世界里,数据可视化是决策过程中不可或缺的一环。想象一下,当你需要快速验证一个交易策略的有效性,或者实时监控市场动态时,一个能够…...

别再只算公式了!聊聊NTC测温里ADC误差、滤波和TL431稳压的那些‘坑’

别再只算公式了!聊聊NTC测温里ADC误差、滤波和TL431稳压的那些‘坑’ 当你在产品验收报告上签下"0.5℃精度达标"时,是否注意到测试环境恒温箱的波动只有0.1℃?这个行业里心照不宣的秘密,正是我今天要拆解的技术真相。三…...

Go语言AI编程助手实战:golang-skills提升代码质量与开发效率

1. 项目概述:当AI助手遇上Go语言开发最近在GitHub上闲逛,发现了一个挺有意思的项目叫golang-skills。作为一个写了快十年Go的老码农,我对任何号称能提升Go代码质量的工具都抱有天然的好奇心。这个项目本质上是一个AI驱动的技能包,…...

CMMI在系统软件开发中的核心价值与实施策略

1. CMMI在系统软件开发中的核心价值解析在嵌入式系统和复杂软件产品的开发过程中,我们经常面临这样的困境:明明每个工程师都很优秀,但项目交付时总会出现需求遗漏、集成故障或质量波动。2009年我在参与某航天控制系统开发时,项目组…...

LaTeX表格进阶:除了\toprule和\bottomrule,booktabs宏包里\cmidrule和\addlinespace的隐藏用法与实战场景

LaTeX表格进阶:booktabs宏包中\cmidrule与\addlinespace的高阶应用指南 如果你已经熟悉booktabs宏包的基础三线表用法,却总觉得表格排版还差点意思——比如分组数据展示不够清晰、复杂表格结构难以驾驭,或者行间距控制不够精细——那么这篇文…...

告别NVS限制:手把手教你为ESP32设计自定义参数表并读写Flash(附完整代码)

突破NVS瓶颈:ESP32自定义参数表设计与Flash高效存储实战 在物联网设备开发中,参数存储是每个嵌入式工程师必须面对的基础问题。ESP32虽然提供了NVS(Non-Volatile Storage)库作为默认解决方案,但当项目复杂度提升时——…...

基于Dev Containers构建标准化开发环境:从Docker镜像到团队协作实践

1. 项目概述:一个为开发者量身定制的容器化开发环境如果你和我一样,每天的工作离不开写代码、调试、构建,那么你一定对“环境配置”这件事深恶痛绝。新同事入职,光是配环境就得花上半天甚至一天;换一台新电脑&#xff…...

SLM-V3架构:四通道检索与信息几何的下一代信息检索系统

1. SLM-V3架构概述:下一代信息检索系统的设计哲学在信息爆炸的时代,检索系统正面临前所未有的挑战。传统基于关键词匹配的检索方式已经难以满足用户对精准度和语义理解的需求。SLM-V3架构正是在这样的背景下应运而生,它通过四通道检索机制与信…...

从针灸学习网站到Vue3项目:我是如何用VSCode+Element Plus快速搭建前端原型的

从针灸学习网站到Vue3项目:我是如何用VSCodeElement Plus快速搭建前端原型的 去年冬天,我在学习中医针灸时萌生了一个想法:能否开发一个交互式学习平台,将经络穴位可视化?这个念头让我重新拾起前端开发技能。经过两周的…...