RAG 向量体系与知识库实战篇
# RAG 向量体系与知识库实战篇
📌 本文承接上篇《RAG + Embedding + 向量库 完整理解》,聚焦于如何在实践中构建一个稳定、可扩展、支持多模型的 RAG 系统。我们将讲清楚:如何处理 embedding 一致性、多模型接入问题、如何压缩向量、如何构建本地知识库。
# 🧩 一、Embedding 与大模型分离后的协作问题
在真实项目中,很多人希望:
- 文档知识库用 OpenAI 向量建好
- 但用户提问用本地模型(比如 DeepSeek、通义千问)来生成回答
这就涉及一个核心前提:
🧠 “大模型用于生成,不一定是用来构建知识库的。” 但“用户提问时的向量,一定要和知识库建库时使用的 embedding 模型一致。”
# ✅ 推荐架构:
阶段 | 使用模型 | 描述 |
---|---|---|
文档建库 | OpenAI embedding(或 bge/E5) | 把文本变成向量,存入向量库(一次性) |
用户提问向量化 | 同上 | 必须用同一个 embedding 模型计算 query 向量(每次) |
大模型回答生成 | 可选(GPT/DeepSeek/通义等) | 使用语义补全的 prompt 生成文本 |
⚠️ 向量库 ≠ LLM,大模型用哪个不影响向量检索逻辑。
# 📦 二、多模型支持下的向量一致性解决方案
# ❌ 错误做法:
- 建库时用
text-embedding-ada-002
- 提问时用
bge-small-zh
做 embedding - 结果:语义空间不同,向量比对失败
# ✅ 解决方案:
- 所有 embedding 请求统一通过向量服务调用:如
POST /embed
由服务内部封装 embedding 模型 - 封装对文档和 query 使用同一个模型,无论调用 LLM 是什么
- 把 embedding 模型 ID 加入文档索引版本中,确保检索安全性
✨ 甚至可以做多 embedding 模型向量共存,但要独立索引与检索逻辑,不推荐初期使用
# 🧠 三、RAG 系统中的向量压缩与摘要策略
在向量库中存储整篇文档会导致:
- 相似度不精准(噪声太多)
- 返回的内容太长,Prompt 塞不下
# ✅ 建议做法:
- 文档拆分: 按段/句/标题分段
- 摘要压缩: 使用本地模型提前生成 300 字精华摘要
- embedding 入库: 只存精华片段,而非全文
- 多轮 query 匹配 + rerank:
- 初步用向量查 Top 10
- 再用大模型对匹配内容打分 rerank,选前3拼入 Prompt
📌 记住:RAG 本质是「高召回 + 精排序」
# 🏗 四、本地知识库构建实战流程
以 markdown 文档为例,构建完整向量库:
# 1️⃣ 文档预处理:
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_text(document_text)
2
3
4
# 2️⃣ 向量转化并存库(FAISS):
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
emb = HuggingFaceEmbeddings(model_name="BAAI/bge-base-zh-v1.5")
vectorstore = FAISS.from_texts(chunks, emb)
vectorstore.save_local("./faiss_db")
2
3
4
5
6
# 3️⃣ 用户 query 检索:
query = "2024年员工入职制度有哪些变化?"
matched_docs = vectorstore.similarity_search(query, k=5)
2
# 4️⃣ 拼接 Prompt 给大模型:
你是一个HR助手,请根据以下资料回答:
<知识片段1>
<知识片段2>
...
问题:2024年员工入职制度有哪些变化?
2
3
4
5
# 🔚 小结
RAG 系统设计远不只是简单地“把文档塞给大模型”,而是一整套围绕 embedding 策略、数据切分策略、向量存储优化与上下文拼接调度 的工程体系。
理解并实现以下三点,才能让你的 RAG 系统真正稳定可用:
- 向量生成模型要统一
- 向量切分要干净精准,避免上下文干扰
- 上下文注入 Prompt 要遵循 token 上限原则与上下文意图设计
# 🧮 五、Hybrid Search 混合检索策略
Hybrid Search(混合检索)是将“语义向量检索”和“关键词关键词精确匹配”结合的一种更鲁棒的检索方式。
# ✅ 背景:
- 纯向量搜索容易召回“不相关但语义接近”的内容
- 关键词检索可以提供准确性补偿
# ✅ 实现方式:
- 用户提问时,同时:
- 做向量 embedding → 检索 top-N
- 提取关键词(如分词后筛名词) → Elasticsearch/Whoosh 精确匹配
- 对两个结果集合做合并:
- 可以先 union → 再 rerank
- 或打分融合(加权打分)
- 拼接内容进入 prompt
# ✅ LangChain 示例策略:
# 向量检索结果
semantic_docs = vectorstore.similarity_search(query, k=5)
# 关键词检索结果(例如使用 BM25)
token_docs = keyword_index.search(query, top_k=5)
# 合并去重
all_docs = list({doc.page_content: doc for doc in (semantic_docs + token_docs)}.values())
2
3
4
5
6
📌 混合检索适用于内容存在专业术语、命名实体或全文过大不易 embedding 的场景。
# 🔗 六、LangChain + FAISS + Chat API 的集成方案
# ✅ 核心组件结构:
[用户问题] → [Embedding 模型] → [FAISS 检索] → [Prompt 构造器] → [LLM API 调用] → [返回答案]
# ✅ 示例代码片段(本地 embedding + OpenAI LLM)
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
embedding = HuggingFaceEmbeddings(model_name="bge-base-zh")
vectorstore = FAISS.load_local("./faiss_db", embedding)
llm = ChatOpenAI(model_name="gpt-4")
qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True
)
response = qa.run("请告诉我2024年合同法的最新调整内容?")
print(response)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
📌 LangChain 是非常适合构建 RAG 应用的工具,核心优点:组件标准化、支持本地/远程混用、支持向量库/搜索混合接入。
# 🤖 七、Agent + RAG 的融合策略
RAG 解决了“知识来源”问题,Agent 解决了“任务决策与工具调度”问题。
结合方式:
让 Agent 把 RAG 作为一种 Tool 挂载,当任务需要知识时自动调用。
# ✅ 使用 LangChain 实现方式:
from langchain.agents import initialize_agent, Tool
from langchain.agents.agent_types import AgentType
qa_tool = Tool(
name="KnowledgeBaseQA",
func=qa.run,
description="查询内部法律知识库回答提问"
)
agent = initialize_agent(
tools=[qa_tool],
llm=ChatOpenAI(),
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
agent.run("帮我查一下2024年入职试用期变动")
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ✅ 场景举例:
- Agent 先判断任务意图:是否需要查知识?
- 是 → 自动调用 RAG 工具 → 拼接进多工具工作流中(如计划生成 + 数据调用 + 查询法务)
📌 RAG 可以作为 Agent 的底层知识接口,未来结合 Tool Calling / Function Calling / Action Plan,将形成完整“具知识感知力的智能体”。
# ✅ 总结:构建稳健、可拓展的 RAG 系统的关键点
- 统一的 Embedding 向量空间(数据和 query 必须来自同一模型)
- 混合检索策略(Hybrid)+ Rerank 提升准确率
- 向量切分、摘要与 Prompt 拼接策略决定结果上限
- LangChain 架构是集成 RAG + Agent 的最佳实践载体
- Agent 驱动的 RAG 工具化是构建智能系统的未来方向
📌 后续专题可扩展:RAG 分布式部署、知识更新机制、LangGraph 任务编排、Chunk 动态缓存等