gpt‐知识库 - tencentmusic/cube-studio GitHub Wiki

背景

大型语言模型 (LLM) 的核心用例之一就是针对用户自己的数据进行问答。主要是为了解决文档全文超出token限制的问题。

知识库系统做的事情其实是,用一种算法来搜索文档并挑选出相关的摘录,然后只将这些相关的资料与用户问题一起传递给LLM模型。

借用一张开源项目langchain_chatGLM的图来描述。

image 31

向量知识库实现的过程:

解析用户上传的文档的向量,使用向量存储来存储非结构化文档(知识语料库)

用户给定一个查询,使用检索模型从语料库中检索相关文档,并使用合成模型生成响应。

检索模型通过嵌入查询的相似度来获取 前 k 个文档。

我们团队最近的一个目标也是打造一个一键上传知识库的问答助手。能够帮助用户满足诸如内部平台问题文档问答,客服小助手的需求。

从这个需求出发,我们对这个系统的设计提出了下面的要求:

多格式:支持各种数据格式文档的接入,所见即可接入(iwiki/tme乐享/doc/csv/md/pdf/neo4j/pandas)

多模型:支持本地和非本地多种大模型引擎(tme文曲大模型/chatgpt...)

精准匹配:效果持续优化

好用:应用、权限、数据集、对话管理。快速配置,自由编排prompt,命中测试,对话测试。支持前端sdk接入,api接入应用。

针对上面的要求和问题,本文将介绍我们的实现方案,以及在效果提升方面的一些初步工作,并在最后展示初版系统的一些效果。

Llama_index

文档检索增强生成(Retrieval-Augmented Generation)领域,目前最主流的框架是 llama_index 和 LangChain,目前llama_index 在该领域更深入一些,所以我们选择了使用 llama_index 来构建我们的系统。

项目地址: https://gpt-index.readthedocs.io/en/latest/guides/primer/index_guide.html

llama_index 对文档检索过程的抽象:

在这个过程中,llama_index 主要提供了下面几个控制器来管理流程:

索引(Indexs):llama_index 通过索引(index)来控制如何组织和存储数据。这里的索引不一定是基于embedding实现,llama_index 支持了更多模型,下文详细介绍。

检索器(Retrievers):检索器根据给定的查询从索引中获取一组节点。它就像一个搜索工具,从大型数据集中找到相关信息。一般是跟Index的类型绑定的。

查询引擎(Query Engines):llama_index 中的查询引擎处理用户输入的查询,与底层数据结构(如索引)进行交互,并返回综合响应。

其中索引是llama_index 的核心,llama_index 提供了一些通用的索引,用户可以简单复用、组合,应对不同格式、不同数据形式。

提供的几种通用的索引方式:

VectorIndex :将文档拿去调用embedding API转为向量。然后输入query,将query转为向量进行向量搜索后,得到相关资料文档,用于给GPT回答问题。 TableIndex :提取子index的关键词。然后输入query,提取query的关键词,找出关键词匹配的子index。 TreeIndex :构建时,让llm或者自定义模型摘要,让GPT决定哪n个子index最能回答问题。

TreeIndex 类定义:

image 4

所有索引都可以通过 service_context 设置索引中用到的embedding、llm引擎。

通过其他参数控制索引的形态、构建过程等等。

每种索引又能支持不同的检索方式。索引之间又能互相引用、多路执行、自定义,就能衍生出很丰富的索引流程。最后可以经过响应合成器(response synthesier)合成问询,通过 QueryEngine 跟 LLM 交互。在这之上还能通过其他组件(例如节点后处理器和令牌优化器)扩充响应合成器。

image 3

llama_index 的一个价值所在就是支持很多数据形式的 index,通过这些index,用户可以快速对各种数据发起问询:

image 11

Pandas Index效果:

image 33