摘要:本文以代码实例拆解RAG的索引构建、查询检索、答案生成三步骤,并给出基础/进阶/模块化三层次进化路径,帮助你掌握如何让大模型精准理解你的网站内容。
问题:大模型"失忆",无法感知最新网站
大模型(如GPT、Claude)的知识截止于训练时的数据。如果你的网站今天刚刚上线,模型不可能"知道"它的存在。这让依赖实时内容的场景(FAQ、产品文档、技术博客)陷入困境------模型只能靠旧记忆回答,无法引用最新信息。
业界给出的优雅方案是:RAG(Retrieval-Augmented Generation,检索增强生成)。它让模型不再死记硬背,而是学会实时翻书。
方案:三步拆解 RAG 如何"看到"你的网站
RAG 的本质是 检索 + 生成 的协同。下面以代码级视角,拆解它的核心三步。
1. 索引构建:将网站"切碎"并编码
大模型无法直接读取 HTML 或 PDF,需要将内容转化为可搜索的向量。
- 文档切分:将长网页按语义切割成块(通常 256-512 tokens)。例如一篇 5000 字的博客会被拆成 10 个片段,每个约 500 字。
- 向量化 :每个片段通过嵌入模型(如
text-embedding-3-small)转化为高维向量(例如 768 维)。相似的内容产生几何上接近的向量。 - 存储索引:向量存入数据库(如 Pinecone、Weaviate、Chroma),并建立快速检索索引(如 HNSW)。
python
# 示例:使用 LangChain 构建向量索引
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 切分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
chunks = text_splitter.split_text(your_website_text)
# 向量化与存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(chunks, embeddings)
2. 查询检索:找到最相关的内容
用户提问时,RAG 需要快速定位相关片段。关键区别在于:语义匹配而非关键词匹配。
- 查询向量化:用户问题通过相同嵌入模型转换为向量。
- 近似最近邻搜索:在向量数据库中,使用 HNSW 算法找到 K 个最接近的片段(K 通常为 3-10)。
- 过滤与排序:根据余弦相似度排序,可加入元数据过滤(如仅检索营销类页面)。
python
# 示例:检索与用户问题最相关的片段
query = "我忘记密码怎么重置?"
query_vector = embeddings.embed_query(query)
results = vectorstore.similarity_search_by_vector(query_vector, k=5)
for doc in results:
print(doc.page_content)
3. 答案生成:让大模型"读"你的内容
检索到的片段被作为上下文喂给大模型。
- 上下文注入:将 K 个片段拼接为结构化的 prompt
- 生成回答:大模型(如 GPT-4)基于此上下文生成答案。若上下文不足以回答问题,应主动回答"抱歉,我没有找到相关信息",而非编造。
python
# 示例:将检索结果注入 prompt 并调用 LLM
context = "\n".join([doc.page_content for doc in results])
prompt = f"基于以下信息回答用户提问:\n{context}\n\n问题:{query}\n答案:"
llm_response = llm.invoke(prompt)
实践:RAG 的三重进化
并非所有 RAG 系统都一样。根据场景复杂度,可分为三层:
基础 RAG(Naive RAG)
- 简单切分 + 向量检索 + 直接回答
- 局限:多跳推理或语义模糊时易遗漏关键片段
- 适用场景:FAQ、知识库问答
进阶 RAG(Advanced RAG)
- 查询重写:将"怎么付款"重写为"支付方式有哪些"
- Hybrid Search:结合向量检索与 BM25 关键词检索,解决专有名词匹配问题
- 重排序模型:对初始检索结果做精确排序,剔除噪声
python
# 示例:Hybrid Search 实现(结合向量与关键词)
from langchain.retrievers import BM25Retriever, EnsembleRetriever
bm25_retriever = BM25Retriever.from_texts(chunks)
vector_retriever = vectorstore.as_retriever()
ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, vector_retriever], weights=[0.3, 0.7])
results = ensemble_retriever.get_relevant_documents(query)
模块化 RAG(Modular RAG)
- 可组合管道:记忆模块、多轮对话模块、甚至与其他大模型协同
- 典型应用:自动化客服,支持上下文记忆和意图路由
总结
- 核心机制:RAG 通过索引构建、查询检索、答案生成三步,让大模型学会"实时翻书"而非"死记硬背"
- 工程师视角:你不需要讨好搜索引擎算法,但需要为 RAG 优化网站结构(清晰标题、语义化段落、结构化数据)
- 未来方向:Agentic RAG(自主决策检索)和 多模态 RAG(检索图片/表格/视频)将进一步提升能力
一句话:未来的 AI 不再"搜索"你的网站,而是"理解"你的网站。