尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于WorkBuddy框架的AI助手实战:从零构建具备技能管理与RAG的智能体

基于WorkBuddy框架的AI助手实战:从零构建具备技能管理与RAG的智能体 想用大模型做个智能助手但一动手就懵了面对 WorkBuddy、LangChain、RAG 这些新概念是不是感觉资料满天飞却不知道从哪里开始网上教程要么太浅要么直接丢给你一堆代码根本看不懂背后的逻辑。这篇文章要解决的就是这个问题。我将为你彻底拆解一个基于 WorkBuddy 框架的 AI 助手项目实战从零开始带你理解每一个核心概念并附上完整的、可运行的代码和配置。这不是简单的“Hello World”而是一个具备技能Skill管理、工具调用、记忆和知识库检索RAG能力的完整 Agent 实现。你会发现官方文档没讲透的工程化细节、新手最容易踩的坑以及如何将零散组件串联成一个可用的系统才是从“知道”到“做到”的关键。读完本文你将能独立搭建一个功能完整的 AI 助手原型并深刻理解 LLM 应用开发的核心模式。无论你是想快速验证一个 AI 产品想法还是希望系统学习 Agent 开发这篇文章都将是你最实用的路线图。1. 这篇文章真正要解决的问题为什么你的 AI 助手项目总是跑不通很多开发者学习 LLM 应用开发时会遇到一个典型的困境跟着教程一步步走代码能跑起来但稍微改点需求或者想整合新功能系统立刻就崩溃了。问题往往不在于大模型本身而在于对框架和设计模式的理解是碎片化的。例如你知道了 WorkBuddy 是一个 AI 助手框架LangChain 能帮你连接工具RAG 能增强知识问答。但当你试图把它们组合起来时会面临一系列具体问题技能Skill到底怎么写是简单的函数包装还是需要复杂的流程控制Agent 的“大脑”LLM如何与“手脚”Tools/Skills高效协作如何设计提示词Prompt让模型知道该调用哪个技能RAG 系统如何集成向量数据库怎么选检索结果怎么有效地喂给模型整个项目的代码结构应该怎么组织配置满天飞后期根本没法维护。本文的目标就是通过一个完整的实战项目一次性回答这些问题。我们不只讲“是什么”更聚焦“为什么”和“怎么做”让你掌握构建一个可扩展、易维护的 AI 助手所必需的工程化思维和实操能力。2. 基础概念与核心原理Agent、Skill、RAG 与 WorkBuddy在动手之前必须厘清几个核心概念。它们是你理解后续所有代码的基石。1. 大语言模型LLM项目的“大脑”。它负责理解用户意图、进行推理和生成文本。但它本身是“静态”的不知道外部世界的信息也无法执行具体操作如查询数据库、发送邮件。本文中我们将其视为一个强大的、可对话的推理引擎。2. 智能体Agent这是核心架构模式。一个 Agent LLM大脑 工具/技能手脚 记忆/知识经验。LLM 根据用户问题和自身能力工具列表来决定下一步行动是直接回答还是调用某个工具或者需要先检索一些知识。Agent 模式让 LLM 从“聊天机器人”变成了可以主动完成任务的“智能助手”。3. 技能Skill与工具Tool这是 Agent 的“手脚”。一个 Skill 通常是一个封装好的、能完成特定任务的函数或类比如“查询天气”、“发送邮件”、“总结网页内容”。在 LangChain 等框架中常称为 Tool。WorkBuddy 框架可能更倾向于使用Skill这个概念它可能包含更丰富的元数据如描述、参数、示例来帮助 LLM 更好地理解和使用它。4. 检索增强生成RAG这是给 LLM 装上“外部知识库”的技术。LLM 的训练数据是固定的无法知晓最新的、私有的信息。RAG 通过以下流程解决这个问题 *索引将你的文档PDF、TXT、网页切分成片段转换成向量Embedding存入向量数据库。 *检索当用户提问时将问题也转换成向量在向量数据库中搜索最相关的文本片段。 *增强将这些相关片段和原始问题一起作为上下文提供给 LLM。 *生成LLM 基于增强后的上下文生成更准确、更相关的回答。 简单说RAG 让 LLM 具备了“查阅资料”后再回答的能力。5. WorkBuddy 框架定位根据网络热词推断WorkBuddy 很可能是一个集成了上述概念Agent、Skill、RAG的上层应用框架或平台。它可能提供了更友好的配置界面、技能市场、统一的部署方式让开发者能更快速地搭建 AI 助手而无需从零开始拼接 LangChain、向量数据库等底层组件。我们的实战项目可以理解为用代码实现一个类似 WorkBuddy 理念的、轻量级的自定义 AI 助手系统。核心工作流类比 想象你要做一份行业报告用户提问。Agent你接到任务。你发现需要最新数据知识缺口于是决定检索RAG——去行业数据库向量库搜索相关报告和统计数据相关文档片段。拿到资料后你需要分析数据这调用的是你的分析技能Skill——可能是用 Excel 或 Python 进行数据处理。最后你综合检索到的资料和分析结果运用你的写作能力LLM生成完整的报告最终回答。理解了这套流程再看代码就不会觉得是一团乱麻了。3. 环境准备与前置条件我们将使用 Python 作为开发语言因为它拥有最丰富的 AI 开发生态。项目将整合 LangChainAgent/Tool 框架、Chroma轻量级向量数据库和 OpenAI API作为 LLM 大脑。你也可以替换为其他开源模型如通义千问、DeepSeek 的 API。操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04)。本文命令以 macOS/Linux 的 bash 为例Windows 用户可在 PowerShell 或 WSL 中运行。Python 版本请确保安装Python 3.8 至 3.11版本。Python 3.12 可能存在某些库的兼容性问题。在终端输入python --version或python3 --version检查。核心依赖库我们将通过requirements.txt文件管理。主要包含langchainlangchain-community: Agent 和 Tool 的核心框架。langchain-openai: 用于连接 OpenAI 系列模型。chromadb: 向量数据库用于存储和检索文档向量。tiktoken: OpenAI 模型的 Token 计数器。pypdf/unstructured: 用于解析 PDF、Word 等文档。python-dotenv: 管理环境变量保护你的 API Key。API 密钥你需要准备一个OpenAI API Key。如果你希望完全免费需要寻找兼容 OpenAI API 协议的开源模型服务并相应调整代码中的base_url等参数。切记API Key 是敏感信息绝不能提交到代码仓库4. 项目结构与核心流程拆解我们先来看整个项目的目录结构这能帮你建立宏观认知workbuddy_demo/ ├── .env # 存储环境变量如API KEY ├── requirements.txt # 项目依赖列表 ├── app.py # 主程序入口 ├── core/ # 核心模块 │ ├── __init__.py │ ├── agent_builder.py # 构建Agent的核心逻辑 │ └── skills/ # 技能包目录 │ ├── __init__.py │ ├── weather.py # 查询天气技能 │ ├── calculator.py # 计算器技能 │ └── rag_skill.py # 知识库问答技能 ├── knowledge_base/ # 知识库相关 │ ├── docs/ # 存放原始文档PDF、TXT等 │ ├── vector_store/ # 向量数据库存储目录自动生成 │ └── builder.py # 知识库构建脚本 └── utils/ # 工具函数 └── __init__.py核心流程分为两大阶段阶段一知识库构建离线将你的文档如产品手册、公司制度放入knowledge_base/docs/。运行构建脚本脚本会读取文档、切分文本、调用 Embedding 模型生成向量并存入 Chroma 向量数据库。这个过程通常只需执行一次除非文档更新。阶段二助手运行在线启动主程序app.py。程序初始化 LLM连接 OpenAI、加载定义好的技能Skill、加载向量数据库RAG。将技能和 RAG 检索器都封装成 Agent 可用的工具Tool。创建一个具备“思考-行动”能力的 Agent例如 LangChain 的ReActAgent。进入对话循环等待用户输入。对于每个用户问题Agent 会决定是直接回答还是调用某个技能或是先检索知识库。执行行动获取结果并返回给用户。接下来我们进入具体的代码实现环节。5. 完整示例与代码实现5.1 环境配置与依赖安装首先创建项目目录并初始化虚拟环境强烈推荐避免包冲突。# 创建项目目录 mkdir workbuddy_demo cd workbuddy_demo # 创建虚拟环境Python 3.8 python -m venv venv # 激活虚拟环境 # macOS/Linux: source venv/bin/activate # Windows: # venv\Scripts\activate # 创建 requirements.txt 文件编辑requirements.txt填入以下内容langchain0.1.0 langchain-community0.0.10 langchain-openai0.0.5 chromadb0.4.18 tiktoken0.5.1 pypdf3.17.4 unstructured0.11.2 python-dotenv1.0.0 openai1.6.1安装依赖pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple创建.env文件来安全地存储你的 OpenAI API Key# .env 文件内容 OPENAI_API_KEY你的实际API密钥 OPENAI_BASE_URLhttps://api.openai.com/v1 # 如果使用官方API则保持默认若使用其他兼容服务则修改此处5.2 构建知识库RAG 核心我们将实现一个知识库构建脚本knowledge_base/builder.py。# knowledge_base/builder.py import os from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from dotenv import load_dotenv # 加载环境变量 load_dotenv() def build_knowledge_base(): 构建知识库加载文档 - 分割文本 - 生成向量 - 存入向量数据库 # 1. 定义文档路径和向量库路径 docs_directory ./knowledge_base/docs persist_directory ./knowledge_base/vector_store # 2. 加载文档支持PDF和TXT loaders [] if os.path.exists(os.path.join(docs_directory, *.pdf)): pdf_loader DirectoryLoader(docs_directory, glob**/*.pdf, loader_clsPyPDFLoader) loaders.append(pdf_loader) if os.path.exists(os.path.join(docs_directory, *.txt)): txt_loader DirectoryLoader(docs_directory, glob**/*.txt, loader_clsTextLoader) loaders.append(txt_loader) documents [] for loader in loaders: documents.extend(loader.load()) if not documents: print(未在 knowledge_base/docs/ 目录下找到任何 .pdf 或 .txt 文件。) return print(f已加载 {len(documents)} 个文档。) # 3. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个文本块的大小 chunk_overlap50, # 块之间的重叠部分保持上下文连贯 separators[\n\n, \n, 。, , , , , , ] ) splits text_splitter.split_documents(documents) print(f文档被分割成 {len(splits)} 个文本块。) # 4. 生成向量并存入数据库 # 使用 OpenAI 的 Embedding 模型需要 API Key embeddings OpenAIEmbeddings( modeltext-embedding-3-small, # 性价比高的模型 openai_api_keyos.getenv(OPENAI_API_KEY), openai_api_baseos.getenv(OPENAI_BASE_URL, https://api.openai.com/v1) ) # 创建向量存储。如果已存在会加载现有库否则新建。 vectordb Chroma.from_documents( documentssplits, embeddingembeddings, persist_directorypersist_directory ) vectordb.persist() # 持久化到磁盘 print(f知识库构建完成向量已保存至: {persist_directory}) if __name__ __main__: build_knowledge_base()关键逻辑解释文档加载使用 LangChain 的DirectoryLoader自动扫描docs/目录下的 PDF 和 TXT 文件。文本分割这是 RAG 效果的关键。大文档必须切分成小块以便检索。chunk_size500表示每块约500字符chunk_overlap50让相邻块有部分重叠防止在句子中间切断。向量化与存储使用OpenAIEmbeddings将文本块转换为向量。Chroma.from_documents方法一次性完成向量化并存入本地目录vector_store/。persist()确保数据写入磁盘。运行构建脚本 在项目根目录下执行python knowledge_base/builder.py确保你的.env文件已正确配置 API Key。运行成功后knowledge_base/vector_store/目录下会生成一些数据文件。5.3 实现自定义技能Skill我们实现两个简单的技能和一个复杂的 RAG 技能。技能一查询天气模拟# core/skills/weather.py from typing import Optional from langchain.tools import tool tool def get_weather(city: str, date: Optional[str] None) - str: 获取指定城市的天气信息。 这是一个模拟函数实际项目中应调用真实的天气API。 Args: city: 城市名例如“北京”、“上海”。 date: 日期格式 YYYY-MM-DD。默认为今天。 Returns: 该城市的天气情况描述字符串。 # 模拟数据真实场景替换为 API 调用 weather_data { 北京: {today: 晴15~25°C微风, tomorrow: 多云16~26°C}, 上海: {today: 小雨18~22°C东风3级, tomorrow: 阴19~23°C}, 深圳: {today: 雷阵雨25~30°C南风2级, tomorrow: 多云26~31°C}, } if city not in weather_data: return f抱歉未找到{city}的天气信息。 forecast weather_data[city] if date: # 简单模拟真实项目需解析日期 return f{city}在{date}的天气情况模拟: {forecast.get(tomorrow, forecast[today])} else: return f{city}今天的天气模拟: {forecast[today]}技能二简易计算器# core/skills/calculator.py from langchain.tools import tool import ast import operator as op # 定义安全的运算符 allowed_operators {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, ast.Div: op.truediv} def safe_eval(expr): 安全地评估一个简单的数学表达式字符串。 try: node ast.parse(expr, modeeval).body if isinstance(node, ast.BinOp): left safe_eval(expr[:node.left.col_offset]) right safe_eval(expr[node.right.col_offset:]) return allowed_operators[type(node.op)](left, right) elif isinstance(node, ast.Num): return node.n elif isinstance(node, ast.UnaryOp) and isinstance(node.op, ast.USub): return -safe_eval(expr[node.operand.col_offset:]) else: raise ValueError(f不支持的表达式: {expr}) except Exception as e: raise ValueError(f无法计算表达式 {expr}: {e}) tool def calculate(expression: str) - str: 计算一个简单的数学表达式。支持加减乘除。 注意这是一个简化版复杂表达式请使用专业工具。 Args: expression: 数学表达式例如 3 5 * 2。 Returns: 计算结果字符串。 try: # 使用更安全的评估方式这里简化处理 # 实际生产环境应使用更严格的表达式解析库 result eval(expression, {__builtins__: {}}, {}) return f{expression} {result} except Exception as e: return f计算错误: {e}。请检查表达式格式。技能三知识库问答RAG Skill这是将 RAG 系统封装成 Agent 可调用的工具。# core/skills/rag_skill.py import os from langchain.tools import tool from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from langchain.chains import RetrievalQA from dotenv import load_dotenv load_dotenv() # 初始化向量数据库和检索链单例模式避免重复加载 _vector_store None _qa_chain None def get_rag_tool(): 获取RAG问答工具。首次调用时会初始化向量库和QA链。 global _vector_store, _qa_chain if _vector_store is None: # 1. 加载向量数据库 embeddings OpenAIEmbeddings( modeltext-embedding-3-small, openai_api_keyos.getenv(OPENAI_API_KEY), openai_api_baseos.getenv(OPENAI_BASE_URL, https://api.openai.com/v1) ) persist_directory ./knowledge_base/vector_store _vector_store Chroma( persist_directorypersist_directory, embedding_functionembeddings ) # 2. 创建检索器 retriever _vector_store.as_retriever(search_kwargs{k: 3}) # 返回最相关的3个片段 # 3. 创建问答链 llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.1, # 低温度答案更确定 openai_api_keyos.getenv(OPENAI_API_KEY), openai_api_baseos.getenv(OPENAI_BASE_URL, https://api.openai.com/v1) ) _qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 简单地将检索到的文档“塞”给LLM retrieverretriever, return_source_documentsFalse # 为简化不返回源文档 ) tool def query_knowledge_base(question: str) - str: 从内部知识库中查找信息来回答问题。当你需要回答关于特定文档、产品、制度等有明确资料的问题时使用此工具。 注意只能回答知识库中已有的信息对于不知道的请直接说明。 Args: question: 用户提出的问题。 Returns: 基于知识库内容生成的答案。 try: result _qa_chain.invoke({query: question}) return result[result] except Exception as e: return f查询知识库时出错: {e}。请确保知识库已正确构建。 return query_knowledge_base关键逻辑解释装饰器tool这是 LangChain 的标准方式将一个普通 Python 函数包装成 Agent 可以识别和调用的工具。函数的文档字符串docstring至关重要Agent 的 LLM 会阅读它来决定是否以及如何调用该工具。RAG 技能封装get_rag_tool函数返回一个工具。内部使用RetrievalQA链它结合了检索器从向量库找资料和 LLM生成答案。search_kwargs{k: 3}表示每次检索返回最相关的 3 个文本块平衡了信息量和上下文长度。5.4 构建智能体Agent现在我们将所有技能整合起来创建一个真正的 Agent。# core/agent_builder.py import os from langchain_openai import ChatOpenAI from langchain.agents import initialize_agent, AgentType from langchain.memory import ConversationBufferMemory from dotenv import load_dotenv # 导入我们定义的技能 from core.skills.weather import get_weather from core.skills.calculator import calculate from core.skills.rag_skill import get_rag_tool load_dotenv() def create_workbuddy_agent(): 创建并配置一个具备多种技能的智能体WorkBuddy。 # 1. 初始化 LLM大脑 llm ChatOpenAI( modelgpt-3.5-turbo, # 也可使用 gpt-4 获得更强推理能力 temperature0, # 设置为0使输出更确定适合工具调用 openai_api_keyos.getenv(OPENAI_API_KEY), openai_api_baseos.getenv(OPENAI_BASE_URL, https://api.openai.com/v1) ) # 2. 准备工具列表 tools [ get_weather, # 天气查询工具 calculate, # 计算器工具 get_rag_tool() # 知识库问答工具 ] # 3. 添加记忆让 Agent 能记住对话历史 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 4. 初始化 Agent # 使用 ReAct 代理类型它擅长推理和调用工具 agent initialize_agent( toolstools, llmllm, agentAgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, # 适合对话且支持工具的Agent verboseTrue, # 设置为 True 可以看到 Agent 的思考过程调试时非常有用 memorymemory, handle_parsing_errorsTrue, # 优雅地处理解析错误 max_iterations5 # 限制最大迭代次数防止死循环 ) return agent关键逻辑解释LLM 选择与配置ChatOpenAI是 LangChain 对 OpenAI 聊天模型的封装。temperature0让模型输出更稳定这对于需要精确调用工具的场景很重要。工具集成将三个技能函数已用tool装饰放入一个列表。Agent 在运行时LLM 会根据当前对话和问题从这些工具的描述中决定调用哪一个。记忆MemoryConversationBufferMemory会保存整个对话历史让 Agent 具备上下文感知能力能进行多轮对话。Agent 类型CHAT_CONVERSATIONAL_REACT_DESCRIPTION是一种强大的 Agent 类型它结合了 ReAct推理行动框架和对话能力非常适合构建复杂的对话式助手。5.5 主程序入口最后我们创建一个简单的主程序来运行我们的 WorkBuddy。# app.py import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from core.agent_builder import create_workbuddy_agent def main(): print( * 50) print(WorkBuddy 智能助手启动中...) print(我具备以下能力) print( 1. 查询天气模拟) print( 2. 数学计算) print( 3. 基于知识库回答问题需先构建知识库) print(输入 退出 或 quit 结束对话。) print( * 50) # 创建 Agent agent create_workbuddy_agent() while True: try: user_input input(\n你: ).strip() if user_input.lower() in [退出, quit, exit]: print(WorkBuddy: 再见) break if not user_input: continue # 调用 Agent 处理输入 response agent.invoke({input: user_input}) print(fWorkBuddy: {response[output]}) except KeyboardInterrupt: print(\n\n检测到中断退出程序。) break except Exception as e: print(f出错: {e}) if __name__ __main__: main()6. 运行结果与效果验证现在让我们启动助手并测试其核心功能。第一步构建知识库确保在knowledge_base/docs/目录下放置了一些文档例如company_handbook.txt。然后运行python knowledge_base/builder.py看到“知识库构建完成”的输出即表示成功。第二步启动助手在项目根目录下运行python app.py你会看到启动横幅并且因为我们在create_workbuddy_agent()中设置了verboseTrueAgent 的思考过程会打印出来这对于调试和理解其工作原理至关重要。第三步功能测试让我们进行一系列对话测试测试基础对话和计算技能你: 你好请计算一下 (15 7) * 3 等于多少预期输出Agent 会识别出这是一个计算任务调用calculate工具并返回正确结果66。在 verbose 模式下你会看到类似Thought: 用户需要计算一个数学表达式我应该使用计算器工具。Action: calculate, Action Input: (157)*3的日志。测试天气技能你: 北京明天天气怎么样预期输出Agent 调用get_weather工具并返回模拟的北京明天天气信息。测试 RAG 知识库技能假设知识库文档是关于“员工请假制度”的你: 我们公司的年假有多少天预期输出Agent 识别出这是一个需要查询内部知识的问题调用query_knowledge_base工具。该工具会从向量数据库中检索与“年假”相关的文档片段并交给 LLM 生成一个基于这些片段的答案例如“根据公司制度员工累计工作满1年不满10年的年假为5天...”。测试复杂多轮对话与决策你: 我想知道上海今天的天气然后帮我算一下如果我去出差5天住宿费每天500总共要多少预期输出这是一个复合任务。在 verbose 日志中你会看到 Agent 的完整思考链Thought 1: 用户问了两个问题先回答天气。Action 1: 调用get_weather获取上海天气并回复。Thought 2: 用户接着问了出差费用计算。Action 2: 调用calculate计算500 * 5并回复结果。 最终Agent 应该能在一个回复中整合两个答案或者分两条回复。如何验证成功功能正确Agent 能正确识别任务类型并调用对应工具返回合理结果。RAG 有效对于知识库内的问题答案应基于文档内容而不是 LLM 的通用知识对于知识库外的问题Agent 应诚实回答“我不知道”或尝试用其他方式回答。记忆有效在多轮对话中Agent 能引用之前的上下文。例如你问“北京天气如何”它回答后你再问“那上海呢”它应该能理解“上海”指的是天气。7. 常见问题与排查思路在实践过程中你几乎一定会遇到下面这些问题。这里提供了系统的排查思路。问题现象可能原因排查方式解决方案运行builder.py时报错ModuleNotFoundError依赖未安装或虚拟环境未激活。1. 确认终端前缀有(venv)。2. 运行pip list | grep langchain检查关键包。1. 激活虚拟环境source venv/bin/activate。2. 重新安装依赖pip install -r requirements.txt。构建知识库时提示OPENAI_API_KEY未设置.env文件不存在、路径错误或变量名不对。1. 检查项目根目录下是否有.env文件。2. 检查文件内容是否为OPENAI_API_KEYsk-...。1. 确保.env文件在workbuddy_demo/目录下。2. 确认 Key 有效且未过期。Agent 运行后对于任何问题都回答“我不知道”或胡言乱语1. Agent 类型或提示词不适合工具调用。2. 工具的描述docstring不够清晰。3. LLM 温度temperature设置过高。1. 检查agent_builder.py中AgentType的选择。2. 查看 verbose 日志看 Agent 是否在尝试选择工具。3. 检查工具函数的 docstring 是否清晰描述了功能和参数。1. 使用CHAT_CONVERSATIONAL_REACT_DESCRIPTION这类明确支持工具的 Agent。2. 完善工具函数的 docstring让 LLM 能看懂。3. 将 LLM 的temperature设为 0。RAG 技能返回“查询知识库时出错”或答案与文档无关1. 知识库未成功构建或路径错误。2. Embedding 模型与构建时不一致。3. 检索到的文本块不相关。1. 检查knowledge_base/vector_store/目录是否有文件。2. 确认builder.py和rag_skill.py使用的 Embedding 模型一致都是text-embedding-3-small。3. 尝试增加检索数量search_kwargs{k: 5}。1. 重新运行builder.py。2. 统一 Embedding 模型配置。3. 优化文本分割参数chunk_size,chunk_overlap或尝试不同的分割器。Agent 陷入死循环不断重复调用工具Agent 的max_iterations设置过高或 LLM 无法正确解析工具输出。观察 verbose 日志看 Agent 的Thought是否在重复。1. 在initialize_agent中设置max_iterations5或更小。2. 确保工具函数的返回值是清晰的字符串不要包含歧义。调用计算器时复杂表达式计算错误或报安全错误calculate工具使用了简单的eval不安全且功能有限。测试简单表达式35和复杂表达式sin(30)。1. 对于生产环境替换为ast.literal_eval或numexpr等安全库。2. 在工具描述中明确说明支持的操作符。程序运行缓慢1. 每次调用都重新加载向量数据库。2. 网络请求OpenAI API延迟。检查rag_skill.py中是否使用了全局变量来缓存向量库和 QA 链。1. 确保get_rag_tool使用了单例模式代码中已实现。2. 考虑使用更快的 Embedding 模型如本地模型或异步调用。8. 最佳实践与工程建议将原型推进到可用的项目需要关注以下工程化细节1. 技能Tool设计规范单一职责每个技能只做一件事。不要写一个“万能工具”。清晰的描述函数的 docstring 是给 LLM 看的“说明书”必须清晰描述功能、输入参数和输出格式。使用Args:和Returns:部分。健壮的错误处理工具内部必须用try...except捕获异常并返回友好的错误信息避免导致整个 Agent 崩溃。类型注解使用 Python 类型注解如city: str这有助于 LangChain 进行更好的参数解析。2. 提示词Prompt工程我们使用的AgentType内置了不错的提示词。但如果 Agent 表现不佳可以自定义agent_kwargs中的prefix、suffix来调整。在提示词中明确告诉 Agent 工具的调用顺序和限制例如“在回答关于公司内部信息的问题前务必先使用知识库查询工具”。3. 知识库RAG优化文档预处理上传前清理文档格式如页眉页脚、去除无关字符。分块策略chunk_size和chunk_overlap需要根据文档类型调整。法律合同可能需要大块保持条款完整而 FAQ 可能小块更精确。元数据过滤在存储向量时可以附加元数据如文件名、章节检索时可以进行过滤提高精度。重排序Re-ranking简单的向量相似度检索可能不准。可以引入一个轻量级重排序模型对检索到的 Top-K 结果进行二次排序将最相关的结果放在前面。4. 生产环境部署配置管理将模型名称、API Base URL、温度等参数提取到配置文件如config.yaml中便于不同环境切换。密钥安全永远不要将 API Key 硬编码在代码中。使用.env文件或专业的密钥管理服务如 AWS Secrets Manager。日志与监控记录所有的用户查询、Agent 决策、工具调用和最终响应用于分析和优化。监控 API 调用成本和延迟。限流与降级为 OpenAI API 调用设置速率限制并设计降级策略如当主要模型不可用时切换到备用模型或返回缓存答案。5. 扩展方向更多技能集成真实 API如发送邮件、查询数据库、调用企业内部系统。多模态使用 GPT-4V 等视觉模型让 Agent 能“看”图片并描述。智能路由不是所有问题都走 Agent。可以前置一个分类器简单问题直接回答复杂问题再交给 Agent 处理节省成本和时间。评估与迭代建立测试集定期评估 Agent 回答的准确性和有用性根据结果调整提示词、工具或知识库。9. 总结与后续学习方向通过这个完整的项目我们实现了一个微缩版的“WorkBuddy”智能助手。它不仅仅是一个调用 API 的脚本而是一个具备工具调用、知识检索、多轮对话能力的完整 Agent 系统。我们拆解了从环境搭建、知识库构建、技能开发到 Agent 集成的全流程并提供了可运行的代码。本文的核心价值在于揭示了 LLM 应用开发的工程化路径分解问题将复杂的“智能助手”需求分解为 LLM大脑、Tools手脚、Memory记忆、Knowledge知识等组件。选择框架利用 LangChain 这类框架提供的强大抽象Agent、Chain、Tool避免重复造轮子。实现组件用清晰的代码实现每个组件并确保它们能通过标准接口如tool进行交互。集成测试将组件组装起来通过真实的对话场景进行测试和调试利用verboseTrue观察 Agent 的思考链。优化迭代根据测试结果调整提示词、工具描述、RAG 参数等持续提升系统表现。下一步你可以深入探索深入研究 LangChain学习更复杂的 Chain 和 Agent 类型如Plan-and-ExecuteAgent。更换底层模型尝试使用 Claude、通义千问、DeepSeek 或本地部署的 Llama 等模型比较其成本和效果。构建 Web 界面使用 Gradio 或 Streamlit 快速为你的 Agent 搭建一个聊天网页界面。接入真实数据源将技能连接到你的数据库、CRM 或工单系统打造真正有用的办公助手。这个项目代码是一个坚实的起点。建议你将其克隆到本地亲手运行一遍然后尝试修改和添加新功能。真正的理解始于动手实践。当你成功让 Agent 调用第一个真实 API 时你对 LLM 应用开发的认知将完成一次关键的跃迁。
返回列表