尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI Agent开发实战:从零构建智能体,掌握RAG与LangChain核心

AI Agent开发实战:从零构建智能体,掌握RAG与LangChain核心 1. 先搞清楚“AI Agent开发”到底在解决什么问题如果你在找AI Agent的教程大概率是遇到了这几个问题想用大模型做点自动化的事情但发现直接问ChatGPT只能完成单次对话没法让它记住上下文、使用工具、或者处理一个需要多步骤的复杂任务。比如你想让AI自动分析日报、帮你订机票酒店、或者管理一个知识库问答系统单靠一个聊天窗口是搞不定的。这就是AI Agent要解决的问题——让大模型具备“执行能力”和“规划能力”从一个简单的问答机变成一个能替你跑流程的“智能体”。所以别被“Agent”、“RAG”、“LangChain”这些词吓住。本质上这就是一套用代码组织和调度大模型的方法。学这个不是为了研究高深理论而是为了能动手做出东西。最核心的价值就三点1. 让AI能使用外部工具比如搜索、计算、操作软件2. 让AI能根据目标制定并执行计划3. 让AI能访问私有或最新的知识这就是RAG。网上很多资料要么太散要么一上来就讲架构图对新手极不友好。这篇文章我会用一个从业者的视角帮你把这条学习路径捋清楚。我们不求“7天大神”但求你能在理解核心概念后用最少的代码跑通第一个能真正“干活”的Agent并知道后续该往哪个方向深入。2. 学习AI Agent前你需要准备什么环境在开始写任何Agent代码之前环境是第一个坎。很多人卡在第一步不是因为逻辑不懂而是因为包版本冲突、API密钥没配、或者虚拟环境混乱。下面是我建议的标准化起点能避开90%的初期环境问题。2.1 核心三件套Python、包管理工具和APIPython环境别用系统自带的Python。强烈建议使用Miniconda或Anaconda创建独立的虚拟环境。这能保证你的项目依赖不会污染系统也方便复现。Python版本选择3.8到3.11之间的稳定版目前大多数AI库对3.12的支持可能还有小坑。# 创建名为ai_agent的虚拟环境 conda create -n ai_agent python3.10 conda activate ai_agent包管理工具用pip就行但建议总是带上-i参数使用国内镜像源加速。对于依赖复杂的项目可以考虑poetry或pdm但初期用pip足够。pip install [package-name] -i https://pypi.tuna.tsinghua.edu.cn/simple大模型API这是Agent的“大脑”。国内通常使用智谱AIChatGLM、百度文心、阿里通义千问或DeepSeek的API国外则是OpenAI的GPT系列或Anthropic的Claude。你需要去对应平台注册账号。在控制台创建API Key。将API Key设置为环境变量永远不要硬编码在代码里# Linux/macOS export OPENAI_API_KEYyour-api-key-here # Windows (PowerShell) $env:OPENAI_API_KEYyour-api-key-here在代码中通过os.getenv(OPENAI_API_KEY)来读取。2.2 选对学习框架LangChain是起点但不是终点目前最主流的AI应用框架是LangChain和LlamaIndex。对于Agent开发LangChain是更好的起点因为它对工具调用、智能体规划这些概念抽象得比较清晰社区资料也最丰富。安装基础包pip install langchain langchain-openai langchain-community注意langchain是核心langchain-openai是用于OpenAI模型的官方集成langchain-community包含大量第三方工具和组件。如果你用国内模型可能需要安装对应的langchain-zhipuai等包。一个重要建议初期不要试图安装langchain[all]它会装上你可能永远用不到的依赖容易引起冲突。缺什么再装什么。2.3 本地知识库的支撑向量数据库当你需要让Agent“懂得”你的私有数据时比如公司文档、个人笔记就需要RAG检索增强生成。而RAG的核心是向量数据库。它负责把你的文本转换成向量即嵌入并存储、检索。对于学习和原型开发我首推ChromaDB。它轻量、无需外部服务、纯Python实现开箱即用。pip install chromadb对于生产环境你可能会考虑Qdrant、Milvus或Pinecone云服务。但刚开始用ChromaDB跑通流程最重要。3. 拆解一个AI Agent的核心组成部分一个能用的Agent通常由以下几个部分像搭积木一样组成。理解每个部分的作用比死记代码更重要。3.1 大脑LLM大语言模型这是Agent的决策中心。在代码中它就是一个被初始化的“模型对象”。以使用OpenAI API为例from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-3.5-turbo, temperature0)model: 指定模型如gpt-4、gpt-3.5-turbo。初期用gpt-3.5-turbo成本低响应快。temperature: 创造性参数0-2之间。做Agent任务通常设为0或接近0以保证决策的稳定性和可重复性。如果你希望它有点创意可以调到0.1-0.3。3.2 手脚Tools工具工具是Agent与外界交互的手段。LangChain内置了很多工具你也可以自定义。一个经典工具是“搜索”。from langchain_community.tools import DuckDuckGoSearchRun search_tool DuckDuckGoSearchRun()这个工具允许Agent在需要最新信息时去网上搜索。其他常见工具包括计算器、Python REPL执行代码、文件读写等。定义工具的本质就是告诉LLM“这个函数你能用这是它的名字和描述。”3.3 记忆MemoryAgent需要记住之前的对话或思考过程。最简单的记忆是ConversationBufferMemory它会把所有历史对话都存下来。from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue)注意记忆会消耗TokenAPI费用和上下文窗口。对于长对话可能需要使用ConversationSummaryMemory等更高级的记忆方式它会自动总结历史而不是全盘记住。3.4 调度员Agent Executor这是把LLM、Tools、Memory粘合起来的“运行时引擎”。你不需要从头实现复杂的循环逻辑LangChain提供了多种预设的Agent类型。最常用的是create_react_agentReAct范式或create_openai_tools_agentOpenAI函数调用。from langchain.agents import create_openai_tools_agent, AgentExecutor from langchain import hub # 从LangChain Hub拉取一个预设的提示词模板 prompt hub.pull(hwchase17/openai-tools-agent) # 创建Agent agent create_openai_tools_agent(llm, tools, prompt) # 创建执行器 agent_executor AgentExecutor(agentagent, toolstools, memorymemory, verboseTrue)verboseTrue会让执行过程打印出详细的思考步骤对于调试和学习至关重要。4. 实战从零构建你的第一个“天气预报查询Agent”现在我们把上面所有部分组合起来做一个能查询天气的Agent。这个例子虽小但包含了Agent的所有核心环节。4.1 第一步设计工具Agent自己不能查天气我们需要给它造一个“手”。这里我们用一个模拟的函数真实场景可以替换成调用天气API。from langchain.tools import tool import requests tool def get_weather(city: str) - str: 根据城市名查询该城市的当前天气情况。 # 模拟返回真实情况应调用如和风天气、OpenWeatherMap等API # 例如response requests.get(fhttps://api.weatherapi.com/v1/current.json?keyYOUR_KEYq{city}) # 这里为了演示返回固定文本 return f{city}的天气是晴朗温度25度。tool装饰器会把这个函数包装成LangChain能识别的工具。函数的文档字符串...非常重要LLM就是靠这个描述来决定什么时候、如何使用这个工具的。4.2 第二步组装Agent初始化所有组件并组装成执行器。import os from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.agents import create_openai_tools_agent, AgentExecutor from langchain import hub # 1. 初始化LLM确保已设置OPENAI_API_KEY环境变量 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 2. 工具列表 tools [get_weather] # 3. 记忆 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 4. 提示词模板 prompt hub.pull(hwchase17/openai-tools-agent) # 5. 创建Agent和执行器 agent create_openai_tools_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools, memorymemory, verboseTrue)4.3 第三步运行与对话现在你可以像和人对话一样向Agent提问了。# 第一次提问 result1 agent_executor.invoke({input: 北京今天天气怎么样}) print(result1[output]) # 控制台会输出verbose的思考过程它需要调用get_weather工具参数是“北京”。 # 第二次提问它会利用记忆 result2 agent_executor.invoke({input: 那上海呢}) print(result2[output]) # 这次它知道“上海”指的是城市会继续调用get_weather(上海)。运行后观察控制台打印的verbose日志。你会看到类似这样的过程 Entering new AgentExecutor chain... 思考用户问北京天气我需要使用get_weather工具。 行动调用 get_weather参数{city: 北京} 观察北京的天气是晴朗温度25度。 思考我得到了答案可以回复用户了。 行动最终回复用户。 Finished chain.这就是一个完整的ReActReasoning Acting过程思考-行动-观察-再思考。通过这个简单的例子你已经看到了Agent如何自主决定使用工具、传递参数并整合结果。5. 进阶核心用RAG为Agent注入专属知识只会用公开工具还不够。很多场景下你需要让Agent回答关于你公司文档、产品手册、个人知识库的问题。这就是RAG的用武之地。其流程可以概括为加载文档 - 切分文本 - 向量化 - 存储 - 检索 - 生成答案。5.1 构建你的第一个知识库我们使用ChromaDB和OpenAI的嵌入模型来演示。from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma # 1. 加载文档这里用txt示例也支持PDF、Word、网页等 loader TextLoader(./my_document.txt) documents loader.load() # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) splits text_splitter.split_documents(documents) # 3. 创建向量存储 embeddings OpenAIEmbeddings() # 需要OPENAI_API_KEY vectorstore Chroma.from_documents(documentssplits, embeddingembeddings, persist_directory./chroma_db) # persist_directory 指定持久化目录下次可以直接加载chunk_size: 每个文本块的大小。太小会丢失上下文太大会影响检索精度。500-1000是常见起点。chunk_overlap: 块之间的重叠字符数。防止一个句子被腰斩保留上下文连贯性。5.2 将知识库变成Agent的工具现在我们需要创建一个“知识库查询工具”让Agent在需要时去里面检索。from langchain.tools.retriever import create_retriever_tool # 从已保存的向量库加载检索器 vectorstore Chroma(persist_directory./chroma_db, embedding_functionembeddings) retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 检索最相关的3个片段 # 创建检索工具 retrieval_tool create_retriever_tool( retriever, search_company_knowledge_base, 当需要查询公司产品、制度或文档信息时使用此工具。输入应是一个完整的问题。 ) # 将这个新工具加入到之前的工具列表中 tools [get_weather, retrieval_tool] # 然后重新创建Agent需要更新prompt以包含新工具的描述现在当你问Agent“我们公司的年假制度是怎样的”它会自动调用search_company_knowledge_base工具从你的my_document.txt中检索相关信息并生成回答。5.3 RAG的常见陷阱与调优RAG听起来简单但效果不好是常态。如果答案不准按这个顺序排查检索不到问题出在“检索器”上。检查切分chunk_size是否合适过大会导致检索出的块包含无关信息过小会导致关键信息被割裂。尝试调整大小和重叠度。检查检索策略search_kwargs{k: 3}中的k值。k1可能信息不足k10可能引入噪音。从3开始调整。尝试不同检索器as_retriever()默认使用相似度搜索。可以换用MMR最大边际相关性来平衡相关性和多样性。retriever vectorstore.as_retriever(search_typemmr, search_kwargs{k: 5, fetch_k: 10})检索到但答不对问题出在“生成器”上。检查提示词LLM拿到的不仅仅是检索出的文本还有一个系统提示词。确保你的提示词明确要求它“基于以下上下文回答”并指示它“如果上下文不包含答案就说不知道”。检查上下文质量把检索出来的几个文本块打印出来看看是否真的包含了问题的答案。可能你的文档本身就没有这个信息。一个核心经验RAG系统80%的问题在于数据预处理加载、清洗、切分和检索阶段。不要一上来就调LLM的参数先确保喂给它的“食材”是干净、相关的。6. 从原型到生产Agent开发的工程化考量当你跑通一个Demo后如果想把它变成一个真正可用的服务以下几个工程问题必须考虑。6.1 规划与执行LangGraph vs. ReAct基础的AgentExecutor适合线性任务。但如果你的任务像流程图一样有分支、循环、并行就需要更强大的规划能力。这就是LangGraph出场的时候。LangGraph允许你用图Graph的方式定义Agent的工作流。节点Node可以是LLM调用、工具执行或条件判断边Edge定义了执行流向。from langgraph.graph import StateGraph, END from typing import TypedDict, Annotated import operator # 1. 定义状态结构 class AgentState(TypedDict): question: str research_findings: Annotated[list, operator.add] # 这是一个累加字段 answer: str # 2. 定义节点函数 def research_node(state: AgentState): # 调用搜索工具进行研究 return {research_findings: [f关于{state[question]}的发现...]} def answer_node(state: AgentState): # 基于研究发现生成答案 return {answer: f综合来看答案是...} # 3. 构建图 graph StateGraph(AgentState) graph.add_node(research, research_node) graph.add_node(answer, answer_node) graph.set_entry_point(research) graph.add_edge(research, answer) graph.add_edge(answer, END) # 4. 编译并运行 app graph.compile() result app.invoke({question: 复杂问题...})对于需要多步骤协作、有严格流程的复杂Agent比如一个自动写报告、先调研再总结的AgentLangGraph是比简单Agent更强大的选择。简单任务用AgentExecutor复杂、有状态的工作流用LangGraph。6.2 稳定性与成本你必须监控的指标Agent调用LLM和工具是可能失败的而且按Token计费。在生产中必须考虑错误处理与重试网络超时、API限流、工具调用失败。你的代码需要有try-catch和重试机制如tenacity库。Token消耗与成本记忆Memory是吃Token的大户。对于长对话考虑切换成ConversationSummaryMemory或ConversationBufferWindowMemory只保留最近N轮。超时控制给Agent的整体运行设置超时防止某个步骤卡死。日志与追踪除了verboseTrue生产环境需要更结构化的日志记录每次调用的输入、输出、使用的工具、Token数、耗时。这有助于调试和成本分析。6.3 评估与迭代怎么知道Agent变好了这是最容易被忽略的一环。你改了一个参数或提示词怎么证明效果提升了你需要一个评估数据集。构建测试集收集20-50个典型用户问题并准备好标准答案或评分标准。定义评估指标忠实度答案是否基于提供的上下文针对RAG有没有胡编乱造准确性答案本身是否正确相关性答案是否直接回答了问题流畅度答案是否通顺自然自动化评估可以编写脚本用另一个LLM如GPT-4作为裁判根据上述指标对答案进行评分。A/B测试任何改动如换模型、改提示词、调整检索参数都先在测试集上跑一遍对比评分变化。没有评估的优化就是盲人摸象。建立一个哪怕很小的评估流程都能让你的开发效率大幅提升。7. 学习路径与资源避坑指南最后结合那些热搜词给你一条清晰的学习路径和避坑建议。7.1 正确的学习顺序第一周夯实基础Python确保熟悉函数、类、字典、列表操作、虚拟环境和包管理。不用学得多深但要能看懂和运行示例代码。核心概念理解LLM、提示词工程Prompt Engineering、Token、API调用。动手用openai库直接调用一次ChatGPT API。LangChain核心学习Document Loader、Text Splitter、Vectorstores、Retrievers、Chains这几个核心概念。先别碰Agent。第二周掌握RAG跟着本文第5节的例子用你自己的文档搭建一个可用的问答系统。理解chunk_size、embedding、similarity search的影响。尝试不同的向量数据库Chroma, Qdrant。第三周深入Agent从Tools和AgentExecutor开始复现第4节的天气预报Agent。学习ReAct范式理解Agent的思考链。尝试创建自定义工具如查询数据库、发送邮件。第四周及以后进阶与实战学习LangGraph构建多步骤工作流。考虑部署FastAPI封装成接口。学习评估方法优化你的Agent。阅读LangChain官方文档和LangGraph官方文档关注LangChain的Cookbook和YouTube上的官方教程。7.2 需要警惕的“坑”不要沉迷于找“最全教程”AI领域更新极快2026年的“最新版”可能包含大量过时API。以官方文档python.langchain.com为准它永远是更新最快、最准确的。不要一开始就啃Transformer源码除非你的目标是研发大模型否则对于应用开发把Transformer理解为一个“强大的文本理解与生成黑箱”即可。先会用再探究原理。谨慎对待“一键部署”、“完整项目”源码很多GitHub项目依赖复杂且缺乏维护。最好的学习方式是从最小可运行实例开始然后自己一步步添加功能。“AI Coding Agent”是工具不是老师用Cursor、Copilot辅助写代码很棒但你不能完全不懂。它生成的代码可能有bug你需要有能力理解和调试。AI Agent开发是一个工程实践大于理论研究的领域。最快的成长方式就是定一个明确的小目标比如“做一个能自动总结我每日邮件的Agent”- 拆解步骤读取邮件、文本分析、总结- 选择工具Gmail API, LLM- 用LangChain组装 - 跑通 - 优化。在这个过程中你自然会把RAG、Tools、Memory这些概念内化。
返回列表