-
Notifications
You must be signed in to change notification settings - Fork 637
gpt‐知识库
大型语言模型 (LLM) 的核心用例之一就是针对用户自己的数据进行问答。主要是为了解决文档全文超出token限制的问题。
知识库系统做的事情其实是,用一种算法来搜索文档并挑选出相关的摘录,然后只将这些相关的资料与用户问题一起传递给LLM模型。
借用一张开源项目langchain_chatGLM的图来描述。
向量知识库实现的过程:
解析用户上传的文档的向量,使用向量存储来存储非结构化文档(知识语料库)
用户给定一个查询,使用检索模型从语料库中检索相关文档,并使用合成模型生成响应。
检索模型通过嵌入查询的相似度来获取 前 k 个文档。
我们团队最近的一个目标也是打造一个一键上传知识库的问答助手。能够帮助用户满足诸如内部平台问题文档问答,客服小助手的需求。
从这个需求出发,我们对这个系统的设计提出了下面的要求:
多格式:支持各种数据格式文档的接入,所见即可接入(iwiki/tme乐享/doc/csv/md/pdf/neo4j/pandas)
多模型:支持本地和非本地多种大模型引擎(tme文曲大模型/chatgpt...)
精准匹配:效果持续优化
好用:应用、权限、数据集、对话管理。快速配置,自由编排prompt,命中测试,对话测试。支持前端sdk接入,api接入应用。
针对上面的要求和问题,本文将介绍我们的实现方案,以及在效果提升方面的一些初步工作,并在最后展示初版系统的一些效果。
文档检索增强生成(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 类定义:
所有索引都可以通过 service_context 设置索引中用到的embedding、llm引擎。
通过其他参数控制索引的形态、构建过程等等。
每种索引又能支持不同的检索方式。索引之间又能互相引用、多路执行、自定义,就能衍生出很丰富的索引流程。最后可以经过响应合成器(response synthesier)合成问询,通过 QueryEngine 跟 LLM 交互。在这之上还能通过其他组件(例如节点后处理器和令牌优化器)扩充响应合成器。
llama_index 的一个价值所在就是支持很多数据形式的 index,通过这些index,用户可以快速对各种数据发起问询:
Pandas Index效果: