首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【技术分享】如何通过知识图谱+大语言模型提高本地问答系统准确性

背景介绍

实际应用场景中,如果我们单纯的使用向量化,在向量数据库中把原来的文档做切片找到最接近的向量的快放到内容里面去然后让大模型整理输出内容,这样的方式能解决70%的应用场景,对于一些非常宏观的知识问答,有些知识点非常分散,分散在大量的文档里面,比如几百万几千万个文档都有重叠,如果我们向量搜索的top key 只有10个,但是返回的知识点可能远远超过10个,这样我们系统输出的答案就会不全造成部分缺失,作为信息的精炼格式,知识图谱可切割的数据颗粒度比我们人工的分割的更细、更小。将知识图谱的小颗粒数据与原先人工处理的大块数据相结合,我们可以更好地搜索需要全局 / 跨节点上下文的查询,我们通过知识图谱把大模型的推理能力和知识点分开,目前LangChain和Llama Index均支持将嵌入式向量和知识图谱结合来解决剩下30%的应用场景。

传统本地问答系统构建方案

单纯的利用大语言模型,让大语言具备特定属性的问答能力,目前我们主要有两种方式,微调 ——fine-tune 和上下文学习 —— in-context learning,这两种方式中,上下文学习是综合成本更低的方式。

微调 (Fine-tuning):在原有大型模型的基础上进行训练的方法。这种方式首先需要大规模的预训练,然后再对模型进行微调,以适应特定的任务或问题。预训练模型时,模型会在大量的文本数据上进行训练,学习如何理解和生成人类语言。这种训练通常在一个非常大的数据集上进行,模型会学习到语言的各种模式和规则。然后,在微调阶段,模型会在一个更小,更特定的数据集上进行训练。这个数据集通常是针对特定任务或问题的。通过这种方式,模型可以学习到如何更好地解答特定的问题或完成特定的任务。

例如我们可以把行业,或者企业的专有知识构建出专有的数据集,然后再用数据集对大语言模型进行微调训练

上下文学习 (In-context learning):在这种方式中,模型的训练和应用是同时进行的,模型会根据输入的上下文信息生成输出。这种方式不需要单独的预训练和微调阶段。模型在生成答案时会考虑所有的输入信息,包括问题和问题的上下文。例如,如果一个问题是“谁是美国的第一任总统?”并且上下文信息包括“乔治·华盛顿是美国的一位重要的历史人物”,那么模型可能就能够生成正确的答案“乔治·华盛顿”。通过这种方式,模型可以学习到如何根据上下文信息解答问题,而不仅仅是单独的问题。我们需要做的就是要把问题和答案预先搜索出来丢给大模型进行处理。

上下文学习 (In-context learning):这种方式的关键技术是嵌入(Embedding)

嵌入通常指的是将现实世界的事物映射到多维空间中的向量的方法。例如,我们可以将图像映射到一个(64 x 64)维度的空间中,如果映射足够好,两个图像之间的距离可以反映它们的相似性。

嵌入的另一个例子是 word2vec 算法,它将每个单词都映射到一个向量中。例如,如果嵌入足够好,我们可以对它们进行加法和减法操作,可能会得到以下结果:

vec(apple) + vec(pie) ≈ vec("apple apie"),或者向量测量值 vec(apple) + vec(pie) - vec("apple apie") 趋近于 0:

|vec(apple) + vec(pie) - vec("apple apie")| ≈ 0

类似地,"pear" 应该比 "dinosaur" 更接近 "apple":|vec(apple) - vec(pear)| < |vec(apple) - vec(dinosaur)|

我们可以搜索与给定问题更相关的书籍片段。基本过程如下:

1、将书籍分割为小片段,为每个片段创建嵌入并存储它们:这个步骤是信息预处理阶段,我们需要把大量的书籍文本信息转化为计算机可以理解和操作的形式。通常情况下,我们会将书籍文本分割为一小块一小块,比如章节、段落或者句子,这些就是“小片段”。然后,我们将对这些小片段进行嵌入编码,嵌入(Embedding)是一种将高维度的数据(例如文本)转化为低维度向量的方法,这种低维度向量能够表征原始数据的重要特征。最后,我们将这些嵌入向量存储起来。

2、当有一个问题时,计算问题的嵌入:当用户提出一个问题时,我们也会将这个问题进行嵌入编码,产生一个问题的嵌入向量。

3、通过计算距离找到与书籍片段最相似的前 K 个嵌入:在这一步,我们会计算问题的嵌入向量和存储的所有书籍片段的嵌入向量之间的距离,这个距离能够反映出问题和书籍片段的语义相似度。然后,我们选取与问题最相似的前K个书籍片段,这些片段可能包含着回答这个问题的信息。

4、使用问题和书籍片段构建提示:在选取了最相关的书籍片段后,我们会把问题和这些片段一起作为提示输入到大型语言模型(LLM)中。这种提示通常被设计成上下文形式,让模型能够理解问题并根据相关书籍片段生成答案。

5、使用提示查询 LLM:最后,我们将这些提示输入到LLM中,LLM将会根据这些提示生成一个答案,这个答案就是对用户问题的回应。

这个过程有效地结合了信息检索和深度学习两种方法,利用大型语言模型的强大生成能力,能够产生更好的回答。

这种方式存在的问题是对于一些非常宏观的知识问答,有些知识点非常分散,分散在大量的文档里面,例如,如果你想问的问题是关于全球气候变化的,相关的信息可能散布在数百万篇关于气候科学、地理学、政策、历史等各种主题的文章中。这种情况下,如果你的系统设计是只从最相关的前10个文档中获取信息,如果我们向量搜索的top key 只有10个,但是返回的知识点可能远远超过10个,这样我们系统输出的答案就会不全造成部分缺失甚至是错误

为了解决这个问题,传统的做法是创建组合索引和综合索引。这种方式的主要目的是扩大搜索范围,使系统能够从更多的文档中获取信息。

组合索引:在同一条记录中创建多个字段的索引,这样就可以根据多个字段同时进行搜索。这可以帮助我们更有效地找到与问题相关的文档。

综合索引:它将多个字段的值组合成一个索引,以便可以在一个操作中获取更多的相关信息。

此外,还可以使用其他几种索引方式,如向量存储(VectorStore)、摘要索引、树形索引等,这些都是用于改善信息检索效率和效果的工具。比如,摘要索引可能用于快速浏览文档的主要内容,而树形索引可以用于处理有层次或分类的数据。

使用知识图谱的方案

嵌入技术可以帮助我们理解和比较文档之间的相似性,而知识图谱则提供了一个将各种信息组织在一起的结构化方式。结合两者,我们可以对复杂的查询进行更好的处理。

知识图谱是一种以图形的方式表示信息的方法,其中每个节点代表一个实体,每条边代表两个实体之间的关系。在知识图谱中,信息是以"三元组"的形式存储的,比如"x -> y"表示"x"与"y"有某种关系。

例如:

我们正在处理一个与"x"相关的查询。我们首先通过嵌入技术找到了与"x"最相关的三个文档片段,它们在这里被称为节点1、节点2和节点96。然后,我们在知识图谱中对"x"进行了两次跳转查询,这就意味着我们查找了与"x"有直接关系,以及与"x"有间接关系的所有实体。这样,我们就得到了一些额外的上下文信息,这些信息都与"x"相关。

例如,我们找到了如下的三元组:

"x -> y",表示"x"与"y"有某种关系,这个信息来自于节点1。

"x -> a",表示"x"与"a"有某种关系,这个信息来自于节点2。

"x c",表示"b"与"c"有某种关系,并且"b"与"x"也有某种关系,这个信息来自于节点95。

这些三元组提供了关于"x"的额外上下文信息,可以帮助我们更好地回答关于"x"的查询。

这样我们把在知识图谱查到的上下问信息再拿到向量数据库做相似度匹配,我们就能够搜索到更多的有用信息,然后再把这些信息丢给大模型进行处理,我们就能够得到更准确的答案。

添加微信获得支持

微信  findingnoone

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Or5OAY5Z3JLSLnDHt9vnJWPA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券