建立公司网站的申请烟台理工学校网站
2026/3/13 14:07:09 网站建设 项目流程
建立公司网站的申请,烟台理工学校网站,成都营销网站建设,建e室内设计网官网图库构建传统 RAG Agent#xff1a;从文档到知识库的完整之旅 1. 前言 在大模型应用中#xff0c;检索增强生成#xff08;RAG#xff0c;Retrieval-Augmented Generation#xff09; 是一种强大的技术#xff0c;它通过将外部知识库与大模型结合#xff0c;使得模型能够基…构建传统 RAG Agent从文档到知识库的完整之旅1. 前言在大模型应用中检索增强生成RAGRetrieval-Augmented Generation是一种强大的技术它通过将外部知识库与大模型结合使得模型能够基于真实数据生成更准确的回答。本文将详细讲解如何使用LangChain LangGraph DashScope Milvus的技术栈从零开始构建一个完整的传统 RAG Agent。2. 项目架构概览┌─────────────────┐ │ 原始文档 │ │ (company.txt) │ └────────┬────────┘ │ ▼ ┌──────────────────────────┐ │ 文本分割器 │ │ (RecursiveCharacterTS) │ └────────┬─────────────────┘ │ ▼ ┌──────────────────────────┐ │ 向量化 (Embeddings) │ │ (DashScope Embeddings) │ └────────┬─────────────────┘ │ ▼ ┌──────────────────────────┐ │ 向量数据库 (Milvus) │ │ 存储与检索向量索引 │ └────────┬─────────────────┘ │ ▼ ┌──────────────────────────┐ │ RAG Chain │ │ 检索 提示词 LLM │ └────────┬─────────────────┘ │ ▼ ┌──────────────────────────┐ │ LangGraph Agent │ │ (集成多代理系统) │ └──────────────────────────┘3. 代码详解3.1 第一阶段环境初始化与依赖导入importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_community.embeddingsimportDashScopeEmbeddingsfromlangchain_milvusimportMilvusfromlangchain_core.promptsimportPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.documentsimportDocumentfromlangchain_core.messagesimportHumanMessagefromlanggraph.graphimportStateGraph,MessagesState,START,END load_dotenv()keyos.getenv(DASHSCOPE_API_KEY)base_urlos.getenv(DASHSCOPE_API_BASE)3.1.1 关键点说明dotenv 环境配置通过.env文件安全地存储 API 密钥避免硬编码敏感信息模块迁移注意使用langchain_text_splitters而非langchain.text_splitterLangChain 0.2 的变化通义千问集成使用DashScopeEmbeddings而非 OpenAI Embeddings3.2 第二阶段大模型初始化graph_llmChatOpenAI(temperature0,model_nameqwen-plus-2025-12-01,api_keykey,base_urlbase_url)llmChatOpenAI(temperature0,model_nameqwen-plus,api_keykey,base_urlbase_url)3.2.1 参数解析参数含义取值temperature输出随机性0 确定性(适合RAG), 1 创意性model_name模型版本qwen-plus基础/ qwen-plus-2025-12-01增强api_key身份认证从.env读取不显示实际密钥base_urlAPI 端点通义千问 API 基址从.env读取3.3 第三阶段文档加载与文本分割# Step 1: 加载文档withopen(../doc/company.txt,r,encodingutf-8)asfile:contentfile.read()documents[Document(page_contentcontent)]# Step 2: 文本分割chunk_size250chunk_overlap30text_splitterRecursiveCharacterTextSplitter(chunk_sizechunk_size,chunk_overlapchunk_overlap)splitstext_splitter.split_documents(documents)3.3.1 核心原理chunk_size 250每个文本块的大小平衡上下文完整性与检索精度chunk_overlap 30相邻块的重叠部分避免重要信息被截断RecursiveCharacterTextSplitter递归按层级分割段落 → 句子 → 词保持文本逻辑连贯3.3.2 为什么要分割直接存储完整文档会导致向量检索结果过冗长分割后可精准定位用户查询相关的信息片段大模型的上下文窗口有限分割能提高效率3.4 第四阶段向量化与向量库构建# Step 3: 初始化 EmbeddingsembeddingsDashScopeEmbeddings(modeltext-embedding-v4,dashscope_api_keykey# 从环境变量读取)# Step 4: 构建向量索引vectorstoreMilvus.from_documents(documentssplits,collection_namecompany_milvus,embeddingembeddings,connection_args{uri:os.getenv(MILVUS_URI),# 从环境变量读取user:os.getenv(MILVUS_USER),# 从环境变量读取password:os.getenv(MILVUS_PASSWORD),# 从环境变量读取})这里向量库可以考虑在线。这里我们同样使用免费的在线milvus实例地址如下https://cloud.zilliz.com/login?redirect/orgs 先注册登录创建索引选择免费实例保存好用户密码3.4.1 工作流程文本块 ↓ DashScope Embeddings (文本向量化) ↓ 向量 (1024 维) ↓ Milvus (向量存储与索引) ↓ HNSW/IVF 索引结构 ↓ 支持快速相似度检索3.4.2 Milvus 的作用向量存储以向量形式存储文本块快速检索使用 HNSW 算法时间复杂度 O(log n)云端部署无需本地安装直接使用云实例连接信息从环境变量读取3.5 第五阶段RAG Chain 构建# Step 5: 创建 RAG ChainpromptPromptTemplate(templateYou are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you dont know the answer, just say that you dont know. Use three sentences maximum and keep the answer concise: Question: {question} Context: {context} Answer: ,input_variables[question,context],)rag_chainprompt|graph_llm|StrOutputParser()3.5.1 LCEL 管道解析用户问题 检索上下文 ↓ PromptTemplate (格式化) ↓ ChatOpenAI (推理) ↓ StrOutputParser (解析输出) ↓ 最终回答3.5.2 提示词设计的三个要点角色定义明确告知模型是问答助手约束条件最多三句话简洁表达容错机制不知道的情况下说不知道避免幻觉3.6 第六阶段RAG Chain 测试# Step 6: 测试question我的知识库中都有哪些公司信息retrievervectorstore.as_retriever(search_kwargs{k:1})docsretriever.invoke(question)generationrag_chain.invoke({context:docs,question:question})print(f生成的答案:{generation})3.6.1 检索流程步骤操作输出1问题向量化1024 维向量2Milvus 相似度搜索Top-k 最相关文本块3构建提示词格式化后的完整提示4调用大模型结构化回答5解析输出纯文本答案3.7 第七阶段LangGraph Agent 节点定义# Step 7: 定义 AgentStateclassAgentState(MessagesState):next:str# Step 8: 创建 vec_kg Agent 节点defvec_kg(state:AgentState):messagesstate[messages][-1]questionmessages.content promptPromptTemplate(templateYou are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you dont know the answer, just say that you dont know. Use three sentences maximum and keep the answer concise: Question: {question} Context: {context} Answer: ,input_variables[question,context],)rag_chainprompt|graph_llm|StrOutputParser()retrievervectorstore.as_retriever(search_kwargs{k:1})docsretriever.invoke(question)generationrag_chain.invoke({context:docs,question:question})final_response[HumanMessage(contentgeneration,namevec_kg)]return{messages:final_response}3.7.1 Agent 节点的核心逻辑状态输入 (消息列表) ↓ 提取最后一条消息作为问题 ↓ 执行 RAG Chain (检索 推理) ↓ 包装为 HumanMessage (带 vec_kg 标识) ↓ 返回更新后的状态3.7.2 为什么需要 AgentState消息管理维护对话历史多代理协作标识消息来源vec_kg, graph_kg, chat 等状态转移通过next字段控制代理流向3.8 第八阶段测试与验证# Step 9: 测试 vec_kg 节点if__name____main__:test_stateAgentState(messages[HumanMessage(content我的知识库中都有哪些公司信息)])resultvec_kg(test_state)print(fRAG Agent 响应:{result})4. 核心概念理解4.1 什么是 RAG4.1.1 传统 LLM 的局限知识截止日期固定训练数据年份无法访问私密数据容易产生幻觉编造答案4.1.2 RAG 的解决方案用户问题 → [检索] 相关文档 → [融合] 上下文 → [生成] 准确答案4.2 为什么使用向量数据库方案检索方式优点缺点全文搜索关键词匹配速度快语义理解差向量相似度语义匹配准确度高需要计算成本本项目选择向量方案基于语义理解适合复杂问题4.3 DashScope vs OpenAI Embeddings特性DashScopeOpenAI成本更便宜较贵语言中文优化英文优先维度1024 维1536 维部署国内快速需科学上网5. 应用扩展方向5.1 混合检索Hybrid Retrieval# 结合向量检索 BM25 关键词检索resultsvectorstore.similarity_search_with_score(question,k5)bm25_resultsbm25_retriever.get_relevant_documents(question)combinedmerge_and_rerank(results,bm25_results)5.2 多知识库联合# 组合图数据库 向量数据库 传统数据库supervisor_agent.route_to([graph_kg,vec_kg,db_agent])5.3 逐步优化提示词# 使用少样本学习 (Few-shot)template 示例 1... 示例 2... 用户问题{question} 6. 常见问题排查6.1 向量检索结果不相关原因chunk_size 过大或过小解决调整分割参数 (推荐 200-500)6.2 回答包含幻觉信息原因检索文档不足或提示词不强制解决# 强制模型只基于上下文回答templateIf the context is not helpful, just say you dont know.6.3 响应速度慢原因Milvus 索引未优化或网络延迟解决# 增加 batch 处理或缓存cache_layercaching_decorator(rag_chain)7. 总结本文展示了构建一个完整的传统 RAG Agent 的全过程文档处理加载 → 分割 → 向量化知识存储向量数据库集成检索增强基于语义的精准匹配智能生成RAG Chain 组合多代理集成LangGraph 框架应用这个系统可以立即用于 企业知识库问答 产品信息快速查询 文档智能总结 复杂问题推理下一步可以考虑引入GraphRAG图知识库以处理更复杂的关系推理任务构建混合知识库系统8. 参考资源LangChain 官方文档Milvus 向量数据库LangGraph 多代理框架通义千问 API完整代码贴上importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_community.embeddingsimportDashScopeEmbeddingsfromlangchain_milvusimportMilvusfromlangchain_core.promptsimportPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.documentsimportDocumentfromlangchain_core.messagesimportHumanMessagefromlanggraph.graphimportStateGraph,MessagesState,START,END# 加载环境变量load_dotenv()keyos.getenv(DASHSCOPE_API_KEY)base_urlos.getenv(DASHSCOPE_API_BASE)# 初始化 LLMgraph_llmChatOpenAI(temperature0,model_nameqwen-plus-2025-12-01,api_keykey,base_urlbase_url)llmChatOpenAI(temperature0,model_nameqwen-plus,api_keykey,base_urlbase_url)# 3.4 创建传统 RAG Agent# Step 1: 加载文档并分割withopen(../doc/company.txt,r,encodingutf-8)asfile:contentfile.read()documents[Document(page_contentcontent)]# Step 2: 文本分割chunk_size250chunk_overlap30text_splitterRecursiveCharacterTextSplitter(chunk_sizechunk_size,chunk_overlapchunk_overlap)splitstext_splitter.split_documents(documents)# Step 3: 初始化 EmbeddingsembeddingsDashScopeEmbeddings(modeltext-embedding-v4,dashscope_api_keykey)# Step 4: 构建向量索引并存储到 MilvusvectorstoreMilvus.from_documents(documentssplits,collection_namecompany_milvus,embeddingembeddings,connection_args{uri:https://xxxxxxxxxxxxxxx.serverless.gcp-us-west1.cloud.zilliz.com,user:xxxxxxxxx,# 替换为自己的password:xxxxxx,})# Step 5: 创建 RAG ChainpromptPromptTemplate(templateYou are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you dont know the answer, just say that you dont know. Use three sentences maximum and keep the answer concise: Question: {question} Context: {context} Answer: ,input_variables[question,context],)rag_chainprompt|graph_llm|StrOutputParser()# Step 6: 测试 RAG Chainquestion我的知识库中都有哪些公司信息retrievervectorstore.as_retriever(search_kwargs{k:1})docsretriever.invoke(question)generationrag_chain.invoke({context:docs,question:question})print(f生成的答案:{generation})# Step 7: 定义 AgentStateclassAgentState(MessagesState):next:str# Step 8: 创建传统 RAG 的 Agent 节点defvec_kg(state:AgentState):messagesstate[messages][-1]questionmessages.content promptPromptTemplate(templateYou are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you dont know the answer, just say that you dont know. Use three sentences maximum and keep the answer concise: Question: {question} Context: {context} Answer: ,input_variables[question,context],)# 构建传统的RAG Chainrag_chainprompt|graph_llm|StrOutputParser()# 构建检索器retrievervectorstore.as_retriever(search_kwargs{k:1})# 执行检索docsretriever.invoke(question)generationrag_chain.invoke({context:docs,question:question})final_response[HumanMessage(contentgeneration,namevec_kg)]return{messages:final_response}# Step 9: 测试 vec_kg 节点if__name____main__:test_stateAgentState(messages[HumanMessage(content我的知识库中都有哪些公司信息)])resultvec_kg(test_state)print(fRAG Agent 响应:{result})

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询