从工具到智能体:基于LangChain构建AI应用工作流的实战指南

📅 2026/7/6 5:36:29
从工具到智能体:基于LangChain构建AI应用工作流的实战指南
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度如果你在2024年还在纠结“AI到底能帮我做什么”或者觉得AI不过是“高级一点的搜索引擎”和“会画图的玩具”那么你可能已经错过了理解这个时代最关键的生产力工具。AI的进化速度远超我们的想象它早已不是简单的问答机器人而是正在重塑我们工作、学习和创造方式的“智能副驾”。从一行代码的生成到一个完整商业计划的撰写再到一个视频的剪辑和配乐AI正在将复杂的专业技能“平民化”。然而面对海量的AI工具、模型和概念很多人陷入了“知道很多但一个都用不好”的困境。今天这篇文章我们不谈那些遥不可及的学术论文也不罗列上百个工具清单。我们将聚焦于一个核心问题作为一名开发者、创作者或普通职场人如何构建一套真正能为你所用的AI工作流并理解其背后的关键常识本文将深入拆解AI应用开发的三个核心层次工具使用、模型调用与集成、以及Agent智能体工作流构建。我们会从最实用的场景出发提供可复现的代码示例和配置方法让你不仅能“看懂”更能“动手做”。无论你是想提升个人效率还是为你的产品注入AI能力这篇文章都将为你提供清晰的路径和避坑指南。1. 从“玩具”到“工具”重新定义你对AI的认知在深入技术细节之前我们必须先统一认知AI到底是什么很多人对AI的认知停留在ChatGPT的对话界面或Midjourney的绘画结果上这就像只通过APP Store的图标来理解智能手机一样片面。AI的本质是一套基于数据和算法能够执行特定认知任务如理解、推理、生成、决策的软件系统。它的价值不在于“炫技”而在于解决实际问题。我们可以将其分为三个应用层次消费层AI as a Service直接使用现成的AI应用如ChatGPT、Copilot、Notion AI。特点是开箱即用解决通用问题。集成层AI as an API通过调用大模型API如OpenAI的GPT-4、Google的Gemini、国内的通义千问、文心一言将AI能力嵌入到自己的应用或工作流中。这是开发者最常接触的层面。智能体层AI as an AgentAI不再是被动响应指令的工具而是能够自主规划、使用工具、执行多步复杂任务的“智能体”。这是当前技术前沿也是效率提升的质变点。当前大多数人的困惑在于停留在第一层渴望进入第二层但对第三层感到陌生。本文的目标就是带你跨越这三层建立从使用到集成的完整知识框架。2. 核心概念解析大模型、提示词、微调与Agent在动手之前我们需要厘清几个最常被混淆却又至关重要的概念。2.1 大模型Large Language Model, LLM大模型是当前AI能力的基石你可以把它理解为一个“压缩了互联网海量知识和语言模式”的超级大脑。它通过数千亿参数的神经网络学会了预测下一个词的概率。正是这种能力让它能够进行对话、翻译、总结和代码生成。关键认知大模型是“通才”而非“专才”。它拥有广泛的知识但在未经特定训练或引导的情况下在垂直领域的深度和准确性上可能不足。因此直接问一个通用模型“如何诊断我的服务器故障”效果可能不如问一个经过运维知识微调的模型或者不如让一个Agent去调用专门的监控工具API。2.2 提示词工程Prompt Engineering这是与AI沟通的“编程语言”。一个糟糕的提示词得到的是敷衍的回答而一个精心设计的提示词可以激发模型最深层的潜力。提示词的核心结构角色Role设定AI的身份。“你是一位资深Java架构师。”任务Task清晰、具体地描述你要它做什么。“请为以下需求设计一个微服务用户认证模块的类图。”上下文Context提供必要的背景信息。“我们使用Spring Security 6.x和JWT。”输出格式Format明确你期望的回应形式。“请用PlantUML语法输出。”约束Constraints设定边界条件。“不考虑OAuth2.0仅限用户名密码和JWT。”示例一个高效的编程提示词你是一位经验丰富的Python开发助手。请遵循以下步骤 1. 分析需求我需要一个函数它接收一个包含字典的列表每个字典都有timestampISO格式字符串和value浮点数键。 2. 核心任务函数需要按timestamp排序列表并计算每相邻两个数据点之间value的差值返回一个新的列表包含差值和时间间隔秒。 3. 约束请使用Python标准库确保处理可能的空列表或无效日期格式并添加适当的类型提示和文档字符串。 4. 输出只给我最终的、完整的函数代码并附上一个简短的使用示例。2.3 微调Fine-Tuning与检索增强生成RAG这是让通用大模型变成“专才”的两种主要方法。微调使用你的专业数据集如公司内部的客服问答、代码库重新训练模型的一部分参数。效果好但成本高需要数据准备和训练资源。适合有稳定、高质量专有数据且需求固定的场景。检索增强生成RAG在回答问题时先从你的知识库向量数据库中检索相关文档片段然后将这些片段作为上下文连同问题一起交给大模型生成答案。这是当前性价比最高、最实用的企业级AI落地方案。RAG工作流简述将你的文档PDF、Word、网页切分成片段。使用嵌入模型Embedding Model将文本片段转换为向量一串数字存入向量数据库如Chroma、Milvus、Pinecone。当用户提问时将问题也转换为向量在数据库中搜索最相似的文本片段。将检索到的片段和原始问题组合成新的提示词发送给大模型生成最终答案。2.4 智能体Agent这是AI应用的“终极形态”。一个智能体 大模型 规划能力 工具使用能力。它可以理解复杂目标拆解为子任务决定调用哪个工具如搜索网络、执行代码、查询数据库、操作软件并循环执行直到完成任务。例如一个数据分析Agent可以接收指令“分析上季度销售数据并制作一份PPT报告”然后自主完成登录数据库、查询数据、用Python进行可视化分析、调用PPT生成API、将图表插入幻灯片、生成总结文字。3. 环境准备构建你的AI开发工具箱工欲善其事必先利其器。要开始AI应用开发你需要准备好以下环境。我们将以Python生态为例因为它拥有最丰富的AI库和社区支持。3.1 基础环境Python 3.9建议使用3.10或3.11稳定性最好。使用pyenv或conda管理多版本Python环境是最佳实践。包管理工具pip是标准但强烈推荐使用poetry或pipenv来管理项目依赖和虚拟环境避免版本冲突。代码编辑器/IDEVS Code安装Python扩展和Copilot或Cursor等AI编程插件体验“如虎添翼”。PyCharm Professional对大型项目支持更好内置了强大的代码分析和数据库工具。Cursor新兴的以AI为核心的编辑器深度集成AI代码生成和对话适合快速原型开发。3.2 核心Python库创建一个新的项目目录并使用poetry初始化或使用venv创建虚拟环境。# 使用 poetry 初始化项目推荐 poetry new my_ai_project cd my_ai_project poetry add openai langchain langchain-community chromadb pydantic python-dotenv tiktoken安装的核心库说明openai官方SDK用于调用OpenAI API如GPT-4。如果你使用国内模型可能需要对应厂商的SDK。langchainAI应用开发框架的“瑞士军刀”。它抽象了与大模型交互、构建链Chain和智能体Agent的复杂逻辑让开发变得模块化和简单。这是本文的重点。langchain-community包含大量第三方集成工具、向量库、模型等。chromadb一个轻量级、开源的向量数据库用于RAG应用。pydantic用于数据验证和设置管理LangChain大量使用它。python-dotenv管理环境变量如API密钥。tiktokenOpenAI的令牌计数器用于估算API成本。3.3 获取API密钥你需要至少一个大型语言模型的API访问权限。以下是一些主流选择OpenAI访问 platform.openai.com 注册并获取API Key。功能强大生态最成熟但需要国际支付方式且可能面临网络问题。Google AI Studio (Gemini)访问 aistudio.google.com 注册可免费获取Gemini API Key有一定免费额度。网络访问相对友好。国内大模型通义千问阿里云模型服务平台。文心一言百度智能云千帆平台。智谱GLM开放平台。月之暗面Kimi提供长文本API。重要安全提示永远不要将API密钥硬编码在代码中或上传到GitHub等公开仓库使用.env文件管理。# 在项目根目录创建 .env 文件 OPENAI_API_KEYsk-your-openai-key-here GEMINI_API_KEYyour-gemini-key-here4. 第一站从LangChain开始轻松调用大模型LangChain极大地简化了与大模型交互的流程。让我们从一个最简单的例子开始用不同的模型问同一个问题。4.1 基础模型调用创建一个文件basic_llm.py# basic_llm.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain_google_genai import ChatGoogleGenerativeAI from langchain.schema import HumanMessage # 1. 加载环境变量 load_dotenv() # 2. 初始化OpenAI模型 (GPT-3.5-turbo) openai_llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.7, # 控制创造性0-1越高越随机 api_keyos.getenv(OPENAI_API_KEY) ) # 3. 初始化Gemini模型 gemini_llm ChatGoogleGenerativeAI( modelgemini-1.5-pro, temperature0.7, google_api_keyos.getenv(GEMINI_API_KEY) ) # 4. 定义问题 prompt 用Python写一个函数计算斐波那契数列的第n项并解释其时间复杂度。 # 5. 调用OpenAI模型 print( OpenAI GPT-3.5 回答 ) openai_response openai_llm.invoke([HumanMessage(contentprompt)]) print(openai_response.content) print(\n *50 \n) # 6. 调用Gemini模型 print( Google Gemini 回答 ) gemini_response gemini_llm.invoke([HumanMessage(contentprompt)]) print(gemini_response.content)运行这个脚本你会看到两个不同模型对同一编程问题的回答。通过temperature参数你可以控制输出的创造性。对于代码生成通常设置为较低值如0.2以获得更确定的结果对于头脑风暴可以设置较高值如0.8。4.2 构建对话链Chain—— 实现多轮对话单次调用很简单但真实场景需要上下文记忆。LangChain的ConversationChain和记忆组件可以轻松实现。创建文件conversation_chain.py# conversation_chain.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain load_dotenv() # 初始化模型和记忆 llm ChatOpenAI(modelgpt-3.5-turbo, api_keyos.getenv(OPENAI_API_KEY)) # ConversationBufferMemory 会保存所有历史对话 memory ConversationBufferMemory(return_messagesTrue) # 创建对话链 conversation ConversationChain( llmllm, memorymemory, verboseTrue # 设置为True可以看到LangChain内部思考过程 ) print(AI助手已启动输入‘退出’结束) while True: user_input input(\n你: ) if user_input.lower() in [退出, exit, quit]: print(对话结束。) break # 调用链 response conversation.invoke({input: user_input}) print(fAI: {response[response]}) # 你可以查看当前记忆的内容 # print(f当前记忆: {memory.buffer})运行此脚本你可以进行多轮对话。AI会记住之前的对话内容。ConversationBufferWindowMemory可以只保留最近K轮对话ConversationSummaryMemory则会自动总结历史对话以节省Token。5. 第二站构建你的第一个RAG应用——智能文档问答RAG是当前最实用的AI落地技术。让我们用LangChain和ChromaDB快速构建一个可以“阅读”你的PDF或TXT文档并回答问题的系统。5.1 项目结构及依赖确保已安装所需库。我们还需要PyPDF2或pypdf来处理PDF以及unstructured用于解析复杂文档。poetry add pypdf unstructured5.2 完整代码实现创建文件rag_document_qa.py# rag_document_qa.py import os from pathlib import Path from dotenv import load_dotenv from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_google_genai import ChatGoogleGenerativeAI, GoogleGenerativeAIEmbeddings from langchain_community.document_loaders import TextLoader, PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import Chroma from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # 加载环境变量 load_dotenv() class DocumentQASystem: def __init__(self, model_provideropenai, persist_directory./chroma_db): 初始化QA系统。 :param model_provider: 模型提供商openai 或 google :param persist_directory: 向量数据库持久化目录 self.persist_directory persist_directory self.model_provider model_provider # 1. 初始化大模型和嵌入模型 if model_provider.lower() openai: self.llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.1, api_keyos.getenv(OPENAI_API_KEY) ) self.embeddings OpenAIEmbeddings(api_keyos.getenv(OPENAI_API_KEY)) elif model_provider.lower() google: self.llm ChatGoogleGenerativeAI( modelgemini-1.5-pro, temperature0.1, google_api_keyos.getenv(GEMINI_API_KEY) ) self.embeddings GoogleGenerativeAIEmbeddings( modelmodels/embedding-001, google_api_keyos.getenv(GEMINI_API_KEY) ) else: raise ValueError(不支持的模型提供商请选择 openai 或 google) self.vectorstore None self.qa_chain None def load_and_process_documents(self, document_paths): 加载并处理文档创建向量存储。 :param document_paths: 文档路径列表 all_docs [] for doc_path in document_paths: path Path(doc_path) if not path.exists(): print(f警告文件 {doc_path} 不存在已跳过。) continue if path.suffix.lower() .pdf: loader PyPDFLoader(str(path)) elif path.suffix.lower() in [.txt, .md]: loader TextLoader(str(path), encodingutf-8) else: print(f警告不支持的文件格式 {path.suffix}已跳过 {doc_path}。) continue documents loader.load() print(f已加载文档: {path.name}, 包含 {len(documents)} 页/段。) all_docs.extend(documents) if not all_docs: print(错误未加载任何有效文档。) return False # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个片段约1000字符 chunk_overlap200, # 片段间重叠200字符保持上下文 separators[\n\n, \n, 。, , , , , , ] ) splits text_splitter.split_documents(all_docs) print(f文档被分割成 {len(splits)} 个文本块。) # 3. 创建向量存储并持久化 self.vectorstore Chroma.from_documents( documentssplits, embeddingself.embeddings, persist_directoryself.persist_directory ) self.vectorstore.persist() print(f向量数据库已创建并保存至: {self.persist_directory}) return True def load_existing_vectorstore(self): 加载已存在的向量数据库。 if Path(self.persist_directory).exists(): self.vectorstore Chroma( persist_directoryself.persist_directory, embedding_functionself.embeddings ) print(f已从 {self.persist_directory} 加载现有向量数据库。) return True else: print(未找到已有的向量数据库请先处理文档。) return False def build_qa_chain(self): 构建检索问答链。 if self.vectorstore is None: if not self.load_existing_vectorstore(): return False # 4. 定义自定义提示模板让AI基于上下文回答 prompt_template 请严格根据以下提供的上下文信息来回答问题。如果你在上下文中找不到明确答案请直接说“根据提供的资料我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 基于上下文的答案 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 5. 创建检索器并构建QA链 retriever self.vectorstore.as_retriever( search_typesimilarity, # 相似度搜索 search_kwargs{k: 4} # 返回最相关的4个片段 ) self.qa_chain RetrievalQA.from_chain_type( llmself.llm, chain_typestuff, # 将检索到的所有文档“塞”进上下文 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回来源文档便于溯源 ) print(QA链构建完成。) return True def ask(self, question): 提问并获取答案。 if self.qa_chain is None: print(请先构建QA链。) return None result self.qa_chain.invoke({query: question}) answer result[result] source_docs result[source_documents] print(f\n问题: {question}) print(f答案: {answer}) print(\n--- 来源文档片段 (供参考) ---) for i, doc in enumerate(source_docs[:2]): # 显示前2个来源 print(f[片段 {i1}]: {doc.page_content[:300]}...) # 只显示前300字符 print(- * 50) return answer # 主程序 if __name__ __main__: # 初始化系统可以选择 openai 或 google qa_system DocumentQASystem(model_providergoogle, persist_directory./my_doc_db) # 第一次运行加载并处理文档 DOC_PATHS [./sample.pdf, ./notes.txt] # 替换为你的文档路径 # 如果向量数据库不存在则处理文档 if not Path(./my_doc_db).exists(): print(未检测到现有数据库开始处理文档...) success qa_system.load_and_process_documents(DOC_PATHS) if not success: exit() else: print(检测到现有数据库直接加载。) # 构建QA链 qa_system.build_qa_chain() # 交互式问答 print(\n文档问答系统已就绪输入‘退出’结束。) while True: user_question input(\n请输入你的问题: ) if user_question.lower() in [退出, exit, quit]: break qa_system.ask(user_question)5.3 代码核心逻辑解读文档加载使用PyPDFLoader和TextLoader加载不同格式的文档。文本分割使用RecursiveCharacterTextSplitter将长文档分割成较小的“块”chunks。这是RAG的关键因为大模型有上下文长度限制。chunk_size和chunk_overlap需要根据文档类型调整。向量化与存储使用嵌入模型OpenAIEmbeddings或GoogleGenerativeAIEmbeddings将每个文本块转换为高维向量并存入Chroma向量数据库。相似的文本在向量空间中也相近。检索当用户提问时将问题也转换为向量在数据库中搜索similarity_search最相似的K个文本块。生成将检索到的文本块作为“上下文”与原始问题一起构造新的提示词发送给大模型生成最终答案。我们使用了自定义的PromptTemplate来严格约束AI基于上下文回答减少“幻觉”。5.4 运行与测试将你的PDF或TXT文档例如sample.pdf放在项目根目录并修改DOC_PATHS变量。确保.env文件中已配置正确的API密钥。运行脚本python rag_document_qa.py。首次运行会处理文档并创建向量数据库./my_doc_db目录后续运行会直接加载无需重复处理。尝试提问关于文档内容的问题观察AI如何结合检索到的片段生成答案。6. 第三站探索智能体Agent—— 让AI自主使用工具智能体是LangChain最强大的功能之一。我们创建一个能使用搜索引擎和计算器的简单Agent。6.1 工具Tools的定义智能体的核心是“工具”。工具可以是任何函数只要它能被AI模型调用。LangChain社区提供了大量预构建工具。创建文件simple_agent.py# simple_agent.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import initialize_agent, AgentType from langchain.agents import Tool from langchain_community.utilities import SerpAPIWrapper from langchain.chains import LLMMathChain load_dotenv() # 1. 初始化模型 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, api_keyos.getenv(OPENAI_API_KEY)) # 2. 定义工具 # 工具1搜索引擎需要注册SerpAPI获取API_KEY或使用其他搜索工具如DuckDuckGo # 注意这里需要 SERPAPI_API_KEY 环境变量 search SerpAPIWrapper(serpapi_api_keyos.getenv(SERPAPI_API_KEY)) search_tool Tool( nameSearch, funcsearch.run, description当你需要回答有关实时信息、最新事件或未知事实的问题时非常有用。输入应该是一个具体的问题。 ) # 工具2计算器 llm_math LLMMathChain.from_llm(llmllm) math_tool Tool( nameCalculator, funcllm_math.run, description用于回答数学问题。输入应该是一个数学表达式例如 3 * 5 2。 ) # 工具3自定义工具 - 获取当前时间 from datetime import datetime def get_current_time(_): 返回当前日期和时间。 return f当前时间是: {datetime.now().strftime(%Y-%m-%d %H:%M:%S)} time_tool Tool( nameGetCurrentTime, funcget_current_time, description当问题涉及当前日期、时间或星期几时使用。输入可以是任何内容通常为空。 ) tools [search_tool, math_tool, time_tool] # 3. 初始化智能体 # 使用 ZERO_SHOT_REACT_DESCRIPTION这是一种让Agent自主决定使用哪个工具的经典策略 agent initialize_agent( tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, # 详细输出可以看到Agent的“思考过程” handle_parsing_errorsTrue # 处理解析错误 ) # 4. 运行智能体 print(智能体已启动输入‘退出’结束) while True: user_input input(\n你的指令: ) if user_input.lower() in [退出, exit, quit]: break try: result agent.invoke({input: user_input}) print(f\n最终结果: {result[output]}) except Exception as e: print(f执行出错: {e})6.2 运行与观察运行此脚本并尝试提出需要组合多个工具才能解决的问题例如“北京现在的天气怎么样用摄氏度表示。”“将今天美元对人民币的汇率乘以100。”“计算半径为5的圆的面积然后告诉我今天星期几。”当verboseTrue时你会在控制台看到Agent的完整思考链ReAct模式例如Thought: 用户需要知道北京的天气和汇率计算。我需要先搜索北京的天气然后搜索美元对人民币的汇率。 Action: Search Action Input: 北京当前天气 摄氏度 Observation: 北京晴气温25°C... Thought: 我得到了天气信息。现在需要汇率。 Action: Search Action Input: 美元人民币汇率 Observation: 1美元 ≈ 7.2人民币 Thought: 现在我可以回答用户了。 Final Answer: 北京当前天气晴朗气温25°C。根据最新汇率1美元约合7.2人民币。这个过程清晰地展示了Agent的规划、执行和反思能力。7. 常见问题与排查思路在构建AI应用时你一定会遇到各种问题。以下是一些典型问题及解决方案问题现象可能原因排查方式解决方案API调用失败提示认证错误1. API密钥未设置或错误。2. 环境变量未正确加载。3. 对于某些服务可能网络不通。1. 检查.env文件格式无空格无引号。2. 在代码中打印os.getenv(“KEY”)看是否为None。3. 尝试用curl或Postman直接调用API端点。1. 重新生成API Key并确保复制完整。2. 确认.env文件在项目根目录且load_dotenv()在代码开头调用。3. 检查网络代理设置或考虑使用国内大模型API。RAG回答“根据资料无法回答”或答案不相关1. 文档分割不合理块太大或太小。2. 检索到的文本块数量k不合适。3. 嵌入模型不适合该类型文本。4. 提示词模板不够强制。1. 检查分割后的文本块内容是否完整。2. 调整search_kwargs{“k”: 4}中的k值。3. 尝试不同的chunk_size和chunk_overlap。4. 查看source_documents看检索到的片段是否真的相关。1. 对于技术文档chunk_size500-800可能更好对于小说可以更大。2. 增加k值以获取更多上下文但注意成本增加。3. 尝试在提示词中更严厉地要求“必须基于上下文”。4. 考虑使用MultiQueryRetriever生成多个问题变体来检索。Agent陷入循环或选择错误工具1. 工具描述不够清晰。2. 模型能力不足如使用GPT-3.5处理复杂规划。3. 没有设置最大迭代次数。1. 观察verbose日志看Agent的“Thought”是否合理。2. 检查工具的描述description是否准确说明了功能和输入格式。1. 优化工具描述使其更精确。2. 升级到更强的模型如GPT-4。3. 在initialize_agent中设置max_iterations5和early_stopping_method”generate”。处理中文文档效果差1. 文本分割器按英文标点分割切断了中文句子。2. 嵌入模型对中文语义理解不佳。1. 检查分割后的中文文本块是否支离破碎。2. 测试嵌入模型的中文相似度搜索能力。1. 使用支持中文的分割器如ChineseTextSplitter或自定义separators列表加入中文标点。2. 尝试专门针对中文优化的嵌入模型如text2vec、m3e或OpenAI的text-embedding-3系列。程序运行慢1. 嵌入过程耗时尤其是本地模型。2. 网络请求延迟高。3. 检索的向量数据库未使用索引。1. 使用time模块对代码分段计时。2. 检查是文档处理慢还是问答慢。1. 对于大量文档预处理向量化可以离线进行。2. 使用异步请求langchain支持异步。3. 对于生产环境考虑使用带索引的向量数据库如Milvus、Pinecone或Qdrant。8. 最佳实践与工程化建议将AI应用从实验推向生产需要遵循一些工程化原则。8.1 提示词工程化模板化将高质量的提示词保存为模板文件如prompts.yaml便于管理和迭代。少样本学习Few-Shot在提示词中提供几个输入输出的例子能极大提升模型在特定任务上的表现。输出结构化要求模型以JSON、XML或特定标记格式输出便于后续程序解析。例如“请以JSON格式输出包含summary和keywords字段。”8.2 应用架构异步处理使用asyncio和LangChain的异步接口处理并发请求提高吞吐量。缓存对频繁且结果不变的查询如某些知识库问答引入缓存Redis降低API成本和延迟。限流与降级对模型API调用实施限流并设计降级策略如切换到更便宜的模型或返回缓存。可观测性记录每次调用的提示词、响应、Token使用量、延迟和成本用于监控和优化。8.3 RAG优化混合搜索结合基于向量相似度的“语义搜索”和基于关键词匹配的“稀疏搜索”提高召回率。重排序Re-ranking检索出Top K个片段后使用一个更小的、专门训练的重排序模型对它们进行精排将最相关的放在前面。元数据过滤在向量化时为每个文本块添加元数据如来源、章节、日期检索时可以进行过滤如“只搜索2023年以后的文档”。8.4 安全与责任输入过滤对用户输入进行严格的检查和过滤防止提示词注入攻击。输出审查对AI生成的内容进行必要的审核特别是在涉及法律、医疗、金融等敏感领域。可控性为Agent设置明确的边界和权限防止其执行危险操作如删除文件、发送邮件。透明度在向用户提供AI生成答案时尽可能注明来源如RAG中的引用片段增加可信度。从与AI对话到让AI成为你工作流中自动化的核心这中间的桥梁就是你对这些工具、模型和框架的理解与实践。本文为你搭建了从概念认知到项目实战的完整路径。真正的掌握始于动手建议你从改造一个自己的文档问答系统开始逐步加入更多工具构建一个属于你的、能够理解上下文、使用工具、完成复杂任务的智能助手。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度