1. 前言


在大模型应用中,检索增强生成(RAG,Retrieval-Augmented Generation) 是一种强大的技术,它通过将外部知识库与大模型结合,使得模型能够基于真实数据生成更准确的回答。本文将详细讲解如何使用 LangChain + LangGraph + DashScope + Milvus 的技术栈,从零开始构建一个完整的传统 RAG Agent。


  1. 项目架构概览

┌─────────────────┐│   原始文档      ││ (company.txt)   │└────────┬────────┘         │         ▼┌──────────────────────────┐│   文本分割器              ││ (RecursiveCharacterTS)   │└────────┬─────────────────┘         │         ▼┌──────────────────────────┐│   向量化 (Embeddings)    ││ (DashScope Embeddings)   │└────────┬─────────────────┘         │         ▼┌──────────────────────────┐│   向量数据库 (Milvus)    ││  存储与检索向量索引      │└────────┬─────────────────┘         │         ▼┌──────────────────────────┐│   RAG Chain              ││  检索 + 提示词 + LLM      │└────────┬─────────────────┘         │         ▼┌──────────────────────────┐│   LangGraph Agent        ││ (集成多代理系统)         │└──────────────────────────┘

  1. 代码详解

3.1 第一阶段:环境初始化与依赖导入

import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.embeddings import DashScopeEmbeddingsfrom langchain_milvus import Milvusfrom langchain_core.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.documents import Documentfrom langchain_core.messages import HumanMessagefrom langgraph.graph import StateGraph, MessagesState, START, ENDload_dotenv()key = os.getenv("DASHSCOPE_API_KEY")base_url = os.getenv("DASHSCOPE_API_BASE")
3.1.1 关键点说明
    1. dotenv 环境配置:通过 .env 文件安全地存储 API 密钥,避免硬编码敏感信息
    1. 模块迁移:注意使用 langchain_text_splitters 而非 langchain.text_splitter(LangChain 0.2+ 的变化)
    1. 通义千问集成:使用 DashScopeEmbeddings 而非 OpenAI Embeddings

3.2 第二阶段:大模型初始化

graph_llm = ChatOpenAI(temperature=0, model_name="qwen-plus-2025-12-01",                       api_key=key, base_url=base_url)llm = ChatOpenAI(temperature=0, model_name="qwen-plus",                 api_key=key, base_url=base_url)
3.2.1 参数解析
参数 含义 取值
temperature 输出随机性 0 = 确定性(适合RAG), 1 = 创意性
model_name 模型版本 qwen-plus(基础)/ qwen-plus-2025-12-01(增强)
api_key 身份认证 .env 读取(不显示实际密钥)
base_url API 端点 通义千问 API 基址(从 .env 读取)

3.3 第三阶段:文档加载与文本分割

# Step 1: 加载文档with open('../doc/company.txt', 'r', encoding="utf-8") as file:    content = file.read()documents = [Document(page_content=content)]# Step 2: 文本分割chunk_size = 250chunk_overlap = 30text_splitter = RecursiveCharacterTextSplitter(    chunk_size=chunk_size, chunk_overlap=chunk_overlap)splits = text_splitter.split_documents(documents)
```![](http://cdn.zhipoai.cn/d159d36f.jpg)

#### 3.3.1 核心原理

* • **chunk\_size = 250**:每个文本块的大小,平衡上下文完整性与检索精度
* • **chunk\_overlap = 30**:相邻块的重叠部分,避免重要信息被截断
* • **RecursiveCharacterTextSplitter**:递归按层级分割(段落 → 句子 → 词),保持文本逻辑连贯

#### 3.3.2 为什么要分割?

* • 直接存储完整文档会导致向量检索结果过冗长
* • 分割后可精准定位用户查询相关的信息片段
* • 大模型的上下文窗口有限,分割能提高效率

---

### 3.4 第四阶段:向量化与向量库构建

```plaintext
# Step 3: 初始化 Embeddingsembeddings = DashScopeEmbeddings(    model="text-embedding-v4",    dashscope_api_key=key  # 从环境变量读取)# Step 4: 构建向量索引vectorstore = Milvus.from_documents(    documents=splits,    collection_name="company_milvus",    embedding=embeddings,    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 , 先注册登录  
![](http://cdn.zhipoai.cn/7946e7af.jpg)

![](http://cdn.zhipoai.cn/293365e9.jpg)

创建索引:  
![](http://cdn.zhipoai.cn/35443fd2.jpg)

选择免费实例:  
![](http://cdn.zhipoai.cn/e4fb3652.jpg)

保存好用户密码:  
![](http://cdn.zhipoai.cn/f4035091.jpg)

![](http://cdn.zhipoai.cn/93787bee.jpg)

#### 3.4.1 工作流程

```plaintext
文本块  ↓DashScope Embeddings (文本向量化)  ↓向量 (1024 维)  ↓Milvus (向量存储与索引)  ↓HNSW/IVF 索引结构  ↓支持快速相似度检索
3.4.2 Milvus 的作用
  • 向量存储:以向量形式存储文本块
  • 快速检索:使用 HNSW 算法,时间复杂度 O(log n)
  • 云端部署:无需本地安装,直接使用云实例,连接信息从环境变量读取

3.5 第五阶段:RAG Chain 构建

# Step 5: 创建 RAG Chainprompt = PromptTemplate(    template="""You are an assistant for question-answering tasks.     Use the following pieces of retrieved context to answer the question.     If you don't know the answer, just say that you don't know.     Use three sentences maximum and keep the answer concise:    Question: {question}     Context: {context}     Answer:     """,    input_variables=["question", "context"],)rag_chain = prompt | graph_llm | StrOutputParser()
3.5.1 LCEL 管道解析
用户问题 + 检索上下文    ↓PromptTemplate (格式化)    ↓ChatOpenAI (推理)    ↓StrOutputParser (解析输出)    ↓最终回答
3.5.2 提示词设计的三个要点
    1. 角色定义:明确告知模型是问答助手
    1. 约束条件:最多三句话,简洁表达
    1. 容错机制:不知道的情况下说"不知道",避免幻觉

3.6 第六阶段:RAG Chain 测试

# Step 6: 测试question = "我的知识库中都有哪些公司信息"retriever = vectorstore.as_retriever(search_kwargs={"k": 1})docs = retriever.invoke(question)generation = rag_chain.invoke({"context": docs, "question": question})print(f"生成的答案: {generation}")
3.6.1 检索流程
步骤 操作 输出
1 问题向量化 1024 维向量
2 Milvus 相似度搜索 Top-k 最相关文本块
3 构建提示词 格式化后的完整提示
4 调用大模型 结构化回答
5 解析输出 纯文本答案

3.7 第七阶段:LangGraph Agent 节点定义

# Step 7: 定义 AgentStateclassAgentState(MessagesState):    next: str# Step 8: 创建 vec_kg Agent 节点defvec_kg(state: AgentState):    messages = state["messages"][-1]    question = messages.content        prompt = PromptTemplate(        template="""You are an assistant for question-answering tasks.         Use the following pieces of retrieved context to answer the question.         If you don't know the answer, just say that you don't know.         Use three sentences maximum and keep the answer concise:        Question: {question}         Context: {context}         Answer:         """,        input_variables=["question", "context"],    )    rag_chain = prompt | graph_llm | StrOutputParser()    retriever = vectorstore.as_retriever(search_kwargs={"k": 1})    docs = retriever.invoke(question)    generation = rag_chain.invoke({"context": docs, "question": question})        final_response = [HumanMessage(content=generation, name="vec_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_state = AgentState(        messages=[HumanMessage(content="我的知识库中都有哪些公司信息")]    )    result = vec_kg(test_state)    print(f"RAG Agent 响应: {result}")
```![](http://cdn.zhipoai.cn/85b21207.jpg)

---

4. 核心概念理解
---------

### 4.1 什么是 RAG?

#### 4.1.1 传统 LLM 的局限

* • 知识截止日期固定(训练数据年份)
* • 无法访问私密数据
* • 容易产生幻觉(编造答案)

#### 4.1.2 RAG 的解决方案

```plaintext
用户问题 → [检索] 相关文档 → [融合] 上下文 → [生成] 准确答案

4.2 为什么使用向量数据库?

方案 检索方式 优点 缺点
全文搜索 关键词匹配 速度快 语义理解差
向量相似度 语义匹配 准确度高 需要计算成本

本项目选择向量方案:基于语义理解,适合复杂问题


4.3 DashScope vs OpenAI Embeddings

特性 DashScope OpenAI
成本 更便宜 较贵
语言 中文优化 英文优先
维度 1024 维 1536 维
部署 国内快速 需科学上网

  1. 应用扩展方向

5.1 混合检索(Hybrid Retrieval)

# 结合向量检索 + BM25 关键词检索results = vectorstore.similarity_search_with_score(question, k=5)bm25_results = bm25_retriever.get_relevant_documents(question)combined = merge_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}"""

  1. 常见问题排查

6.1 向量检索结果不相关

原因:chunk_size 过大或过小
解决:调整分割参数 (推荐 200-500)

6.2 回答包含幻觉信息

原因:检索文档不足或提示词不强制
解决

# 强制模型只基于上下文回答template += "If the context is not helpful, just say you don't know."

6.3 响应速度慢

原因:Milvus 索引未优化或网络延迟
解决

# 增加 batch 处理或缓存cache_layer = caching_decorator(rag_chain)

  1. 总结

本文展示了构建一个完整的传统 RAG Agent 的全过程:

    1. 文档处理:加载 → 分割 → 向量化
    1. 知识存储:向量数据库集成
    1. 检索增强:基于语义的精准匹配
    1. 智能生成:RAG Chain 组合
    1. 多代理集成:LangGraph 框架应用

这个系统可以立即用于:

  • • 📚 企业知识库问答
  • • 💼 产品信息快速查询
  • • 📖 文档智能总结
  • • 🔍 复杂问题推理

下一步可以考虑引入 GraphRAG(图知识库)以处理更复杂的关系推理任务,构建混合知识库系统!


  1. 参考资源

  • • LangChain 官方文档
  • • Milvus 向量数据库
  • • LangGraph 多代理框架
  • • 通义千问 API

完整代码贴上:

import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.embeddings import DashScopeEmbeddingsfrom langchain_milvus import Milvusfrom langchain_core.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.documents import Documentfrom langchain_core.messages import HumanMessagefrom langgraph.graph import StateGraph, MessagesState, START, END# 加载环境变量load_dotenv()key = os.getenv("DASHSCOPE_API_KEY")base_url = os.getenv("DASHSCOPE_API_BASE")# 初始化 LLMgraph_llm = ChatOpenAI(temperature=0, model_name="qwen-plus-2025-12-01", api_key=key, base_url=base_url)llm = ChatOpenAI(temperature=0, model_name="qwen-plus", api_key=key, base_url=base_url)# 3.4 创建传统 RAG Agent# Step 1: 加载文档并分割withopen('../doc/company.txt', 'r', encoding="utf-8") as file:    content = file.read()documents = [Document(page_content=content)]# Step 2: 文本分割chunk_size = 250chunk_overlap = 30text_splitter = RecursiveCharacterTextSplitter(    chunk_size=chunk_size, chunk_overlap=chunk_overlap)splits = text_splitter.split_documents(documents)# Step 3: 初始化 Embeddingsembeddings = DashScopeEmbeddings(    model="text-embedding-v4",    dashscope_api_key=key)# Step 4: 构建向量索引并存储到 Milvusvectorstore = Milvus.from_documents(    documents=splits,    collection_name="company_milvus",    embedding=embeddings,    connection_args={        "uri": "https://xxxxxxxxxxxxxxx.serverless.gcp-us-west1.cloud.zilliz.com",        "user": "xxxxxxxxx", # 替换为自己的        "password": "xxxxxx",    })# Step 5: 创建 RAG Chainprompt = PromptTemplate(    template="""You are an assistant for question-answering tasks.     Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know.     Use three sentences maximum and keep the answer concise:    Question: {question}     Context: {context}     Answer:     """,    input_variables=["question", "context"],)rag_chain = prompt | graph_llm | StrOutputParser()# Step 6: 测试 RAG Chainquestion = "我的知识库中都有哪些公司信息"retriever = vectorstore.as_retriever(search_kwargs={"k": 1})docs = retriever.invoke(question)generation = rag_chain.invoke({"context": docs, "question": question})print(f"生成的答案: {generation}")# Step 7: 定义 AgentStateclassAgentState(MessagesState):    next: str# Step 8: 创建传统 RAG 的 Agent 节点defvec_kg(state: AgentState):    messages = state["messages"][-1]    question = messages.content        prompt = PromptTemplate(        template="""You are an assistant for question-answering tasks.         Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know.         Use three sentences maximum and keep the answer concise:        Question: {question}         Context: {context}         Answer:         """,        input_variables=["question", "context"],    )    # 构建传统的RAG Chain    rag_chain = prompt | graph_llm | StrOutputParser()       # 构建检索器    retriever = vectorstore.as_retriever(search_kwargs={"k": 1})        # 执行检索    docs = retriever.invoke(question)    generation = rag_chain.invoke({"context": docs, "question": question})        final_response = [HumanMessage(content=generation, name="vec_kg")]        return {"messages": final_response}# Step 9: 测试 vec_kg 节点if __name__ == "__main__":    test_state = AgentState(        messages=[HumanMessage(content="我的知识库中都有哪些公司信息")]    )    result = vec_kg(test_state)    print(f"RAG Agent 响应: {result}")

想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2025 年 AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享

👇👇扫码免费领取全部内容👇👇

一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势

想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI

1. 100+本大模型方向电子书

在这里插入图片描述

2. 26 份行业研究报告:覆盖多领域实践与趋势

报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:

  • 职业趋势:《AI + 职业趋势报告》《中国 AI 人才粮仓模型解析》;
  • 商业落地:《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》;
  • 领域细分:《AGI 在金融领域的应用报告》《AI GC 实践案例集》;
  • 行业监测:《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。

3. 600+套技术大会 PPT:听行业大咖讲实战

PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:

在这里插入图片描述

  • 安全方向:《端侧大模型的安全建设》《大模型驱动安全升级(腾讯代码安全实践)》;
  • 产品与创新:《大模型产品如何创新与创收》《AI 时代的新范式:构建 AI 产品》;
  • 多模态与 Agent:《Step-Video 开源模型(视频生成进展)》《Agentic RAG 的现在与未来》;
  • 工程落地:《从原型到生产:AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。

二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走

想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!

1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位

面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析

2. 102 道 AI 大模型真题:直击大模型核心考点

针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:

3. 97 道 LLMs 真题:聚焦大型语言模型高频问题

专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:


三、路线必明: AI 大模型学习路线图,1 张图理清核心内容

刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!

在这里插入图片描述

路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。

img

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

img

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

img

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

img

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

img

L5阶段:专题集丨特训篇 【录播课】

img
四、资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

👇👇扫码免费领取全部内容👇👇

2025 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐