前面的文章依次介绍了如何截断历史会话的对话记录,包括按照记录数量截断、按照Token长度截断,以及浓缩为摘要截断等等,其中摘要操作又分为三大类:
1、使用第三方的摘要库对文本摘要;
2、使用在线大模型对文本摘要;
3、使用离线大模型对文本摘要;
以上对会话记录的各种处理操作,统称为AI应用的上下文管理,即让AI理解用户之前的意图。接下来将开启有关RAG部分的AI应用开发教程介绍。
一、什么是RAG
RAG的全称是Retrieval-augmented Generation,意思是检索增强生成,它是一种结合检索和生成技术的模型。RAG通过引用外部知识库的信息来生成回答,具有较强的可解释性和定制能力,常用于客服系统、智能助手等问答任务。
虽然大模型很智能了,但它有两个短板:
1、知识有截止日期,不懂新知识
因为大模型训练到某一天就停止学习,比如模型训练数据截止到2025年,那么2026年之后发生的事情就不懂了。并且用户的个人文档、公司文档等内部资料,大模型也都不知道。
2、会幻觉、爱胡说八道
大模型是靠概率猜下一个字,不是真的 “懂知识”。没人约束它时,容易编事实、编人名、编数据、编政策,一本正经地胡说八道。
而RAG会分析并消化用户提供的文档资料,从中构建专属的知识库,再把这些资料喂给大模型,使得大模型能够照着资料回答问题。
简而言之,大模型是聪明但记性差、爱吹牛的人,而RAG是翻课本、翻知识库、查笔记的人。
二、如何使用RAG
RAG的使用流程包含下列五个步骤:
1、加载文档资料
读取 TXT、PDF、Word、HTML等格式的资料文件。
2、对文本分块
读出来的资料信息为长文本,需要切成一小段一小段,比如每段300字,防止太长浪费Token、太短又缺乏上下文。
3、向量化文本
接着把每段文字变成数字向量,计算机才能理解语义相似度。
4、存入向量数据库
把数字化后的向量和原始文本保存起来,比如保存到Chroma、FAISS、Milvus。
5、在用户提问时,检索向量数据库,并把结果反馈给大模型
用户输入的问题也要转成数字向量,并从向量数据库找出最相似的几段原文,再把问题与检索到的原文一起发给大模型,好让大模型基于给到的资料来回答,而非自己胡编乱造。
三、一个简单的仿RAG程序
完整的RAG会用到多个Python库,这里为了方便理解,先用一个简单的模拟程序来演示RAG的操作过程。
无需安装任何第三方库,仅仅根据基本的字符串查找来模拟RAG,下面是具体的Python测试代码:
# 本地知识库
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("\n===== 本地 RAG 回答 =====")
print("问题:", query)
print("\n答案:")
for res in search(query):
print("-", res)
print("="*40)
# 运行
if __name__ == "__main__":
while True:
q = input("\n请输入问题(输入 q 退出):")
if q.lower() == "q":
print("退出程序")
break
rag(q)阅读以上代码,发现它根据知识库是否包含指定字符串来回答问题。
运行上面的Python代码,根据提示输入问题“人工智能”,输出日志结果如下:
请输入问题(输入 q 退出):人工智能
===== 本地 RAG 回答 =====
问题: 人工智能
答案:
- 人工智能(AI)是一门使机器模拟人类智能的技术。可见该代码按照字符串匹配的方式,一旦在某条知识中找到指定字符串,就返回这条知识。
本系列的AI应用开发文章目录为《15天学会AI应用开发全目录(零基础小白,零Token消耗)》。