从提示词工程到智能体构建:LLM应用开发全链路实战指南

📅 2026/8/5 9:01:58
从提示词工程到智能体构建:LLM应用开发全链路实战指南
在构建大模型应用时你是否遇到过这样的困境精心设计的提示词Prompt效果时好时坏模型输出不稳定想要让AI根据你的私有知识库回答问题却不知如何高效整合或者想构建一个能自主调用工具、完成复杂任务的智能体Agent却被状态管理和流程编排搞得焦头烂额这些正是当前LLM应用开发的核心痛点。本文将以吴恩达教授倡导的“以数据为中心”的AI开发理念为指引系统性地拆解从提示词工程Prompt Engineering到复杂智能体Agent构建的全链路实战方案。我们将从最基础的提示词设计原则讲起逐步深入到检索增强生成RAG系统的搭建并最终使用LangGraph框架构建一个具备状态记忆和工具调用能力的智能体。文章包含大量可直接复用的代码示例、配置细节和避坑指南无论你是刚接触LLM的开发者还是希望优化现有应用的工程师都能从中获得一套清晰、可落地的工程化解决方案。1. 核心概念与技术全景在深入代码之前我们有必要厘清几个关键概念及其在LLM应用开发生态中的位置。这有助于我们理解为何要选择特定的工具链和技术栈。1.1 提示词工程与大模型沟通的艺术提示词工程Prompt Engineering并非简单的“咒语”编写而是一门系统性的沟通科学。其核心目标是设计出能够稳定、精确地引导大语言模型LLM生成预期输出的文本指令。一个优秀的提示词通常包含以下几个要素角色Role为模型设定一个身份如“你是一位经验丰富的Python软件工程师”。任务Task清晰、无歧义地描述需要模型完成的具体工作。上下文Context提供完成任务所必需的背景信息或约束条件。输出格式Format明确指定输出的结构如JSON、Markdown、列表等。为什么需要它因为LLM本质上是基于概率生成文本模糊的指令会导致输出的随机性大增。通过系统化的提示词工程我们可以将这种随机性降至最低使模型的行为更可控、更可靠这是所有上层应用如RAG、Agent稳定运行的基础。1.2 RAG为模型注入专属知识检索增强生成Retrieval-Augmented Generation, RAG解决了大模型的两个固有缺陷知识过时和幻觉问题。其工作原理可以概括为“先检索后生成”索引将私有或最新的文档进行切分、向量化存入向量数据库。检索当用户提问时将问题也向量化并从向量库中找出最相关的文本片段。增强将检索到的相关片段作为上下文与用户问题一同组合成新的提示词提交给LLM。生成LLM基于增强后的、包含准确上下文的提示词生成最终答案。这样模型就能基于你提供的“知识”进行回答答案的准确性和时效性得到了极大保障。RAG是构建企业知识库、智能客服、文档分析等场景的首选架构。1.3 Agent与LangGraph让AI自主行动智能体Agent是指能够理解目标、规划步骤、调用工具如搜索、计算、API并持续执行直至完成任务的LLM应用。与简单的一问一答不同Agent具备“思考-行动-观察”的循环能力。而LangGraph正是为构建这类复杂、有状态的Agent而生的框架。它基于LangChain但核心抽象是“图”Graph。你可以将Agent的工作流程定义为一个由节点Node和边Edge组成的有向图节点代表一个具体的操作如“调用LLM”、“执行工具”、“更新状态”。边定义了操作的流转逻辑通常基于前一个节点的输出结果来决定下一步走向哪个节点。LangGraph通过显式地管理一个“状态”State对象在节点间传递和更新信息完美解决了多轮对话、工具调用序列、复杂业务流程编排等场景下的状态管理难题。相比之下传统的链Chain式调用更适合线性、无状态的简单任务。2. 环境准备与工具选型工欲善其事必先利其器。我们将使用一个主流且高效的组合来搭建我们的开发环境。2.1 基础环境与Python设置建议使用Python 3.10或3.11版本以获得最佳的库兼容性。首先创建一个独立的虚拟环境这是管理项目依赖的最佳实践。# 创建项目目录并进入 mkdir llm-application-guide cd llm-application-guide # 创建虚拟环境以venv为例 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate2.2 核心库安装我们将通过requirements.txt文件来管理依赖。以下是本项目所需的核心库及其作用说明。# requirements.txt # 1. LLM 交互与核心框架 openai1.0.0 # OpenAI官方SDK用于调用GPT系列模型 langchain0.1.0 # LLM应用开发框架提供链、代理等高级抽象 langchain-openai0.0.2 # LangChain的OpenAI集成 langgraph0.0.50 # 用于构建有状态、多步骤的智能体工作流 # 2. 嵌入模型与向量数据库 (RAG核心) langchain-community # 包含许多社区维护的组件如文本加载器 sentence-transformers2.2.2 # 用于本地运行嵌入模型生成文本向量 chromadb0.4.0 # 轻量级、易用的向量数据库用于存储和检索向量 # 3. 工具与工具调用 langchain-experimental # 包含一些实验性但非常有用的功能如智能体工具 requests2.31.0 # 用于Agent可能调用的网络请求工具 # 4. 开发与调试 python-dotenv1.0.0 # 用于从.env文件加载环境变量如API密钥 jupyter1.0.0 # 可选用于交互式实验和演示使用pip命令安装所有依赖pip install -r requirements.txt2.3 配置API密钥与环境变量为了安全地管理像OpenAI API Key这样的敏感信息强烈建议使用环境变量。在项目根目录创建一个名为.env的文件。# .env # 你的OpenAI API密钥请前往OpenAI平台申请 OPENAI_API_KEYsk-your-actual-openai-api-key-here # 可选如果你使用其他模型服务如Azure OpenAI或 Anthropic # AZURE_OPENAI_API_KEY... # ANTHROPIC_API_KEY...在代码中使用python-dotenv来加载这些配置。# config.py import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的所有变量 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY 环境变量)重要安全提示务必确保.env文件被添加到.gitignore中避免将密钥意外提交到公开代码仓库。# .gitignore .env __pycache__/ *.pyc venv/3. 提示词工程实战从原则到高级技巧掌握了基础概念后我们从最核心的提示词工程开始动手。我们将使用OpenAI的GPT-4模型作为示例。3.1 基础提示词构造首先我们来看一个糟糕的提示词和一个遵循最佳实践的提示词的对比。# example_bad_prompt.py from openai import OpenAI client OpenAI(api_keyOPENAI_API_KEY) # 糟糕的提示词模糊、无结构、要求不明确 bad_prompt 给我写点关于Python的代码。 response client.chat.completions.create( modelgpt-4-turbo-preview, messages[{role: user, content: bad_prompt}] ) print(糟糕提示词的输出开头部分:) print(response.choices[0].message.content[:200] ...\n)输出可能非常宽泛比如介绍Python历史或者写一个“Hello World”这都不是我们想要的。# example_good_prompt.py # 优秀的提示词角色清晰、任务具体、输出格式明确 good_prompt 你是一位资深的Python开发工程师擅长编写清晰、高效且符合PEP 8规范的代码。 任务 请编写一个Python函数用于安全地验证和解析用户输入的电子邮件地址。 具体要求 1. 使用正则表达式进行基础格式验证。 2. 检查邮箱域名是否包含有效的顶级域名如 .com, .org, .net。 3. 函数应返回一个字典包含 is_valid (布尔值) 和 normalized_email (字符串如果有效则返回小写格式否则为None)。 4. 在代码中添加简要的注释。 请只输出最终的Python函数代码不需要任何解释。 response client.chat.completions.create( modelgpt-4-turbo-preview, messages[{role: user, content: good_prompt}], temperature0.2 # 降低随机性使输出更确定 ) print(优秀提示词的输出) print(response.choices[0].message.content)这个提示词结构清晰模型几乎总能返回一个符合要求的、可直接使用的函数代码。3.2 系统提示词与思维链在OpenAI的Chat API中system角色消息用于设定模型的整体行为和身份它对整个会话产生持久影响。# example_system_prompt.py response client.chat.completions.create( modelgpt-4-turbo-preview, messages[ { role: system, content: 你是一个乐于助人且极其严谨的代码助手。你总是将安全性和性能放在首位并在提供代码时详细解释关键决策点。你的回答使用中文。 }, { role: user, content: 如何用Python安全地连接MySQL数据库并执行查询 } ], temperature0.5 ) print(response.choices[0].message.content)思维链Chain-of-Thought, CoT是一种高级技巧通过鼓励模型“逐步思考”来提升复杂推理任务的准确性。在提示词中明确要求模型展示其推理过程。# example_cot.py cot_prompt 用户提出了一个逻辑问题 “一个篮子里有苹果和橘子共12个。苹果比橘子多4个。请问篮子里各有几个苹果和几个橘子” 请按照以下步骤解答 1. 定义变量设苹果数量为 A橘子数量为 O。 2. 根据题意列出方程。 3. 逐步解方程。 4. 给出最终答案并验证是否符合所有条件。 请开始你的解答。 response client.chat.completions.create( modelgpt-4-turbo-preview, messages[{role: user, content: cot_prompt}] ) print(response.choices[0].message.content)3.3 使用LangChain标准化提示词模板在真实项目中提示词往往需要参数化。LangChain的PromptTemplate提供了很好的管理方式。# example_langchain_prompt.py from langchain.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI # 1. 定义提示词模板 system_template 你是一位专业的{domain}专家。 human_template 请用{style}的风格总结以下关于{topic}的关键点\n\n{text} prompt_template ChatPromptTemplate.from_messages([ (system, system_template), (human, human_template) ]) # 2. 格式化提示词 formatted_prompt prompt_template.format_messages( domain机器学习, style简洁的列表, topic过拟合, text过拟合是指模型在训练数据上表现很好但在未见过的测试数据上表现不佳的现象。通常由于模型过于复杂或训练数据不足引起。解决方法包括获取更多数据、正则化、Dropout等。 ) # 3. 调用模型 llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0) response llm.invoke(formatted_prompt) print(response.content)这种方式将提示词的结构与内容分离便于维护和复用。4. 构建RAG系统打造你的专属知识库接下来我们实现一个完整的RAG流水线让LLM能够基于我们提供的文档进行回答。4.1 文档加载与处理我们假设有一个关于公司产品的product_guide.txt文档。# product_guide.txt 产品名称智能办公助手SmartOffice Assistant 最新版本v2.5 核心功能 1. 语音转录与会议纪要支持实时将语音转为文字并自动提炼会议要点和待办事项。 2. 智能日程管理能分析邮件和聊天记录自动识别并添加重要日程到日历。 3. 跨平台文档同步在PC、手机和平板间无缝同步工作文档支持离线编辑。 4. 数据安全所有数据采用端到端加密符合GDPR和等保三级要求。 定价方案 - 基础版免费包含基础语音转录和1GB云存储。 - 专业版每月299元包含所有核心功能100GB云存储优先技术支持。 - 企业版定制报价提供私有化部署、专属客户经理和SLA保障。 技术支持邮箱supportsmartoffice.example.com使用LangChain加载并分割文档。# rag_step1_loading.py from langchain_community.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. 加载文档 loader TextLoader(./product_guide.txt, encodingutf-8) documents loader.load() print(f原始文档数: {len(documents)}) print(f第一段文档内容预览:\n{documents[0].page_content[:200]}...\n) # 2. 分割文档 # 大文档需要切分成小块以适应模型的上下文长度并提高检索精度 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个块的最大字符数 chunk_overlap100, # 块之间的重叠字符保持上下文连贯 separators[\n\n, \n, 。, , , , , ] # 分割符优先级 ) split_docs text_splitter.split_documents(documents) print(f分割后文档块数: {len(split_docs)}) for i, doc in enumerate(split_docs[:2]): # 打印前两个块 print(f--- 块 {i1} ---) print(doc.page_content) print()4.2 向量化与存储我们将使用sentence-transformers生成嵌入向量并用ChromaDB存储。# rag_step2_embedding.py from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma # 1. 初始化嵌入模型 # 使用开源模型无需API调用适合本地开发 embedding_model HuggingFaceEmbeddings( model_nameall-MiniLM-L6-v2, # 轻量且效果不错的句子嵌入模型 model_kwargs{device: cpu}, # 使用CPU有GPU可改为cuda encode_kwargs{normalize_embeddings: True} ) # 2. 将文档块转换为向量并存入数据库 persist_directory ./chroma_db # 向量数据库本地存储路径 vectorstore Chroma.from_documents( documentssplit_docs, embeddingembedding_model, persist_directorypersist_directory ) vectorstore.persist() # 持久化到磁盘 print(f向量数据库已创建并保存至: {persist_directory}) print(f库中文档数量: {vectorstore._collection.count()})4.3 检索与生成现在我们可以进行问答了。流程是检索相关文档 - 组合成增强提示词 - 发送给LLM生成答案。# rag_step3_query.py from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI # 1. 加载已存在的向量数据库 vectorstore Chroma( persist_directory./chroma_db, embedding_functionembedding_model ) # 2. 将向量库转换为检索器 # similarity_search_k 参数控制返回的最相关文档数量 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 3. 初始化LLM llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0) # 4. 创建检索问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 将检索到的所有文档“塞”进上下文 retrieverretriever, return_source_documentsTrue, # 返回源文档便于调试 verboseTrue # 打印详细日志了解内部过程 ) # 5. 进行提问 question 智能办公助手专业版多少钱一个月包含哪些服务 result qa_chain.invoke({query: question}) print(\n *50) print(f问题: {question}) print(*50) print(f答案: {result[result]}) print(\n -*50) print(参考来源:) for i, doc in enumerate(result[source_documents]): print(f[来源{i1}] {doc.page_content[:150]}...)运行上述代码你会看到模型不仅给出了准确的价格299元/月还列出了专业版包含的服务并且答案完全基于我们提供的产品指南有效避免了幻觉。5. 进阶使用LangGraph构建智能体当任务需要多步骤决策、工具调用或状态保持时简单的链就不够用了。我们将用LangGraph构建一个能查询天气并给出建议的智能体。5.1 定义状态与工具首先定义智能体运行过程中需要维护的状态并创建它可调用的工具。# agent_step1_state_tools.py from typing import TypedDict, Annotated, List import operator from langgraph.graph.message import add_messages from datetime import datetime # 1. 定义状态结构 # State是贯穿整个图执行周期的核心对象 class AgentState(TypedDict): messages: Annotated[List, add_messages] # 对话消息历史 location: str # 用户查询的地点 current_date: str # 当前日期 weather_info: str # 查询到的天气信息 suggestion: str # 生成的建议 # 2. 定义工具函数 # 工具是Agent与外界交互的“手” def get_current_date(state: AgentState): 获取当前日期。这是一个模拟工具。 current_date datetime.now().strftime(%Y-%m-%d %A) return {current_date: current_date} def search_weather(state: AgentState): 查询指定地点的天气。这是一个模拟工具真实场景需调用API。 location state[location] # 模拟返回数据 weather_data { 北京: 晴15~25°C微风紫外线强度中等。, 上海: 多云转阴18~22°C东南风3-4级可能有小雨。, 深圳: 雷阵雨24~30°C南风4-5级空气湿度85%。 } info weather_data.get(location, f未找到 {location} 的天气信息。) return {weather_info: info} # 3. 将函数绑定为LangChain可识别的工具 from langchain.tools import tool tool def get_date_tool(): 获取当前日期和星期几。 return get_current_date({}) tool def get_weather_tool(location: str): 查询给定城市的天气情况。 # 注意这里为了简化直接调用模拟函数。实际应将location传入。 return search_weather({location: location})5.2 构建智能体工作流图这是LangGraph的核心定义节点和边组成一个工作流。# agent_step2_graph.py from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain.agents import create_openai_tools_agent, AgentExecutor from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder # 0. 初始化LLM llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0) # 1. 创建Agent # Agent的核心是一个特殊的提示词告诉LLM可以调用哪些工具 prompt ChatPromptTemplate.from_messages([ (system, 你是一个天气生活助手。你的任务是 1. 理解用户想查询哪个地点的天气。 2. 如果需要调用工具获取当前日期和该地点的天气信息。 3. 根据天气信息为用户提供穿衣、出行等生活建议。 请一步步思考并只在必要时调用工具。), MessagesPlaceholder(variable_namemessages), # 历史消息占位符 (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), # 工具调用记录占位符 ]) # 绑定工具 tools [get_date_tool, get_weather_tool] agent create_openai_tools_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue) # 2. 定义图的各个节点函数 def agent_node(state: AgentState): Agent节点分析状态决定下一步是调用工具还是结束。 # 将状态中的消息提取出来作为Agent的输入 input_messages state[messages] # 执行Agent response agent_executor.invoke({input: input_messages[-1].content if input_messages else }) # 将Agent的响应可能是思考过程或工具调用添加到消息历史中 return {messages: [response[output]]} def update_location_node(state: AgentState): 更新地点节点从最新消息中提取用户提到的地点。 # 这是一个简化示例实际应用中可能需要更复杂的NLP来提取实体 last_message state[messages][-1].content # 假设消息格式为“查询[地点]的天气” if 北京 in last_message: location 北京 elif 上海 in last_message: location 上海 elif 深圳 in last_message: location 深圳 else: location 未知 return {location: location} def call_weather_tool_node(state: AgentState): 调用天气工具节点。 result get_weather_tool.invoke({location: state[location]}) return {weather_info: result} def call_date_tool_node(state: AgentState): 调用日期工具节点。 result get_date_tool.invoke({}) return {current_date: result} def final_suggestion_node(state: AgentState): 最终建议节点综合所有信息生成最终回复。 suggestion_prompt f 基于以下信息生成一段友好的天气生活建议 - 日期{state.get(current_date, 未知)} - 地点{state.get(location, 未知)} - 天气{state.get(weather_info, 未知)} 建议应涵盖穿衣、出行、是否带伞等方面语气亲切自然。 response llm.invoke(suggestion_prompt) return {suggestion: response.content, messages: [response]} # 3. 构建图 workflow StateGraph(AgentState) # 添加节点 workflow.add_node(agent, agent_node) workflow.add_node(update_location, update_location_node) workflow.add_node(get_weather, call_weather_tool_node) workflow.add_node(get_date, call_date_tool_node) workflow.add_node(give_suggestion, final_suggestion_node) # 设置入口点 workflow.set_entry_point(agent) # 添加边定义流程逻辑 # 从agent节点出来后根据其输出决定下一步 # 这里简化逻辑总是先更新地点然后获取日期和天气最后给建议 workflow.add_edge(agent, update_location) workflow.add_edge(update_location, get_date) workflow.add_edge(get_date, get_weather) workflow.add_edge(get_weather, give_suggestion) workflow.add_edge(give_suggestion, END) # 编译图 app workflow.compile() # 4. 可视化图需要安装graphviz try: from IPython.display import Image, display display(Image(app.get_graph().draw_mermaid_png())) except: print(Graph compiled successfully. To visualize, run in a notebook environment with graphviz.)5.3 运行与调试智能体现在我们可以运行这个智能体了。# agent_step3_run.py from langchain_core.messages import HumanMessage # 初始化状态 initial_state: AgentState { messages: [HumanMessage(content我想知道深圳今天的天气怎么样)], location: , current_date: , weather_info: , suggestion: } print(开始执行智能体工作流...) print(- * 30) # 运行图 final_state app.invoke(initial_state) print(\n * 30) print(执行完成最终状态) print( * 30) print(f用户问题: {initial_state[messages][0].content}) print(f识别地点: {final_state.get(location)}) print(f当前日期: {final_state.get(current_date)}) print(f天气信息: {final_state.get(weather_info)}) print(f\n生活建议: {final_state.get(suggestion)})运行这个智能体你会看到它依次执行了以下步骤理解用户意图Agent节点- 提取地点update_location节点- 获取日期get_date节点- 查询天气get_weather节点- 综合生成建议give_suggestion节点。整个过程状态清晰流程可控。6. 常见问题与排查思路在开发LLM应用时你可能会遇到以下典型问题。问题现象可能原因排查思路与解决方案OpenAI API 调用报错 (AuthenticationError)1. API密钥未设置或错误。2. 密钥所在区域与请求端点不匹配。3. 账户余额不足或过期。1. 检查.env文件中的OPENAI_API_KEY确保已正确加载。2. 在代码中打印os.getenv(“OPENAI_API_KEY”)的前几位确认密钥正确。3. 登录OpenAI平台检查账户状态和额度。RAG检索结果不相关1. 文档分割块大小不合适。2. 嵌入模型与任务不匹配。3. 检索时返回的top_k数量不当。1. 调整chunk_size和chunk_overlap对于技术文档500-1000字符可能较好。2. 尝试不同的嵌入模型如text-embedding-3-smallOpenAI或bge-large-zh-v1.5中文。3. 增加search_kwargs{“k”: 5}返回更多结果让LLM筛选。LangGraph智能体陷入循环或不动1. 图的边Edge逻辑定义有误形成死循环。2. Agent的提示词未明确指示何时结束。3. 工具调用返回的结果格式不符合预期。1. 使用app.get_graph().draw_mermaid_png()可视化图检查循环路径。2. 在Agent的system prompt中强调“在获得足够信息后直接给出最终答案”。3. 打印工具函数的返回值确保其是字符串或字典并能被后续节点正确处理。生成速度慢1. 使用的LLM模型过大如GPT-4。2. RAG检索的文档块过多导致提示词过长。3. 网络延迟。1. 在开发阶段使用gpt-3.5-turbo上线时再评估是否升级。2. 优化检索只返回最相关的1-3个块并使用chain_type“map_reduce”或“refine”处理长上下文。3. 考虑使用流式响应streaming改善用户体验。模型输出不符合格式要求提示词中对输出格式的约束不够强。1. 在提示词中使用更严格的指令如“请以JSON格式输出包含key1和key2字段”。2. 使用LangChain的OutputParser如PydanticOutputParser来强制结构化输出。向量数据库连接失败1. ChromaDB持久化路径权限问题。2. 客户端与服务端版本不兼容如果使用客户端/服务器模式。1. 检查persist_directory路径是否存在且可写。2. 尝试删除旧的chroma_db目录重新生成。3. 确保安装的chromadb版本与代码兼容。7. 最佳实践与工程化建议将原型转化为稳定、可维护的生产级应用需要遵循以下工程原则。7.1 提示词管理模板化与版本控制不要将提示词硬编码在代码中。应使用像LangChainPromptTemplate这样的类或将提示词存储在数据库、配置文件中。对提示词的修改进行版本控制。A/B测试对于关键任务的提示词设计不同的版本A/B版进行效果评估量化其准确率、响应长度等指标。结构化输出尽可能要求模型输出JSON、XML等结构化数据这极大简化了后端对模型响应的解析和处理逻辑。7.2 RAG系统优化分层索引对于大型知识库可采用分层索引策略。先使用稀疏检索如BM25快速筛选一批文档再用密集向量检索进行精排兼顾速度和精度。查询重写与扩展在用户查询送入检索器之前先使用一个轻量级LLM对其进行重写或扩展。例如将“它多少钱”根据上下文扩展为“智能办公助手专业版每月多少钱”提升检索命中率。后处理与引用在最终答案中注明引用的源文档片段如我们示例中所做这不仅能增加可信度也方便用户追溯和验证。7.3 Agent设计原则工具设计精细化工具函数应保持单一职责、接口明确。做好输入验证和错误处理返回结构化的结果。避免让一个工具做太多事情。状态设计最小化LangGraph的State只应包含流程必需的数据。避免将整个会话历史等不变量放入状态以减小内存开销和序列化成本。设置超时与回退为工具调用和LLM调用设置合理的超时时间。当某个工具失败时Agent应有回退策略例如尝试替代工具或向用户请求更多信息。7.4 可观测性与监控全链路日志记录每个环节的输入输出包括原始提示词、检索到的文档、工具调用参数、模型响应等。这对于调试和效果分析至关重要。关键指标监控监控API调用延迟、Token消耗、错误率、用户反馈如有。对于RAG可以监控“检索命中率”和“答案相关性”。成本控制尤其在使用GPT-4等昂贵模型时需监控Token使用量设置预算警报。可以通过缓存频繁查询的答案、对长文档进行摘要后再嵌入等方式降低成本。从精心设计提示词开始到构建能够理解私有知识的RAG系统再到利用LangGraph编排具备复杂推理和行动能力的智能体这条路径清晰地勾勒出了现代LLM应用开发的核心技能栈。技术的核心不在于追逐最前沿的模型而在于如何通过工程化的方法将模型能力稳定、可靠、高效地融入解决实际问题的流程中。建议你按照本文的步骤从一个简单的提示词优化任务开始逐步扩展到搭建一个针对你自身业务的小型RAG系统最后尝试用LangGraph将一个复杂的手动操作流程自动化。在这个过程中你会更深刻地理解每个组件的价值与边界。