在前面的几篇文章中,我们探讨了如何截断历史会话中的对话记录——包括按条数截断、按Token长度截断、以及通过摘要进行截断。在摘要方案中,又细分出了三种路径:利用第三方摘要库、调用在线大模型、以及使用离线大模型。
这些操作统称为「上下文管理」,核心目标是让AI记住用户之前说了什么。接下来,我们进入一个新的话题:RAG(检索增强生成)——这也是AI应用开发中非常关键的一环。
什么是RAG
RAG的全称是Retrieval-Augmented Generation,翻译过来就是「检索增强生成」。你可以把它理解成一种组合策略:一边从外部知识库中检索信息,一边结合大模型生成回答。它的优势在于答案有据可查、可解释性强,而且易于定制。客服系统、智能助手这类问答任务经常会用到它。
大模型虽然聪明,但有两个明显的短板。第一个:知识存在时效性。它的训练数据截止到某个时间点,之后的新事件、用户的内部文档、公司专有资料,它一概不知。第二个:容易产生「幻觉」,也就是一本正经地编造虚假信息。因为大模型本质上是靠概率预测下一个字,在没有约束的情况下,它可能编造出人名、数据、政策,看起来像模像样,实际上全错。
RAG正好能解决这两个问题。它首先把你的文档资料读取、切碎、建立索引并保存,构建成专属的知识库。当你提问时,它从知识库里检索出最相关的几段原文,连同问题一起交给大模型,让大模型依据提供的资料来回答,而不是凭猜测胡编。
打个比方:大模型就像一个聪明但记性差、爱吹牛的人,而RAG就是那个在旁边翻课本、翻笔记的助手。
如何使用RAG
RAG的使用流程分为五个步骤,步步衔接:
1. 加载文档资料
读取TXT、PDF、Word、HTML等各种格式的资料文件。
2. 对文本分块
读取出的长文本需要切成小段,比如每段300字左右。太长会浪费Token,太短又缺乏上下文,这个平衡很关键。
3. 向量化文本
将每段文字转换为一串数字向量,计算机才能计算语义相似度。
4. 存入向量数据库
把数字化后的向量和原始文本一起存储起来,常用的库有Chroma、FAISS、Milvus等。
5. 检索并反馈给大模型
用户提问时,同样将问题转为向量,到数据库中找出最相似的几段原文,然后连同问题一起发给大模型。大模型基于给出的资料回答,就没有机会胡编了。
一个简单的仿RAG程序
完整的RAG会用到好几个Python库,但核心思想其实很简单。这里写一个纯Python的模拟程序,不依赖任何第三方库,只用基本的字符串查找来演示RAG的操作流程。看完你就明白,RAG本质上就是:把知识库里的内容匹配一下,再丢给大模型去回答。
# 本地知识库
knowledge_base = [
"人工智能(AI)是一门使机器模拟人类智能的技术。",
"RAG代表检索增强生成,它通过检索外部知识来提升大模型回答准确性。",
"本地RAG不需要调用云端API,所有计算在本机完成,不消耗Token。",
"FAISS是Facebook开源的向量检索库,适合做本地向量库。"
]
# 简单文本匹配检索(纯Python,无任何依赖)
def search(query):
results = []
for text in knowledge_base:
if any(word in text for word in query.replace("?", "").split()):
results.append(text)
return results if results else ["未找到相关知识"]
# RAG 主函数
def rag(query):
print("===== 本地 RAG 回答 =====")
print("问题:", query)
print("答案:")
for res in search(query):
print("-", res)
print("=" * 40)
# 运行
if __name__ == "__main__":
while True:
q = input("请输入问题(输入 q 退出):")
if q.lower() == "q":
print("退出程序")
break
rag(q)
上面这段代码的逻辑很直白:根据知识库是否包含问题中的词来匹配。运行之后,输入“人工智能”,输出会返回第一条知识。
请输入问题(输入 q 退出):人工智能
===== 本地 RAG 回答 =====
问题: 人工智能
答案:
- 人工智能(AI)是一门使机器模拟人类智能的技术。
你看,它只是按字符串匹配,找到哪条知识里有这个词,就返回哪条。这当然是最简化的版本,但RAG的骨架已经出来了——先搜再答。后面我们还会深入真正的向量检索、分块策略和端到端的实现。
关于这个系列的所有文章,都可以在《15天学会AI应用开发全目录》里找到,方便随时回顾。
