如何基于llm构建知识库系统

如何基于llm构建知识库系统

How to build a knowledge base system based on LLM

·

1 min read


本文以OpenAI提供的API和模型为基础进行讲解,但适用于各类LLM模型。

基本思路

  1. 数据准备(准备知识库):

    1. 常见的做法有以下三种:

      • Lexical-based search 基于词汇的搜索,也就是你输入“张三”,你写个程序直接去一个一个找包含“张三”的文本内容,当然,实际的实现方式可以有很多。

      • Graph-based search 基于图形的搜索,适用于寻路、规划与最优化等连续决策问题。

      • Embedding-based search 基于嵌入的搜索,适用于分类、聚类、推荐等离散匹配与相似性搜索问题。

    2. 考虑到这里希望查找知识库的过程,是基于语义理解的匹配,因此推荐Embedding-based search。而使用这项技术,需要有个语言模型。(OpenAI提供了text-embedding-ada-002 模型以及对应的API接口,并且提供了示例代码,展示了一些关于长文本的处理建议)

  2. 构建应用程序,接收用户输入。

  3. 基于用户输入,查找知识库。

    1. 因为前面采用了Embedding-based search,所以,需要使用相同的嵌入语言模型来生成用户输入相关的嵌入值,并计算相似度(原理参考OpenAI的文档)。
  4. 将找到的结果,作为Prompt的一部分,拼接成问题,问题里大致还得包含以下相似的问法:我查询到的事实是:“{相似度最高的文本内容}”,请基于以上事实进行,回答以下问题“{用户的输入}”,如果无法回答,请回复“不知道”。。将这个问题Prompt作为对话的部分发给LLM,由它来重新组织内容后回答。

为什么不进行Fine-Tune

  1. 让LLM模型回答正确的问题,通常有两种形式:Fine-Tune和Model Inputs。

    1. Fine-Tune:把你的数据输入进去,并把原来模型的权重weights数据进行修改。

    2. Model Inputs:即你在和模型交互(交流)的过程中,告诉模型,请基于xxx文本来回答。

  2. 使用Fine-Tune有几个问题:

    1. 如果你Fine-Tune的知识和LLM原有的知识有冲突,你得到的回答可能不一定是正确的。

    2. LLM模型,不论是原始基础模型,还是Fine-Tune的模型,都存在一个截止时间的问题,也就是截止时间以前的“事实性知识”,模型可以回答,但是之后的知识就难以回答了。Fine-Tune通常是定期与批量的(鉴于目前的技术水平,它需要动用较大的算力),而且对于模型的评估也是个复杂的工程,任何参数的权重调整,可能在优化了一部分问题的同时影响了原本做的不错的任务。但因为通常Fine-Tune的数据量都远小于原始基础模型的数据训练量,因此对模型权重的修改,只是微调,而不是大动干戈,所以通常影响不大,但无法承诺。因此Fine-Tune无法及时更新最新的信息。这时候,我们可以基于传统的查询手段,RESTAPI、SearchEngineAPI等来获取最新的信息,比如天气查询接口等,况且向天气查询这种事实Fine-Tune进去是根本无法正常工作的。

    3. Fine-Tune实际上更适合教授专门的任务或风格,对事实回忆不太可靠。因为它可能产生幻觉还可能生成错误的结果。

    4. 一个例子:如果你想构建一个保险公司的自动问答机器人,并且向客户承诺服务条款,那么你机器人必须在已有的服务基础上,给顾客提出建议,而不是创造一个并不存在的服务。这个时候你就不应该去Fine-Tune模型,而是使用Search-Ask的模式来回答顾客的提问。它和传统FAQ带来的区别,更多的是当机器人回答用户的时候,它可以重新组织语言来回复,这样显得更加生动,但是所提供的服务仍然是标准服务之一。

  3. 使用Model Inputs:

    1. 它的原理就是在一次和LLM的对话上下文中,包含你提供的事实,并让LLM模型基于你的事实进行回答。

    2. 至于事实怎么提供,和LLM并没有关系,它是你传统软件工程的一部分。

    3. 通常大家会把知识库(比如你自己存了100G的文件)提前转化成可查询的库,比如向量数据库、搜索引擎等,当用户提出问题,问题首先不会交给LLM,而是交给你的查询库,查询库找到合适的结果后,你再通过程序把它和用户的问题一同交给LLM,让LLM基于你提供的事实进行查询。

    User: 地球是方的,月亮是五角星的,太阳是方形的。请基于以上内容告诉我:月亮是什么形状的?请直接回答结果,不需要推理。
    Assistant: 五角星的。

什么时候该使用知识库而不是LLM自己生成答案呢?

从上面的设计思路看,我们使用程序实现了交互流程,先查询知识库,再反馈事实给LLM,并由其来生成式输出。这其实导致了一个问题:就是我们默认用户输入的所有内容都是通过知识库进行查询的,也就是当用户提出一个问题后,我们就启动了知识库的查找。我们如何来设计我们的交互系统呢?

  1. 和传统的FAQ查找方式相似,提供一个FAQ的提问输入框。这时候使用LLM技术的优势在于,回答结果更个性化,比如你可以根据登录用户的不同采用不同的解释方式。

  2. 但如果你只是希望在最近流行的类似ChatGPT的对话模式下,不经意间,回复基于知识库的“专业内容”,该怎么做呢?

    1. 最简单也最可靠的,显示调用:设计一个关键词,并提示用户在需要切换到知识库的时候,使用该关键词。而你在程序中进行判断。

    2. 设计精巧的Prompt(当需要和对应的LLM进行仔细的测试),下面是一个可能的形式:

      1. 先将用户的输入传递给LLM,例如:“请告诉我明天的天气是什么。如果你并不知道答案,请不要编造答案,直接告诉我“查找知识库”,不需要其他解释,不需要任何建议。”。

      2. 用程序拦截关键词“查找知识库”,并启动知识库查找,并再次将这个查找结果返回给LLM,让它基于查询的结果组织语言并输出。

    3. 还可以尝试混合结果的模式,比如你查找知识库,并仅在有可靠数据的时候,提供给LLM,并由它结合其他知识进行回答,与你提供信息相冲突的部分,以你的信息为准,忽略其他信息。

参考资料

  1. 如何使用Embeddings技术查找自定义的知识库可以参考这篇官方文章,内含完整代码《 OpenAI cookbook:Question answering using embeddings-based search