建AI Agent:基于RAG與ReAct的智能文檔問答與執(zhí)行系統(tǒng)實(shí)戰(zhàn))
在實(shí)際項(xiàng)目中AI Agent 已經(jīng)從實(shí)驗(yàn)室概念演變?yōu)榻鉀Q復(fù)雜任務(wù)的關(guān)鍵技術(shù)組件。無論是自動(dòng)化客服、智能數(shù)據(jù)分析還是代碼生成與輔助決策一個(gè)設(shè)計(jì)良好的 AI Agent 能夠理解用戶意圖、規(guī)劃任務(wù)步驟、調(diào)用工具并持續(xù)學(xué)習(xí)。然而從零開始構(gòu)建一個(gè)功能完整、魯棒性強(qiáng)的 AI Agent 系統(tǒng)開發(fā)者常常會(huì)陷入概念混淆、工具鏈斷裂、調(diào)試?yán)щy等困境。本文將以一個(gè)可運(yùn)行的“智能文檔問答與執(zhí)行” Agent 為例系統(tǒng)性地拆解其核心組件、實(shí)現(xiàn)路徑和工程化細(xì)節(jié)幫助開發(fā)者理解從 Prompt 工程到工具調(diào)用再到記憶與反思的完整閉環(huán)。我們將使用 Python 作為主要語言結(jié)合主流的大模型接口如 OpenAI GPT 或開源模型和必要的工具庫構(gòu)建一個(gè)能夠讀取本地文檔、理解問題、執(zhí)行代碼或搜索并給出答案的 Agent。通過這個(gè)項(xiàng)目你將掌握 Agent 的核心架構(gòu)、LangChain 等框架的實(shí)戰(zhàn)用法以及如何規(guī)避生產(chǎn)環(huán)境中的常見陷阱。1. 理解 AI Agent 的核心架構(gòu)與工作流在開始編碼之前必須厘清 AI Agent 與普通大模型調(diào)用的本質(zhì)區(qū)別。一個(gè)簡(jiǎn)單的模型調(diào)用是單次、被動(dòng)的問答而 Agent 是主動(dòng)的、具備持續(xù)交互和決策能力的智能體。1.1 Agent 的基本組成模塊一個(gè)典型的 AI Agent 系統(tǒng)通常包含以下核心模塊它們協(xié)同工作形成一個(gè)自主循環(huán)大腦Brain/Core LLM這是 Agent 的決策中心通常是一個(gè)大語言模型LLM。它的核心職責(zé)是理解輸入用戶問題、工具返回結(jié)果、歷史記憶進(jìn)行推理并決定下一步行動(dòng)是直接回答還是調(diào)用某個(gè)工具。我們通常通過精心設(shè)計(jì)的 Prompt 來引導(dǎo) LLM 扮演“規(guī)劃者”和“調(diào)度者”的角色。工具Tools這是 Agent 的手和腳。LLM 本身無法直接操作外部世界工具賦予了它這種能力。工具可以是搜索工具如 SerpAPI、DuckDuckGo Search。計(jì)算工具如 Python REPL執(zhí)行代碼、計(jì)算器。知識(shí)庫工具如基于 RAG檢索增強(qiáng)生成的文檔問答系統(tǒng)。API 調(diào)用工具執(zhí)行特定的 Web API如發(fā)送郵件、查詢數(shù)據(jù)庫、控制智能設(shè)備。記憶Memory這是 Agent 的經(jīng)驗(yàn)。記憶分為短期記憶會(huì)話歷史和長(zhǎng)期記憶向量數(shù)據(jù)庫存儲(chǔ)的關(guān)鍵信息。記憶使得 Agent 能在多輪對(duì)話中保持上下文連貫并基于歷史經(jīng)驗(yàn)優(yōu)化當(dāng)前決策。規(guī)劃與執(zhí)行循環(huán)Planning Execution Loop這是 Agent 的工作流程。它通常遵循“思考-行動(dòng)-觀察”的循環(huán)思考LLM 根據(jù)當(dāng)前目標(biāo)、記憶和可用工具規(guī)劃下一步行動(dòng)例如“我需要先搜索最新的股價(jià)然后計(jì)算平均成本”。行動(dòng)根據(jù)規(guī)劃選擇并調(diào)用一個(gè)具體的工具傳入所需參數(shù)。觀察接收工具的返回結(jié)果可能是成功的數(shù)據(jù)也可能是錯(cuò)誤信息。反思/下一步LLM 結(jié)合觀察結(jié)果判斷目標(biāo)是否完成。若未完成則進(jìn)入下一個(gè)“思考”步驟若完成則生成最終答案返回給用戶。1.2 關(guān)鍵技術(shù)選型為什么是 RAG 和 ReAct 模式從熱搜詞可以看出RAG和Transformer是當(dāng)前構(gòu)建 AI 應(yīng)用的熱點(diǎn)。RAG檢索增強(qiáng)生成它解決了大模型的兩個(gè)核心痛點(diǎn)——知識(shí)更新滯后和“幻覺”生成不準(zhǔn)確信息。RAG 通過將外部知識(shí)庫如你的文檔、手冊(cè)向量化存儲(chǔ)在回答問題時(shí)先進(jìn)行相關(guān)檢索再將檢索到的片段作為上下文提供給 LLM從而生成更準(zhǔn)確、有據(jù)可依的答案。這對(duì)于構(gòu)建企業(yè)級(jí)知識(shí)庫問答 Agent 至關(guān)重要。ReActReasoning Acting這是一種 Prompting 范式它顯式地要求 LLM 將“推理”和“行動(dòng)”步驟以結(jié)構(gòu)化格式如Thought:Action:Observation:輸出。這極大地提升了 Agent 決策的可解釋性和可靠性是構(gòu)建復(fù)雜任務(wù) Agent 的推薦模式。Transformer作為幾乎所有現(xiàn)代 LLM 的底層架構(gòu)理解其自注意力機(jī)制有助于你更好地設(shè)計(jì) Prompt 和理解模型的上下文窗口限制。但在應(yīng)用層我們更多是調(diào)用其 API 或使用預(yù)訓(xùn)練模型。基于以上理解我們的實(shí)戰(zhàn)項(xiàng)目將構(gòu)建一個(gè)具備RAG 知識(shí)庫和代碼執(zhí)行工具的 Agent并采用ReAct模式來驅(qū)動(dòng)其決策循環(huán)。2. 環(huán)境準(zhǔn)備與依賴配置我們將創(chuàng)建一個(gè)獨(dú)立的 Python 項(xiàng)目環(huán)境以確保依賴隔離和可復(fù)現(xiàn)性。2.1 創(chuàng)建項(xiàng)目與虛擬環(huán)境首先在命令行中創(chuàng)建項(xiàng)目目錄并設(shè)置虛擬環(huán)境。推薦使用conda或venv。# 創(chuàng)建項(xiàng)目目錄 mkdir ai_agent_project cd ai_agent_project # 創(chuàng)建并激活 Python 虛擬環(huán)境 (以 venv 為例) python -m venv venv # 在 Windows 上激活 venv\Scripts\activate # 在 macOS/Linux 上激活 source venv/bin/activate激活后命令行提示符前應(yīng)顯示(venv)表示你已進(jìn)入該虛擬環(huán)境。2.2 安裝核心依賴我們將使用LangChain作為 Agent 框架它封裝了工具、記憶、鏈等高級(jí)抽象能極大簡(jiǎn)化開發(fā)。同時(shí)需要安裝向量數(shù)據(jù)庫Chroma輕量級(jí)適合本地開發(fā)和嵌入模型sentence-transformers。創(chuàng)建一個(gè)requirements.txt文件內(nèi)容如下# 核心框架 langchain0.1.0 langchain-community0.0.10 # 社區(qū)工具和集成 langchain-openai0.0.5 # OpenAI 集成 # 向量數(shù)據(jù)庫與嵌入模型 chromadb0.4.22 sentence-transformers2.2.2 # 大模型接口 (這里以 OpenAI 為例也可替換為其他) openai1.12.0 # 其他工具 python-dotenv1.0.0 # 管理環(huán)境變量 jupyter1.0.0 # 可選用于交互式實(shí)驗(yàn)然后安裝所有依賴pip install -r requirements.txt注意langchain版本迭代較快上述版本號(hào)為撰寫本文時(shí)的穩(wěn)定版本。在實(shí)際項(xiàng)目中建議先查看官方文檔確認(rèn)最新兼容版本以避免 API 變更帶來的問題。2.3 配置大模型 API 密鑰為了調(diào)用 LLM如 GPT-4你需要一個(gè) API 密鑰。我們將使用環(huán)境變量來安全地管理它。在項(xiàng)目根目錄創(chuàng)建.env文件。在.env文件中添加你的 OpenAI API 密鑰OPENAI_API_KEYsk-your-actual-api-key-here重要確保.env文件已被添加到.gitignore中切勿提交到版本控制系統(tǒng)。在 Python 代碼中使用python-dotenv加載密鑰from dotenv import load_dotenv import os load_dotenv() # 加載 .env 文件中的環(huán)境變量 openai_api_key os.getenv(OPENAI_API_KEY) if not openai_api_key: raise ValueError(請(qǐng)?jiān)?.env 文件中設(shè)置 OPENAI_API_KEY)如果你希望使用開源模型如 Qwen、Llama則需要相應(yīng)的模型文件和推理庫如transformers,vllm并調(diào)整LangChain的 LLM 初始化部分。本文為簡(jiǎn)化流程以 OpenAI 接口為例。3. 構(gòu)建核心組件RAG 知識(shí)庫與工具我們的 Agent 將擁有兩個(gè)核心工具一個(gè)用于回答基于內(nèi)部文檔的問題RAG另一個(gè)用于執(zhí)行 Python 代碼進(jìn)行計(jì)算或數(shù)據(jù)處理。3.1 實(shí)現(xiàn) RAG 知識(shí)庫工具RAG 工具的工作流程是加載文檔 - 分割文本 - 向量化 - 存儲(chǔ) - 檢索。我們將使用Chroma作為向量數(shù)據(jù)庫sentence-transformers本地模型進(jìn)行嵌入。首先在項(xiàng)目目錄下創(chuàng)建一個(gè)docs文件夾并放入一些示例文檔如product_manual.txt,api_spec.md。然后創(chuàng)建build_rag_tool.py# build_rag_tool.py from langchain_community.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma from langchain.tools.retriever import create_retriever_tool def create_rag_tool(persist_directory./chroma_db): 創(chuàng)建并返回一個(gè)基于本地文檔的 RAG 檢索工具。 # 1. 加載文檔 documents [] doc_files [./docs/product_manual.txt, ./docs/api_spec.md] # 你的文檔路徑 for file_path in doc_files: try: loader TextLoader(file_path, encodingutf-8) documents.extend(loader.load()) except FileNotFoundError: print(f警告未找到文件 {file_path}請(qǐng)確保文檔已放置。) # 創(chuàng)建示例文檔 with open(file_path, w, encodingutf-8) as f: f.write(f這是 {file_path} 的示例內(nèi)容。AI Agent 可以通過 RAG 工具檢索到這里的信息。) loader TextLoader(file_path, encodingutf-8) documents.extend(loader.load()) # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每個(gè)文本塊的大小 chunk_overlap50 # 塊之間的重疊部分保持上下文 ) splits text_splitter.split_documents(documents) # 3. 創(chuàng)建嵌入模型和向量數(shù)據(jù)庫 # 使用本地嵌入模型無需額外 API 調(diào)用 embeddings HuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2) # 持久化向量數(shù)據(jù)庫到本地目錄 vectorstore Chroma.from_documents( documentssplits, embeddingembeddings, persist_directorypersist_directory ) vectorstore.persist() # 4. 創(chuàng)建檢索器 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 返回最相關(guān)的3個(gè)片段 # 5. 將檢索器包裝成 LangChain Tool rag_tool create_retriever_tool( retriever, search_company_docs, 當(dāng)用戶的問題涉及公司產(chǎn)品、API規(guī)范或內(nèi)部文檔時(shí)使用此工具查找相關(guān)信息。輸入應(yīng)該是具體的問題或關(guān)鍵詞。 ) return rag_tool if __name__ __main__: # 測(cè)試構(gòu)建過程 tool create_rag_tool() print(fRAG 工具創(chuàng)建成功: {tool.name})運(yùn)行此腳本將生成向量數(shù)據(jù)庫并返回一個(gè)工具對(duì)象。工具描述“當(dāng)用戶的問題涉及...時(shí)使用”至關(guān)重要LLM 會(huì)根據(jù)描述決定是否調(diào)用該工具。3.2 實(shí)現(xiàn) Python 代碼執(zhí)行工具LangChain 社區(qū)提供了現(xiàn)成的PythonREPLTool它可以在一個(gè)安全的沙箱環(huán)境中執(zhí)行 Python 代碼。# 在 main_agent.py 或類似文件中引入 from langchain_community.tools import PythonREPLTool python_tool PythonREPLTool( namepython_repl, description當(dāng)你需要進(jìn)行計(jì)算、數(shù)據(jù)分析、字符串操作或運(yùn)行任何Python代碼時(shí)使用此工具。 輸入應(yīng)該是一段有效的Python代碼字符串。工具會(huì)返回代碼的執(zhí)行結(jié)果或錯(cuò)誤信息。 注意不要用它執(zhí)行危險(xiǎn)操作如刪除文件、訪問網(wǎng)絡(luò)。 )警告在生產(chǎn)環(huán)境中直接執(zhí)行任意 Python 代碼極其危險(xiǎn)。必須進(jìn)行嚴(yán)格的沙箱隔離、資源限制和代碼審查。開發(fā)環(huán)境用于演示工作流但上線前必須替換為更安全的方案如限制可調(diào)用的特定函數(shù)或使用 Docker 容器。4. 組裝 AI Agent 并實(shí)現(xiàn) ReAct 循環(huán)現(xiàn)在我們將大腦LLM、工具和記憶組裝起來創(chuàng)建一個(gè)具備 ReAct 推理能力的 Agent。4.1 初始化 LLM 和工具列表# main_agent.py from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain.prompts import PromptTemplate from build_rag_tool import create_rag_tool from langchain_community.tools import PythonREPLTool load_dotenv() # 1. 初始化 LLM # 使用 gpt-3.5-turbo 以控制成本對(duì)于復(fù)雜任務(wù)可升級(jí)至 gpt-4 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, openai_api_keyos.getenv(OPENAI_API_KEY)) # temperature0 使輸出更確定適合任務(wù)執(zhí)行 # 2. 準(zhǔn)備工具列表 rag_tool create_rag_tool() # 從上一節(jié)創(chuàng)建 python_tool PythonREPLTool() tools [rag_tool, python_tool] # 3. 定義 ReAct 提示模板 # LangChain 提供了默認(rèn)的 ReAct 模板但我們也可以自定義以更好地適應(yīng)任務(wù) react_prompt PromptTemplate.from_template( 你是一個(gè)智能助手可以訪問以下工具 {tools} 請(qǐng)嚴(yán)格按照以下格式回答 Thought: 你需要思考當(dāng)前情況決定是否需要使用工具以及使用哪個(gè)工具。 Action: 需要使用的工具名稱必須是[{tool_names}]中的一個(gè)。 Action Input: 提供給工具的輸入內(nèi)容。 Observation: 工具返回的結(jié)果。 ... (這個(gè) Thought/Action/Action Input/Observation 循環(huán)可以重復(fù)多次) 當(dāng)你認(rèn)為已經(jīng)獲得足夠信息來回答用戶問題時(shí)或者無需使用工具時(shí)請(qǐng)使用以下格式 Thought: 我現(xiàn)在可以給出最終答案了。 Final Answer: [你的最終回答] 開始 用戶問題: {input} {agent_scratchpad} # LangChain 會(huì)自動(dòng)將歷史步驟填充到這里 )4.2 創(chuàng)建 Agent 執(zhí)行器并運(yùn)行# 接 main_agent.py # 4. 創(chuàng)建 Agent agent create_react_agent(llm, tools, react_prompt) # 5. 創(chuàng)建執(zhí)行器并開啟詳細(xì)日志和錯(cuò)誤處理 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 打印詳細(xì)的 Thought/Action/Observation 日志便于調(diào)試 handle_parsing_errorsTrue, # 處理 LLM 輸出格式解析錯(cuò)誤 max_iterations5, # 限制最大循環(huán)次數(shù)防止無限循環(huán) early_stopping_methodgenerate, # 當(dāng) LLM 輸出 Final Answer 時(shí)停止 ) # 6. 運(yùn)行 Agent 測(cè)試 if __name__ __main__: test_questions [ “我們產(chǎn)品的退貨政策是什么” # 預(yù)期觸發(fā) RAG 工具 “計(jì)算 15 的階乘是多少” # 預(yù)期觸發(fā) Python 工具 “先查一下我們 API 的速率限制然后告訴我每天調(diào)用 10000 次需要多少小時(shí)。” # 預(yù)期觸發(fā) RAG然后 Python 計(jì)算 ] for question in test_questions: print(f\n{*50}) print(f用戶問題: {question}) print(f{*50}) try: result agent_executor.invoke({input: question}) print(f\n最終結(jié)果: {result[output]}) except Exception as e: print(f執(zhí)行出錯(cuò): {e})運(yùn)行python main_agent.py你將在控制臺(tái)看到類似以下的詳細(xì)輸出清晰地展示了 Agent 的思考過程 用戶問題: 計(jì)算 15 的階乘是多少 Thought: 用戶需要計(jì)算一個(gè)數(shù)學(xué)問題。我有 Python 代碼執(zhí)行工具可以完成這個(gè)任務(wù)。 Action: python_repl Action Input: import math\nmath.factorial(15) Observation: 1307674368000 Thought: 我已經(jīng)得到了計(jì)算結(jié)果可以給出最終答案。 Final Answer: 15 的階乘是 1307674368000。 最終結(jié)果: 15 的階乘是 1307674368000。5. 關(guān)鍵配置、參數(shù)詳解與生產(chǎn)環(huán)境考量5.1 核心參數(shù)調(diào)優(yōu)表組件參數(shù)默認(rèn)/示例值作用與影響生產(chǎn)環(huán)境建議文本分割器chunk_size500每個(gè)文本塊的長(zhǎng)度。太小丟失上下文太大檢索不準(zhǔn)。根據(jù)文檔類型調(diào)整。技術(shù)文檔可設(shè) 800-1000對(duì)話記錄可設(shè) 200-300。chunk_overlap50塊間重疊字符數(shù)。有助于保持語義連貫。通常設(shè)為chunk_size的 10%-20%。向量檢索search_kwargs[“k”]3每次檢索返回的文本塊數(shù)量。根據(jù)答案精度要求調(diào)整。增加k能提供更多上下文但可能引入噪聲。通常 3-5。LLMtemperature0生成隨機(jī)性。0 最確定越高越有創(chuàng)意。任務(wù)執(zhí)行型 Agent 設(shè)為 0 或接近 0如 0.1。創(chuàng)意生成型可適當(dāng)提高。modelgpt-3.5-turbo模型版本。影響能力與成本。復(fù)雜推理、長(zhǎng)上下文任務(wù)用gpt-4-turbo。簡(jiǎn)單任務(wù)用gpt-3.5-turbo控制成本。Agent執(zhí)行器max_iterations5Agent 最大思考-行動(dòng)循環(huán)次數(shù)。防止死循環(huán)。根據(jù)任務(wù)復(fù)雜度設(shè)置通常 5-10。可結(jié)合超時(shí)時(shí)間控制。verboseTrue是否打印詳細(xì)步驟日志。開發(fā)調(diào)試設(shè)為True生產(chǎn)環(huán)境設(shè)為False并通過結(jié)構(gòu)化日志記錄。5.2 生產(chǎn)環(huán)境必須處理的工程問題錯(cuò)誤處理與穩(wěn)定性工具調(diào)用失敗網(wǎng)絡(luò)超時(shí)、API 限流、工具內(nèi)部錯(cuò)誤。Agent 執(zhí)行器應(yīng)能捕獲異常并將錯(cuò)誤信息作為Observation反饋給 LLM讓其嘗試其他方案或優(yōu)雅失敗。LLM 輸出格式錯(cuò)誤LLM 可能不按 ReAct 格式輸出。handle_parsing_errorsTrue是基礎(chǔ)更健壯的做法是加入輸出格式校驗(yàn)和重試機(jī)制。# 示例簡(jiǎn)單的重試裝飾器 from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def robust_agent_invoke(question): return agent_executor.invoke({input: question})安全與權(quán)限代碼執(zhí)行沙箱PythonREPLTool絕不可直接用于生產(chǎn)。必須使用如Docker容器隔離、資源限制CPU、內(nèi)存、運(yùn)行時(shí)間、禁用危險(xiǎn)模塊如os,subprocess,sys的部分功能的沙箱環(huán)境。敏感信息API 密鑰、數(shù)據(jù)庫密碼等必須通過環(huán)境變量或密鑰管理服務(wù)如 AWS Secrets Manager獲取嚴(yán)禁硬編碼。用戶輸入凈化防止 Prompt 注入攻擊。對(duì)用戶輸入進(jìn)行基本的過濾和轉(zhuǎn)義避免其篡改系統(tǒng) Prompt。性能與成本緩存對(duì)頻繁相同的查詢?nèi)绯R妴栴}的 LLM 響應(yīng)和工具調(diào)用結(jié)果進(jìn)行緩存可使用LangChain的LLMCache或外部緩存如 Redis。異步調(diào)用如果工具調(diào)用是 IO 密集型如網(wǎng)絡(luò)請(qǐng)求使用異步 Agent 執(zhí)行器提升吞吐量。Token 消耗監(jiān)控記錄每次調(diào)用的輸入/輸出 Token 數(shù)設(shè)置預(yù)算告警。對(duì)于 RAG優(yōu)化檢索到的文本塊長(zhǎng)度和數(shù)量是控制 Token 的關(guān)鍵??捎^測(cè)性結(jié)構(gòu)化日志記錄完整的 Agent 執(zhí)行軌跡Thought, Action, Observation便于事后分析和調(diào)試復(fù)雜問題。鏈路追蹤為每個(gè)用戶會(huì)話分配唯一 ID貫穿所有工具調(diào)用和 LLM 請(qǐng)求方便定位問題。關(guān)鍵指標(biāo)監(jiān)控成功率、平均響應(yīng)時(shí)間、工具調(diào)用分布、Token 消耗速率。6. 常見問題排查與調(diào)試指南在開發(fā)過程中你可能會(huì)遇到以下典型問題。這里提供排查思路。6.1 Agent 不調(diào)用工具直接回答問題現(xiàn)象對(duì)于明顯需要工具的問題如“計(jì)算...”、“查詢文檔...”Agent 直接猜測(cè)回答不輸出Action??赡茉蚺c解決工具描述不清檢查工具Tool的description字段。描述必須清晰說明工具的用途和適用場(chǎng)景。LLM 僅根據(jù)描述決定是否調(diào)用。修改描述使其更精確匹配問題類型。Prompt 引導(dǎo)不足ReAct 提示模板可能不夠強(qiáng)調(diào)工具使用。在 Prompt 的開頭部分明確指令如“你必須使用工具來獲取準(zhǔn)確信息嚴(yán)禁猜測(cè)”。LLM 能力不足gpt-3.5-turbo在復(fù)雜規(guī)劃上可能不如gpt-4。嘗試切換模型或簡(jiǎn)化任務(wù)。6.2 RAG 檢索結(jié)果不相關(guān)現(xiàn)象Agent 調(diào)用了 RAG 工具但返回的文檔片段與問題無關(guān)導(dǎo)致最終答案錯(cuò)誤??赡茉蚺c解決文本分割不當(dāng)chunk_size可能太大導(dǎo)致一個(gè)文本塊包含多個(gè)不相關(guān)主題。嘗試減小chunk_size或使用基于語義的分割器如SemanticChunker。嵌入模型不匹配用于構(gòu)建索引的嵌入模型與查詢時(shí)使用的模型不一致雖然代碼中是一個(gè)。確保生產(chǎn)環(huán)境部署時(shí)構(gòu)建和查詢階段加載的是同一個(gè)模型文件。檢索策略單一嘗試混合檢索策略如結(jié)合關(guān)鍵詞搜索BM25和向量搜索相似度LangChain的EnsembleRetriever可以做到。查詢改寫用戶問題可能太口語化。在檢索前先用一個(gè) LLM 將用戶問題改寫成更利于檢索的關(guān)鍵詞或陳述句。6.3 Agent 陷入無限循環(huán)或達(dá)到最大迭代次數(shù)現(xiàn)象控制臺(tái)不斷打印Thought/Action/Observation直到max_iterations用盡??赡茉蚺c解決工具輸出未滿足 LLM 預(yù)期LLM 根據(jù)Observation決定下一步。如果工具返回的結(jié)果格式混亂、包含錯(cuò)誤信息或未提供關(guān)鍵數(shù)據(jù)LLM 可能無法理解從而反復(fù)嘗試。確保工具返回清晰、結(jié)構(gòu)化的結(jié)果。任務(wù)過于復(fù)雜或定義模糊LLM 無法規(guī)劃出清晰的解決路徑。嘗試將用戶問題拆分成更小、更具體的子任務(wù)或者引導(dǎo)用戶提供更明確的輸入。缺少“最終答案”的強(qiáng)引導(dǎo)在 Prompt 中強(qiáng)化“當(dāng)你獲得答案后必須使用Final Answer:格式”的指令。6.4 性能慢響應(yīng)延遲高現(xiàn)象Agent 響應(yīng)一個(gè)簡(jiǎn)單問題也需要數(shù)秒甚至更久。可能原因與解決順序執(zhí)行工具調(diào)用如果是網(wǎng)絡(luò)請(qǐng)求如搜索順序執(zhí)行會(huì)累積延遲??紤]使用異步 Agent (create_react_agent支持異步) 來并行執(zhí)行可獨(dú)立運(yùn)行的工具調(diào)用。LLM 響應(yīng)慢檢查是否是 GPT API 響應(yīng)慢或者本地開源模型加載/推理慢。考慮使用流式響應(yīng)Streaming先返回部分結(jié)果或?qū)δP瓦M(jìn)行量化、加速。向量檢索慢如果文檔庫很大Chroma 的檢索可能變慢??紤]使用更高效的向量數(shù)據(jù)庫如Pinecone,Weaviate云服務(wù)或本地的FAISS優(yōu)化索引或引入緩存層。7. 擴(kuò)展方向與最佳實(shí)踐7.1 擴(kuò)展 Agent 能力更多工具集成網(wǎng)絡(luò)搜索、數(shù)據(jù)庫查詢、內(nèi)部系統(tǒng) API、文件操作等。確保每個(gè)工具都有清晰、安全的邊界。記憶機(jī)制會(huì)話記憶使用ConversationBufferMemory或ConversationSummaryMemory讓 Agent 記住當(dāng)前對(duì)話歷史。長(zhǎng)期記憶將重要的交互結(jié)果向量化后存入另一個(gè)專門的向量庫供未來檢索參考實(shí)現(xiàn)持續(xù)學(xué)習(xí)。多 Agent 協(xié)作創(chuàng)建具有不同專長(zhǎng)如分析、寫作、審核的多個(gè) Agent讓它們通過消息隊(duì)列或協(xié)調(diào)器協(xié)同完成復(fù)雜工作流。7.2 從開發(fā)到生產(chǎn)的 checklist在將 Agent 系統(tǒng)部署上線前請(qǐng)逐一核對(duì)以下清單[ ]安全代碼執(zhí)行是否已被嚴(yán)格沙箱化用戶輸入是否經(jīng)過過濾敏感配置是否已移出代碼[ ]穩(wěn)定性是否對(duì) LLM API 調(diào)用、工具調(diào)用設(shè)置了超時(shí)和重試是否有熔斷機(jī)制[ ]可觀測(cè)性是否集成了日志、指標(biāo)Metrics和分布式追蹤Tracing能否看到一次請(qǐng)求的完整 Agent 決策鏈[ ]成本控制是否對(duì) Token 消耗進(jìn)行了監(jiān)控和告警是否對(duì)高成本操作如調(diào)用 GPT-4設(shè)置了頻率限制[ ]數(shù)據(jù)隱私用戶數(shù)據(jù)、公司文檔在向量化、存儲(chǔ)、傳輸過程中是否符合合規(guī)要求[ ]性能測(cè)試是否在模擬負(fù)載下測(cè)試過系統(tǒng)的響應(yīng)時(shí)間和資源消耗CPU、內(nèi)存[ ]回滾方案新版本 Agent 出現(xiàn)嚴(yán)重問題時(shí)是否能快速回退到舊版本構(gòu)建 AI Agent 是一個(gè)迭代過程從最小可行產(chǎn)品MVP開始聚焦解決一個(gè)具體問題然后逐步增加工具、優(yōu)化 Prompt、完善記憶和錯(cuò)誤處理。始終以實(shí)際任務(wù)完成度和用戶體驗(yàn)為核心指標(biāo)而非盲目追求技術(shù)的復(fù)雜性。通過本文的實(shí)戰(zhàn)框架你可以快速搭建起自己的第一個(gè) Agent并在此基礎(chǔ)上探索更廣闊的應(yīng)用場(chǎng)景。