chunks: 块
trunks : 树干
“RAG”通常指 检索增强生成(Retrieval-Augmented Generation)
主要框架:用户提query,找到和它相关的,先把问题转换为向量,和向量数据库的数据做比较,检索相似的向量,返回 对应向量的原始文本,构建prompt,给模型回答问题。
一 文档交互
1.1 生成和检索的区别
“RAG”通常指 检索增强生成(Retrieval-Augmented Generation)
二 金融智能客服系统
2.1 传统架构 (通过检索的方式)
1 提前设计FAQ库(业务人员整理)
<q, a> <q, a><q, a>
2 用户提问,和FAQ 问题做比较,看哪个问题相近,就使用这个答案
3 好处,结果可控。
2.2 传统问答方式2 (使用生成的方式)
1 提前设计FAQ库(业务人员整理)
<q, a> <q, a><q, a>
2 训练一个模型,问题做输入,答案做输出,训练模型
3 使用模型,将问题作为模型的输入,使用模型的输出作为结果。
4 结果不可控,准确率比较低。
传统方式通常使用方式一
2.3 检索 + 生成
大模型 问答系统 2.0
1 不用维护知识库,从文档抽出来关键问题
2 直接把原始的知识库就行,【doc, PDF, EXCEL, TXT 】都可以做知识库
3 用户提问,先做检索把相关文档提取出来,答案可能在文档里面
4 构建prompt,检索结果放在prompt 【上下文】, query【Input】 也放在prompt 里面,还要历史聊天记录 【上下文】,统一放入模型做输入得到一个response.
三 基于大模型技术的Agent 框架搭建
1 技术栈
项目架构梳理
1 用户提出 query(string)
2 构造知识库,企业知识【txt, pdf, html, doc, excel, ppt】 做转换
2.1 把文章做trunk【树干】,不能把整个文章放到prompt, 拆分章节,把适合的章节放进去就行。
文档 拆分-> Trunk ,放入【知识库】,需要做一定的数据清洗,特殊符号清洗啥的
2.2 把数据转换为向量,用于和query 比较。
3 用户提 query , 在知识库找出对应的Trunk,一起放入prompt中,【基于如下的上下文回复用户的上下文】,然后进模型,然后回复。
2 向量数据库的搭建
1 trunk 和query 比较,比较两个string 做比较,把string 转换为向量。
用户提query,找到和它相关的,先把问题转换为向量,和向量数据库的数据做比较,检索相似的向量,返回 对应向量的原始文本,构建prompt。
prompt {instructing, context,inputs} -> model = response
2 相似度怎么计算?
(vec1, vec2) -> 相似度
向量数据库,解决搜索效率的问题。
难点:
1 怎么比较query 和 trunk 的向量?
2 怎么做文档切割?
3 怎么转换为向量数据?
3 怎么解决 hallucination(乱说)
4 拆分文本
1 最好按段落进行区分
2 fixed + 语义做分割【递归方法,来自 langchain】
后面的方法需要跑机器学习模型,比较慢,常见使用第一和第二种,直接拆分句子和字符数。
4.1 split by sentence
每个块都是完整的一句话。
4.2 fixed length chunks
4.3 chunks with overlapping window
4.4 recursiveCharacterTextSplitter from langchain
fixed + 语义做分割
5 拆分中文
四 文本向量化
4.1 opai embedding (向量化模型)
4.2 相似度计算
4.3 向量数据库 qdrant