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

资讯详情

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

从零构建AI智能体:RAG+LangChain+Agent全流程实战指南

从零构建AI智能体:RAG+LangChain+Agent全流程实战指南 如果你是一名开发者最近想进入AI应用开发领域可能会遇到这样的困境网上教程要么是零散的API调用要么是过于学术的理论而企业招聘要求却写着“熟悉RAG、LangChain、Agent开发”。你看了很多“三天入门”、“七天精通”的标题但跟着做下来要么环境跑不通要么代码看不懂最后只学会了用OpenAI的API写个聊天机器人离真正的“应用开发”还差得很远。问题出在哪里AI大模型应用开发核心不是调用一个API而是构建一个能理解、推理并执行复杂任务的智能系统。这背后需要一套完整的工程化思维和技术栈。单纯的“调包”教程无法让你获得就业竞争力而深度的学术论文又离落地太远。本文要解决的正是这个断层。我不会给你另一个“速成”的幻想而是带你系统性地走一遍一个现代AI应用从零到一的构建全流程。我们将聚焦于当前工业界最主流的架构模式RAG检索增强生成作为知识核心LangChain作为编排框架Agent智能体作为执行大脑。通过这篇文章你将彻底理解为什么是RAGLangChainAgent它们分别解决了什么痛点组合起来又如何形成闭环一个可运行的AI应用到底由哪些模块构成从文档处理到向量检索再到智能决策和工具调用。如何从第一行代码开始搭建一个具备“自知之明”克服幻觉的智能问答系统通往“AI应用开发工程师”的路上有哪些必须绕开的“坑”和必须掌握的“最佳实践”本文假设你具备基础的Python编程能力但对AI大模型开发知之甚少。我们将从环境搭建开始到最终部署一个能回答特定领域问题的Agent并提供所有可复现的代码。这不是一个简单的Demo而是一个具备生产环境思维的项目骨架。1. 重新定义“AI应用开发”从API调用到智能系统构建在开始写代码之前我们必须统一认知什么是真正的AI大模型应用开发它和普通的Web开发、数据分析有什么本质区别传统应用开发是确定性的。你输入A经过逻辑B必然得到输出C。整个流程是可控、可预测、可调试的。AI大模型应用开发则引入了非确定性。大模型是一个“黑盒”它的输出具有随机性尽管可控并且严重依赖输入信息Prompt的质量。因此我们的开发工作重心发生了根本性转移从“编写业务逻辑”转向“设计交互流程与提示工程”你需要教会模型如何思考而不是直接告诉它每一步怎么做。从“直接查询数据库”转向“管理模型的知识与上下文”大模型有知识截止日期且会产生“幻觉”编造信息。你需要通过RAG等技术为模型提供准确、及时的外部知识。从“调用本地函数库”转向“为模型创建和使用工具Tools”模型本身无法执行计算、查询数据库或调用API。你需要将各种能力封装成“工具”并设计一个“智能体Agent”来学习何时以及如何使用这些工具完成任务。这就是RAG LangChain Agent这个技术栈流行的根本原因。它们不是一个噱头而是应对上述三大挑战的工程化解决方案RAG检索增强生成解决模型知识不足和幻觉问题。它让模型在回答前先从你的私有知识库文档、数据库中检索相关信息然后基于这些可靠信息生成答案。LangChain解决应用流程编排复杂问题。它提供了一个框架将大模型调用、提示模板、记忆、检索器、工具等组件像搭积木一样连接起来让开发者能专注于业务逻辑而不是底层通信。Agent解决模型无法执行具体动作问题。它是一个具备自主决策能力的AI模块可以理解用户目标规划步骤并调用各种工具如计算器、搜索引擎、业务API来完成任务。理解了这层关系你就知道学习路径不应该孤立地看某个技术而应该看它们如何协作。接下来我们从最基础的环节开始搭建。2. 环境准备打造专属的AI开发环境为了避免后续的依赖冲突强烈建议使用虚拟环境。我们使用Python 3.10版本进行演示这是目前多数AI框架兼容性较好的版本。2.1 创建并激活虚拟环境# 使用 conda推荐便于管理不同Python版本 conda create -n ai-dev python3.10 conda activate ai-dev # 或者使用 venv python -m venv ai-dev # Windows ai-dev\Scripts\activate # Linux/Mac source ai-dev/bin/activate2.2 安装核心依赖库我们将安装LangChain及其相关生态库、向量数据库客户端、大模型SDK等。pip install langchain langchain-community langchain-core # 安装OpenAI官方SDK我们将使用其API作为LLM pip install openai # 安装向量数据库Chroma轻量级适合本地开发和演示 pip install chromadb # 用于文档加载和文本分割 pip install pypdf python-dotenv tiktoken # 可选用于更复杂的Agent工作流可视化 pip install langgraph2.3 获取并配置API密钥本文使用OpenAI的GPT模型作为核心LLM大语言模型。你需要一个OpenAI的API密钥。访问 OpenAI平台 注册并获取API Key。在项目根目录创建.env文件用于安全存储密钥。重要将.env文件加入.gitignore切勿提交到代码仓库。.env文件内容OPENAI_API_KEY你的实际api密钥在Python代码中使用python-dotenv加载配置# config.py from dotenv import load_dotenv import os load_dotenv() # 加载 .env 文件中的环境变量 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY)环境搭建完毕我们正式进入核心流程。3. 核心流程拆解构建AI应用的四个关键阶段构建一个基于RAG和Agent的AI应用可以系统性地分为以下四个阶段每个阶段都有明确的目标和产出graph TD A[第一阶段知识库构建] -- B[文档加载与解析]; B -- C[文本分割]; C -- D[向量化与存储]; D -- E[向量数据库]; F[第二阶段检索增强生成] -- G[用户提问]; G -- H[向量检索]; H -- I[相关文档片段]; E -- H; I -- J[组合Prompt送入LLM]; J -- K[生成基于知识的答案]; L[第三阶段智能体赋能] -- M[定义工具]; M -- N[创建Agent]; N -- O[规划与执行]; O -- P[使用工具完成任务]; K -- Q[第四阶段集成与部署]; P -- Q; Q -- R[Web应用/API服务];阶段一知识库构建RAG的基石目标将非结构化的私有文档如PDF、Word、TXT转化为模型可以快速查询的结构化向量知识库。 关键步骤文档加载 → 文本分割 → 向量化嵌入 → 存入向量数据库。阶段二检索增强生成RAG的核心目标当用户提问时从向量知识库中快速找到最相关的信息片段并将其作为上下文提供给大模型让模型生成准确、有据可依的答案。 关键步骤用户提问 → 向量相似度检索 → 组合Prompt → LLM生成答案。阶段三智能体赋能Agent的引入目标让AI不仅能回答问题还能主动采取行动。通过为模型定义“工具”如计算器、搜索API、数据库查询并创建一个能自主规划、调用工具的Agent完成更复杂的任务。 关键步骤定义工具 → 创建Agent执行器 → 接收任务并规划 → 调用工具执行 → 返回结果。阶段四集成与部署目标将上述能力封装成可对外提供服务的应用如Web接口、聊天机器人插件或内部系统集成。下面我们从前三个阶段入手用代码实现一个完整的原型。4. 第一阶段实战从零构建你的私有知识库假设我们有一些关于“公司内部规章制度”的PDF文档我们要构建一个能回答制度相关问题的AI助手。4.1 文档加载与文本分割首先将rules.pdf文件放入项目data/目录下。# rag_phase1.py from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma import os from config import OPENAI_API_KEY # 1. 加载文档 loader PyPDFLoader(./data/rules.pdf) documents loader.load() print(f加载了 {len(documents)} 个文档页面。) # 2. 分割文本 # 大模型有上下文长度限制必须将长文档切分成小块。 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块约1000字符 chunk_overlap200, # 块之间重叠200字符避免语义被切断 separators[\n\n, \n, 。, , , , , ] # 分割符优先级 ) split_docs text_splitter.split_documents(documents) print(f文档被分割成 {len(split_docs)} 个文本块。) print(第一个文本块预览, split_docs[0].page_content[:200])关键点解释chunk_size和chunk_overlap是RAG系统的超参数对检索质量影响巨大。大小不合适会导致检索信息不完整或噪声过多。RecursiveCharacterTextSplitter是常用分割器它会优先按双换行、单换行等分割尽量保证语义完整性。4.2 向量化与存储我们将文本块转换为向量一组数字并存入Chroma向量数据库。# 接上一段代码 # 3. 初始化嵌入模型用于将文本转为向量 # 注意这里会调用OpenAI的Embedding API会产生费用。 embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY, modeltext-embedding-3-small) # 4. 创建并持久化向量数据库 # persist_directory 指定数据库存储的本地路径 vectorstore Chroma.from_documents( documentssplit_docs, embeddingembeddings, persist_directory./chroma_db # 数据将保存在此目录 ) print(向量知识库已创建并保存到 ./chroma_db) # 进行一个简单的检索测试 query 年假有多少天 docs vectorstore.similarity_search(query, k2) # 检索最相似的2个块 print(f\n针对问题 {query} 检索到的相关文档) for i, doc in enumerate(docs): print(f\n--- 片段 {i1} ---) print(doc.page_content[:300]) # 打印前300字符运行此脚本后你的知识库就构建完成了。./chroma_db目录下保存了所有向量数据下次启动无需重新生成。5. 第二阶段实战实现检索增强生成RAG问答链有了知识库我们现在构建一个完整的QA链条检索 → 组合上下文 → 生成答案。# rag_phase2.py from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings from langchain.prompts import PromptTemplate from config import OPENAI_API_KEY # 1. 加载已存在的向量数据库 embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY, modeltext-embedding-3-small) vectorstore Chroma(persist_directory./chroma_db, embedding_functionembeddings) # 2. 将向量数据库转为检索器 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 每次检索3个相关片段 # 3. 定义一个大语言模型LLM llm ChatOpenAI( openai_api_keyOPENAI_API_KEY, modelgpt-3.5-turbo, # 也可使用 gpt-4 获得更好效果 temperature0.1 # 温度越低输出越确定、保守 ) # 4. 自定义提示模板指导模型如何利用上下文 prompt_template 你是一个专业的公司制度问答助手。 请严格根据以下提供的上下文信息来回答问题。如果上下文信息中没有明确答案请直接说“根据现有规定我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 请根据上下文给出准确、清晰的答案 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 5. 创建检索增强生成链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最简单的方式将所有检索到的上下文塞入Prompt retrieverretriever, chain_type_kwargs{prompt: PROMPT}, # 使用我们自定义的提示 return_source_documentsTrue # 返回参考来源便于验证 ) # 6. 进行问答测试 questions [ 新员工的试用期是多久, 公司今年的团建计划是什么, # 假设知识库中没有此信息 报销流程需要哪些步骤 ] for question in questions: print(f\n 问题{question} ) result qa_chain.invoke({query: question}) print(f答案{result[result]}) if result[source_documents]: print(参考来源) for doc in result[source_documents]: print(f - {doc.page_content[:150]}...) # 打印来源片段前150字符 print(- * 50)关键点解释RetrievalQA是LangChain提供的高级链封装了检索和生成的全过程。PromptTemplate是提示工程的核心。我们通过精心设计的提示词明确要求模型基于上下文回答并抑制幻觉。这是保证RAG效果的关键一步。chain_typestuff是最直接的方法适合上下文较短的情况。如果检索到的文档总长度超过模型限制需要考虑map_reduce、refine等其他更复杂的方法。return_source_documentsTrue对于调试和增强用户信任至关重要它让答案“有据可查”。运行这个脚本你会看到AI助手能基于你的制度文档回答问题对于不知道的内容会明确拒绝。一个最基本的RAG应用就完成了。6. 第三阶段实战创建能使用工具的智能体Agent现在我们让AI更进一步。假设我们的助手不仅能回答问题还能帮我们计算加班费调用计算工具或者查询最新的汇率调用网络搜索工具。6.1 定义工具Tools工具是Agent能力的延伸。我们先定义两个简单的工具。# agent_phase3.py from langchain.agents import Tool, AgentExecutor, create_react_agent from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain.tools import BaseTool from typing import Optional from math import pow import requests from config import OPENAI_API_KEY # 工具1一个计算加班费的自定义工具 class OvertimeCalculatorTool(BaseTool): name overtime_calculator description 用于计算加班费。输入应为用逗号分隔的字符串格式为基本工资,加班小时数,加班倍数。 例如10000,10,1.5 表示基本工资10000元加班10小时加班倍数为1.5倍。 def _run(self, query: str) - str: try: base_salary, hours, multiplier map(float, query.split(,)) # 简化计算按每月21.75个工作日每天8小时计算时薪 hourly_wage base_salary / (21.75 * 8) overtime_pay hourly_wage * hours * multiplier return f计算结果加班费为 {overtime_pay:.2f} 元。 except Exception as e: return f输入格式错误请确保输入为基本工资,加班小时数,加班倍数。错误详情{e} def _arun(self, query: str): raise NotImplementedError(此工具不支持异步) # 工具2一个获取实时汇率的工具模拟 def get_exchange_rate(currency_pair: str) - str: 获取实时汇率。输入格式如USD/CNY。此为模拟工具实际应调用API。 # 模拟数据真实场景应调用如 exchangerate-api.com 等接口 mock_rates { USD/CNY: 7.25, EUR/CNY: 7.85, JPY/CNY: 0.046 } rate mock_rates.get(currency_pair.upper()) if rate: return f当前 {currency_pair} 的汇率约为 1 : {rate}模拟数据。 else: return f暂不支持货币对 {currency_pair}请尝试 USD/CNY, EUR/CNY, JPY/CNY。 exchange_rate_tool Tool( nameget_exchange_rate, funcget_exchange_rate, description用于查询货币兑换汇率。输入一个货币对例如USD/CNY。 ) # 工具3我们之前构建的RAG知识库问答工具 from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY) vectorstore Chroma(persist_directory./chroma_db, embedding_functionembeddings) retriever vectorstore.as_retriever(search_kwargs{k: 3}) llm_for_rag ChatOpenAI(openai_api_keyOPENAI_API_KEY, modelgpt-3.5-turbo, temperature0) rag_qa RetrievalQA.from_chain_type(llmllm_for_rag, retrieverretriever) rag_tool Tool( namecompany_rules_qa, funcrag_qa.run, description用于回答关于公司规章制度、员工手册等政策类问题。输入一个具体的问题。 ) # 将所有工具放入列表 tools [OvertimeCalculatorTool(), exchange_rate_tool, rag_tool]6.2 创建智能体Agent并执行我们使用LangChain的ReAct框架来创建Agent它通过“思考Reasoning-行动Acting”循环来工作。# 接上一段代码 # 1. 初始化用于驱动Agent的LLM可以使用更强的模型如gpt-4 agent_llm ChatOpenAI( openai_api_keyOPENAI_API_KEY, modelgpt-3.5-turbo, temperature0 # Agent的思考需要确定性 ) # 2. 使用ReAct框架创建Agent # 首先我们需要一个提示模板来指导Agent如何思考和使用工具 from langchain import hub # 从LangChain Hub拉取一个标准的ReAct提示模板这是一个在线仓库包含各种预置提示 react_prompt hub.pull(hwchase17/react) # 3. 创建Agent agent create_react_agent(agent_llm, tools, react_prompt) # 4. 创建Agent执行器 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 打印详细的思考过程便于调试和理解 handle_parsing_errorsTrue, # 优雅处理Agent输出解析错误 max_iterations5, # 限制最大循环次数防止死循环 early_stopping_methodgenerate # 当Agent认为任务完成时停止 ) # 5. 测试Agent处理复杂任务 print( 测试1混合任务需要计算和知识) result1 agent_executor.invoke({ input: 我的基本工资是15000元这个月加班了15个小时公司规定加班按1.5倍计算请帮我算算加班费是多少另外我们公司关于加班审批流程是怎么规定的 }) print(f最终答案{result1[output]}\n) print( 测试2纯知识问答 ) result2 agent_executor.invoke({ input: 年假有多少天 }) print(f最终答案{result2[output]}\n) print( 测试3工具调用汇率查询) result3 agent_executor.invoke({ input: 我想知道现在1美元能换多少人民币 }) print(f最终答案{result3[output]}\n) print( 测试4超出知识范围的问题 ) result4 agent_executor.invoke({ input: 公司明年会上市吗 }) print(f最终答案{result4[output]})运行这段代码你会看到控制台输出Agent详细的思考过程verboseTrue的效果 Entering new AgentExecutor chain... 我需要计算加班费并查询加班审批流程。 首先计算加班费需要基本工资、加班小时数和加班倍数。用户提供了基本工资15000元加班15小时倍数1.5。 我应该使用加班费计算工具。 Action: overtime_calculator Action Input: 15000,15,1.5 Observation: 计算结果加班费为 1293.10 元。 现在我需要查询加班审批流程。这属于公司制度问题应该使用公司制度问答工具。 Action: company_rules_qa Action Input: 加班审批流程是怎么规定的 Observation: 根据公司《加班管理制度》第五条规定员工加班需提前在OA系统中提交加班申请经直属上级审批后方可生效。未经审批的加班不予计算费用。 现在我有两部分信息可以组合起来回答用户。 Final Answer: 根据计算您的加班费约为1293.10元。关于加班审批流程根据公司规定需要您提前在OA系统提交申请并经过直属上级审批未经审批的加班将无法计算费用。 Finished chain. 最终答案根据计算您的加班费约为1293.10元。关于加班审批流程根据公司规定需要您提前在OA系统提交申请并经过直属上级审批未经审批的加班将无法计算费用。通过这个例子你看到了一个真正的AI Agent如何工作理解复杂意图 → 规划分解任务 → 选择并调用合适工具 → 整合结果给出最终答案。这已经远远超出了一个简单聊天机器人的范畴。7. 常见问题与排查思路避坑指南在实际开发中你一定会遇到各种问题。以下是基于真实项目经验的排查清单。问题现象可能原因排查方式解决方案向量检索结果不相关1. 文本分割块大小不合适。2. 嵌入模型不适合领域文本。3. 检索器相似度算法或参数k值不佳。1. 检查分割后文本块的语义完整性。2. 尝试不同的chunk_size如500 1000 1500。3. 对查询词和检索结果进行人工评估。1. 调整chunk_size和chunk_overlap。2. 尝试其他嵌入模型如开源模型BGE、text2vec。3. 使用similarity_search_with_score查看匹配分数调整阈值或换用MMR搜索增加多样性。LLM回答出现幻觉无视检索到的上下文1. Prompt指令不够强硬。2. 检索到的上下文质量太差或噪声多。3. 模型温度temperature设置过高。1. 检查Prompt中是否明确要求“基于上下文”。2. 打印出source_documents看是否真的相关。3. 尝试用更简单的任务测试模型。1. 强化Prompt例如“你必须且只能使用以下上下文信息...”2. 优化检索环节见上一条。3. 将temperature设为0或0.1。4. 使用更强大的模型如GPT-4。Agent陷入循环或调用错误工具1. 工具描述description不清晰。2. Agent LLM能力不足。3. 最大迭代次数max_iterations过多。1. 开启verboseTrue观察Agent的思考链。2. 检查工具描述是否准确概括了功能和输入格式。1. 精炼工具描述明确输入输出格式。2. 为Agent使用更强的LLM如GPT-4。3. 合理设置max_iterations如3-5。4. 使用langgraph等框架实现更可控的工作流。程序报错OpenAI API相关错误1. API密钥未设置或错误。2. 网络问题或OpenAI服务异常。3. 达到速率限制或余额不足。1. 检查.env文件是否正确加载。2. 在代码开头打印os.getenv(“OPENAI_API_KEY”)的前几位验证。3. 查看OpenAI控制台的状态和账单。1. 确保.env文件在项目根目录且名称正确。2. 使用try...except包装API调用添加重试逻辑。3. 检查并升级API套餐。处理长文档时提示超长Token超出限制1.chain_type“stuff”模式下检索到的总上下文过长。2. 文档本身单个块就很大。1. 计算检索到的所有片段的Token总数。2. 检查模型的最大上下文长度如GPT-3.5-turbo是16K。1. 减少检索数量k。2. 换用chain_type“map_reduce”或“refine”。3. 使用具有更长上下文的模型如GPT-4-128k。4. 对检索结果进行二次摘要压缩。ChromaDB加载或保存失败1. 路径权限问题。2. 版本不兼容旧格式无法读取。1. 检查persist_directory路径是否存在且可写。2. 查看ChromaDB日志或错误信息。1. 确保使用绝对路径或正确的相对路径。2. 如果是从旧版本升级可能需要重建向量库。3. 考虑使用更稳定的向量数据库如Qdrant、Weaviate用于生产环境。8. 最佳实践与工程化建议当你掌握了基本流程后要迈向“就业级”项目必须关注以下工程化细节分阶段验证不要一次性构建复杂系统阶段1先用几篇文档测试RAG管道加载→分割→检索→生成是否跑通。阶段2优化检索质量调整分割策略、测试不同嵌入模型。阶段3优化Prompt确保答案准确且格式符合要求。阶段4引入Agent从1-2个简单工具开始测试。阶段5集成到Web服务如FastAPI并添加认证、限流、日志。Prompt工程是核心生产力将Prompt模板化、外部化存入数据库或配置文件便于迭代和A/B测试。为不同的任务摘要、问答、分类设计不同的Prompt。在Prompt中提供清晰的示例Few-shot Learning能极大提升效果。生产环境向量数据库选型Chroma适合原型、演示和小型项目简单易用。Qdrant/Weaviate/Milvus适合生产环境支持分布式、持久化、高性能检索和丰富的过滤功能。通常需要单独部署服务。日志与可观测性记录每一次用户查询、检索到的文档、生成的Prompt、模型回复、使用的Token数量。这有助于分析效果、优化成本、排查问题。可以使用LangSmithLangChain官方平台或自建ELK体系。成本与性能优化缓存对常见查询结果进行缓存避免重复调用昂贵的LLM和嵌入模型。异步处理对于耗时的文档处理、向量化等操作使用异步任务队列如Celery。模型选择在效果和成本间权衡。例如用GPT-3.5-turbo处理简单任务用GPT-4处理复杂推理用开源嵌入模型替代OpenAI的Embedding API以降低成本。评估与迭代建立评估数据集定期测试系统的准确率、相关性和响应时间。定义清晰的评估指标如“答案是否基于上下文”、“答案是否解决了问题”。根据评估结果持续迭代你的分割策略、检索参数和Prompt。从“调用API”到“构建智能系统”AI大模型应用开发的门槛确实不低但路径非常清晰。它要求开发者同时具备软件工程能力、对AI模型原理的理解以及设计交互流程的产品思维。本文带你走通的RAGLangChainAgent全流程正是当前企业招聘中最看重的核心技术栈。下一步你可以尝试将本地的ChromaDB替换为Qdrant体验生产级向量数据库。使用LangGraph来构建更复杂、带状态的多Agent工作流。将整个系统用FastAPI封装成RESTful API并为其开发一个简单的前端界面。深入探索如何评估和抑制大模型的“幻觉”例如通过让模型在回答时引用原文片段。真正的“学完即就业”不是指七天就能成为专家而是指你掌握了企业实际在用的技术栈和开发范式拥有了可以深入学习和实践的清晰地图。剩下的就是在具体的项目中去打磨和深化了。
返回列表