Day52——早课 RAG:让AI读你的文档

作者:

昨天我们搭建了自己的AI聊天机器人,它能流畅地对话、回答问题。但你可能很快发现一个问题:它对公司内部的事一无所知。

你问它”我们公司的请假流程是什么”,它会一本正经地编造一个看似合理但完全错误的答案。你问它”上次项目复盘会说了什么”,它只能给你一个通用的模板回答。

这不是AI不够聪明,而是它没有读过你的资料

今天,我们要学习一种叫做RAG的技术,它能让AI在回答问题之前,先去翻阅你的文档,找到相关的内容,然后基于这些真实信息来回答你。


AI的”知识盲区”

大语言模型(比如ChatGPT)的知识来自训练数据。这些数据就像一本巨大的百科全书,覆盖了互联网上的公开信息。但这本百科全书有两个致命缺陷:

第一,它有截止日期。 训练数据通常只到某个时间点,之后发生的事它完全不知道。

第二,它没有你的私有信息。 公司内部文档、个人笔记、私有数据库——这些内容从未出现在训练数据中,AI自然不可能知道。

这就是为什么你问AI”今天天气怎么样”,它可能会说”我无法获取实时天气信息”。你问它”帮我看看这份合同有什么问题”,它需要你先把合同内容粘贴给它。

本质上,AI的”大脑”里只有公开知识,没有你的专属知识。


什么是RAG?

RAG的全称是Retrieval-Augmented Generation,翻译过来就是”检索增强生成”。

这个名字听起来很学术,但概念非常简单:

让AI在回答问题之前,先搜索一下相关的资料,然后根据搜索到的内容来回答。

打个比方:你去图书馆问管理员一个问题。一个普通的管理员会凭自己的记忆回答你(可能记错),而一个RAG管理员会先去书架上找到相关的书,翻到对应的页面,然后告诉你”根据这本书第X页的内容,答案是……”

RAG就是这个”先找书、再回答”的过程。


RAG的三步工作流

RAG的工作流程可以分为三个步骤:

第一步:建立知识库

在AI能搜索你的文档之前,你需要先把文档”喂”给它。这个过程叫做建立知识库

具体来说,系统会做以下事情:

  1. 读取文档:把你的PDF、Word、网页、Markdown等文件读进来
  2. 切分文本:把长文档切成小段,每段通常几百个字
  3. 生成向量:把每段文字转换成一串数字(叫做”向量”或”embedding”),这些数字代表了这段文字的”含义”
  4. 存储索引:把这些向量存到一个专门的数据库里(叫做”向量数据库”)

为什么要把文字变成向量? 因为计算机不理解文字,但能计算数字之间的距离。两段意思相近的文字,它们的向量在数学空间里距离很近;意思不同的文字,向量距离很远。

第二步:检索相关片段

当用户提出问题时,系统会:

  1. 把用户的问题也转换成向量
  2. 在向量数据库中搜索,找到与问题向量”距离最近”的文档片段
  3. 返回最相关的几段内容(通常是3-5段)

这个搜索过程比传统的关键词搜索要智能得多。比如你问”员工请假需要提前几天申请”,即使文档里写的是”休假须在三个工作日前提交申请”,向量搜索也能找到这段话,因为它理解”请假”和”休假”是相似的概念。

第三步:生成回答

最后,系统会把搜索到的相关片段和用户的问题一起发送给大语言模型,让它基于这些真实信息来生成回答。

关键点:AI的回答是基于你的文档内容生成的,而不是凭空编造的。

如果文档中没有相关信息,一个设计良好的RAG系统会告诉你”在提供的文档中没有找到相关内容”,而不是胡编乱造。


RAG vs 直接对话:有什么区别?

很多人会问:我把文档内容直接粘贴到对话框里,让AI分析,不也是同样的效果吗?

确实,对于少量内容,直接粘贴是最简单的方式。但RAG有几个核心优势:

处理海量文档。 一个对话窗口的上下文长度是有限的(通常几万字),而你的知识库可能有几百份文档、几百万字。RAG可以先搜索,只把最相关的几段内容送给AI。

实时更新。 当文档更新时,只需要重新处理变化的部分,不需要重新训练模型。

节省成本。 每次调用AI API都是按token计费的。如果每次都把整个知识库送给AI,成本会非常高。RAG只送相关片段,大幅降低成本。

减少幻觉。 AI在回答时会明确引用文档内容,减少了”编造”的可能性。


实际应用场景

RAG已经在很多场景中得到了广泛应用:

企业知识库问答。 新员工入职,不用翻遍几十个文档,直接问AI”公司的报销流程是什么”,AI会从内部文档中找到准确答案。

客服机器人。 电商平台用RAG让客服机器人读取产品手册和常见问题,回答顾客的问题比人工客服更快更准确。

个人文档助手。 你可以让AI读取你的日记、笔记、学习资料,问它”我上个月学了哪些内容”或者”帮我总结一下这份报告的要点”。

法律和医疗。 律师可以用RAG让AI检索相关法律条文和判例,医生可以让AI查阅医学文献辅助诊断。


动手体验:用LangChain搭建简单RAG

理论讲了这么多,让我们来看看实际代码是什么样的。以下是一个最简单的RAG示例,使用Python和LangChain框架:

`python

# 安装依赖

# pip install langchain langchain-openai chromadb

from langchain_community.document_loaders import TextLoader

from langchain.text_splitter import CharacterTextSplitter

from langchain_community.vectorstores import Chroma

from langchain_openai import OpenAIEmbeddings, ChatOpenAI

from langchain.chains import RetrievalQA

# 第一步:加载文档

loader = TextLoader(“my_document.txt”, encoding=”utf-8″)

documents = loader.load()

# 第二步:切分文本

text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)

docs = text_splitter.split_documents(documents)

# 第三步:生成向量并存入数据库

embeddings = OpenAIEmbeddings()

vectorstore = Chroma.from_documents(docs, embeddings)

# 第四步:创建问答链

llm = ChatOpenAI(model=”gpt-4o-mini”)

qa_chain = RetrievalQA.from_chain_type(

llm=llm,

retriever=vectorstore.as_retriever(search_kwargs={“k”: 3}),

return_source_documents=True

)

# 第五步:提问

result = qa_chain.invoke({“query”: “这份文档的主要内容是什么?”})

print(result[“result”])

`

这段代码只有几十行,但它实现了一个完整的RAG系统。你只需要把自己的文档替换进去,就能让AI读懂你的资料。


RAG的局限性

虽然RAG很强大,但它不是万能的:

检索质量决定回答质量。 如果搜索环节没找到正确的文档片段,AI的回答就会偏离主题。”垃圾进,垃圾出”在RAG中同样适用。

文档格式的挑战。 表格、图片、扫描件等复杂格式的文档,处理起来比较困难。纯文本效果最好。

需要持续维护。 文档更新后需要重新处理,过时的信息可能导致错误答案。

不能替代深度理解。 RAG更擅长”查找信息”,不太擅长”深度推理”。如果你需要AI对整个知识体系进行综合分析,可能还需要其他方法。


今日行动项

今天你只需要做一件事:想一想,你有什么文档可以让AI来读?

可以是工作中的产品手册、会议记录,也可以是个人的学习笔记、读书摘要。找到一份你经常需要反复查阅的文档,这就是你练习RAG的最佳素材。

明天的晚课,我们会动手实战,用代码搭建一个真正能读懂你文档的AI助手。


地铁深读:向量搜索背后的数学

如果你对”把文字变成向量”这件事感到好奇,这里稍微展开讲讲。

词向量的基本原理

在向量空间中,每个词都被表示为一个高维向量(通常是几百到几千维)。这些向量不是随机生成的,而是通过大量文本训练出来的。

训练的目标是:意思相近的词,向量距离近;意思不同的词,向量距离远。

最经典的例子是:King – Man + Woman ≈ Queen。这说明”国王”减去”男人”加上”女人”,在向量空间中非常接近”女王”。这说明模型理解了”性别”和”王室身份”这两个语义维度。

相似度计算

当RAG系统搜索时,它计算的是问题向量和每个文档片段向量之间的余弦相似度(cosine similarity)。这个值在-1到1之间,越接近1表示越相似。

`python

import numpy as np

def cosine_similarity(a, b):

return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 假设这些是向量化后的结果

question_vec = [0.2, 0.8, 0.1, …] # “请假流程是什么”

doc1_vec = [0.3, 0.7, 0.2, …] # “休假须在三个工作日前提交”

doc2_vec = [0.9, 0.1, 0.8, …] # “公司年度财务报告”

# doc1与问题的相似度会远高于doc2

`

Embedding模型的选择

不同的Embedding模型会生成不同质量的向量。目前比较流行的有:

  • OpenAI的text-embedding-3-small/large
  • 开源的BGE、GTE系列
  • Cohere的embed-multilingual-v3(多语言支持好)

选择Embedding模型时需要考虑:维度大小(越大越精确但越慢)、多语言支持、以及成本。

进阶思考题

  1. 如果你的文档包含大量专业术语,通用Embedding模型可能效果不好。想想为什么?(提示:训练数据中可能没有这些术语的”正确含义”。)
  1. RAG的chunk_size(切分大小)设为多少最合适?太小会丢失上下文,太大会包含无关信息。这是一个需要实验调优的参数。

推荐学习资源

  • LangChain官方文档:https://python.langchain.com/docs/tutorials/rag/
  • 向量数据库对比:Chroma vs Pinecone vs Weaviate vs Milvus
  • 论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》(RAG的原始论文,Facebook AI Research 2020年发表)

下篇预告

今晚5点:Day52晚课——RAG实战:用代码搭建文档问答系统

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注