7 月 29 日晚,Dify 主创团队如约与社区朋友们线上直面交流,由 Dify 的数据集产品&架构负责人姜勇(Jyong)给大家分享在企业知识库嵌入 AI ChatBot 应用中最核心的 Embedding 技术概念和 Dify 数据集的设计和规划。我们还整理了本次会议中用户关心的问题,供大家阅读参考。
📑 Embedding 技术的文本向量化
"Embedding"是一种将离散型变量(如单词、句子或者整个文档)转化为连续的向量表示的技术。 这个向量表示(Embedding)可以捕捉到离散型变量间的相似性和关系。这段话听起来很晦涩,但其实它的本质是特征性的收集,将事物所有的特征进行向量化,我们可以叫它叫特征工程。
目前市面上的 LLM 模型的 token 有长度限制,尽管现在 Claude2 支持 100K 的 token,可以直接分析大约 75000 字的文本,但是其分析时间长并且 token 昂贵的计费,目前用户还不能接受。在性能和成本的要求之下, Embedding 技术应运而生。我们将文本进行分段之后转化为向量,当用户提出相关问题时,搜索的内容会转换成向量,然后在向量数据库中搜索最相似的向量,匹配最相似的几个上下文,最后将上下文组成的 prompt 一起提供给模型。 这样不仅可以大大减少模型的计算量,提高响应速度,更重要的是降低成本,并丰富了模型的知识库。
📍 Dify 的数据集模式设计与规划
从数据集的整体模式出发,Dify 有如下的设计:
将文本进行自定义分段,用户自定义分隔符以及 token 大小,将文本分成多个串。Dify 目前用的是 ada002 模型,用户文档进行 embedding 后存入向量数据库。当用户在 App 端提问时会带着他的问题和上下文组成新的问题,然后匹配向量数据库里相似的段落,将这些内容组成 prompt 传到 LLM 并输出标准的回答。
Dify 数据集工作模式分为以下两种方式:
-
Dify 最近刚上线的 Q2Q 匹配模式,可大幅提高数据命中预期。 用户提出的问题会匹配到数据集里问题和段落,数据集基于用户的文档分成若干个分段,内容以 QA 形式储存在向量数据库。用户的问题会与在与向量库数据库里的问题进行相似度对比,完成后将匹配得到的答案直接返回给用户。问题和问题的匹配不管从语义还是从整体文本上都十分准确,这样可以很大程度提升文本的搜索精确度。这个功能的使用场景更适用于一些常用高频问题的回答,用户提出的问题需要在问答库里才能匹配到,问题和答案的具体内容可以进行动态调整。
-
将文档段落直接存入 Dify 的线上数据库。用户提出的问题直接在文档中命中了一些段落并返回至模型生成回答。 由于用户短小的问题需要匹配一整段文档,召回率存在问题;文档窗口的切分可能会导致上下文语义的丢失。Dify 现在支持分段的编辑,用户不需要的文档内容可以做一些动态的调整。
关于 Dify 数据集功能的规划:
-
基于 app 对话的数据集收集: Dify 将整理高质量的回复,将文本作为做 QA(问答)的切分。这会在 app 端聊天时起到缓存的作用,优化性能和减少与 GPT 的交互所需的 token 成本。
-
多模型兼容: Dify 计划能够支持多种不同 LLM 的返回值。通过记录和缓存来自不同模型的回答,兼容多个返回值。如某一个问题 GPT4 的回答更好,就可以缓存到数据集里,用户在用 GPT3.5 提问相同问题的