一、基于LLM+向量库的文档对话 基础面
- 为什么 大模型 需要 外挂(向量)知识库?
如何 将 外部知识 注入 大模型,最直接的方法:利用外部知识对大模型进行微调
- 思路:构建几十万量级的数据,然后利用这些数据 对大模型进行微调,以将 额外知识注入大模型
- 优点:简单粗暴
- 缺点:
i. 这 几十万量级的数据 并不能很好的将额外知识注入大模型;
ii. 训练成本昂贵。不仅需要 多卡并行,还需要 训练很多天;
既然 大模型微调 不是 将 外部知识 注入 大模型 的 最优方案,那是否有其它可行方案?
基于LLM+向量库的文档对话 思路是怎么样?
- 加载文件
- 读取文本
- 文本分割
- 文本向量化
- 问句向量化
- 在文本向量中匹配出与问句向量最相似的top k个
- 匹配出的文本作为上下文和问题一起添加到 prompt 中
- 提交给 LLM 生成回答
版本一
基于LLM+向量库的文档对话 核心技术是什么?
- 基于LLM+向量库的文档对话 核心技术:embedding
- 思路:将用户知识库内容经过 embedding 存入向量知识库,然后用户每一次提问也会经过 embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户 问题一起作为 promt 提交给 LLM 回答
基于LLM+向量库的文档对话 prompt 模板 如何构建?
已知信息:
{context}
根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分, 答案请使用中文。
问题是:{question}
二、基于LLM+向量库的文档对话 优化面
痛点1:文档切分粒度不好把控,既担心噪声太多又担心语义信息丢失 问题描述
问题1:如何让LLM简要、准确回答细粒度知识?
- 举例及标答如下:
用户:2023年我国上半年的国内生产总值是多少?
LLM:根据文档,2023年的国民生产总值是593034亿元。
- 需求分析:一是简要,不要有其他废话。二是准确,而不是随意编造。
问题2:如何让LLM回答出全面的粗粒度(跨段落)知识?
-举例及标答如下:
用户:根据文档内容,征信中心有几点声明?
LLM:根据文档内容,有三点声明,分别是:一、…;二…;三…。
- 需求分析:
要实现语义级别的分割,而不是简单基于html或者pdf的换行符分割。
笔者发现目前的痛点是文档分割不够准确,导致模型有可能只回答了两点,而实际上是因为向量相似度召回的结 果是残缺的。
有人可能会问,那完全可以把切割粒度大一点,比如每10个段落一分。但