一、背景

参考官方文档

知识库功能将 RAG 管线上的各环节可视化,提供了一套简单易用的用户界面来方便应用构建者管理个人或者团队的知识库,并能够快速集成至 AI 应用中。

开发者可以将企业内部文档、FAQ、规范信息等内容上传至知识库进行结构化处理,供后续 LLM 查询。

相比于 AI 大模型内置的静态预训练数据,知识库中的内容能够实时更新,确保 LLM 可以访问到最新的信息,避免因信息过时或遗漏而产生的问题。

LLM 接收到用户的问题后,将首先基于关键词在知识库内检索内容。知识库将根据关键词,召回相关度排名较高的内容区块,向 LLM 提供关键上下文以辅助其生成更加精准的回答。

开发者可以通过此方式确保 LLM 不仅仅依赖于训练数据中的知识,还能够处理来自实时文档和数据库的动态数据,从而提高回答的准确性和相关性。

核心优势:

• 实时性:知识库中的数据可随时更新,确保模型获得最新的上下文。

• 精准性:通过检索相关文档,LLM 能够基于实际内容生成高质量的回答,减少幻觉现象。

• 灵活性:开发者可自定义知识库内容,根据实际需求调整知识的覆盖范围。

本文参考官方示例,实现一个:
https://docs.dify.ai/zh-hans/workshop/intermediate/customer-service-bot

二、创建知识库

在这里插入图片描述

1、选择数据源

在这里插入图片描述
这里为了测试方便,我制作了一个excel表格,里面是某员工每个月的工资记录。

上传本地文件:测试工资单.xlsx

在这里插入图片描述

  • 同步 Notion 内容需要绑定 Notion 账号;
  • 同步 Web 站点需要使用 Jina 或者 Firecrawl 的 API

2、文本分段与清洗

  • 预览块,右边将展示表格里的内容
  • 索引方式,选择“经济”
  • 索引设置,保持默认

在这里插入图片描述

3、处理并完成

在这里插入图片描述

三、查看知识库

点击“前往文档”,查看其状态,显示:排队中。

你需要等文档的状态变成“可用”。
在这里插入图片描述
如果此时去进行召回测试,结果见下:
在这里插入图片描述
并没有能够搜索到什么。

设置索引方式为“高质量”,选择对应的embedding 模型。

什么是 embedding? ” Embedding “是一种将离散型变量(如单词、句子或者整个文档)转化为连续的向量表示的技术。 直白地说,在我们将自然语言处理为数据时会将文本转为向量,这个过程被称作 embedding。语义相似的文本的向量会位置相近,语义相反的文本的向量位置相反。LLM 使用这样的数据做训练,预测出后续的向量,从而生成文本。

在这里插入图片描述

在这里插入图片描述

四、使用知识库检索

在这里插入图片描述

1、条件分支

在这里插入图片描述
输入的内容,如果包含“知识库”三个字,将进入“知识检索”分支;反之,进入默认的LLM。

2、知识检索

新增节点:知识检索,选择前文上传的知识库–“测试工资单”

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

检索到的内容可能会比较多,需要进一步,通过大模型进行过滤,筛选出符合要求的信息。

3、知识检索LLM

在这里插入图片描述
先指定上下文,把上一个节点的输出作为上下文。

系统提示信息是:

根据{{#sys.query#}}的问题,检索{{#context#}},返回成绩

4、输出知识检索的回复

在这里插入图片描述

5、ELSE分支

在这里插入图片描述
普通的LLM+直接回复,兼容输入内容不包含“知识库”的场景。

五、总结

如果仅进行知识检索,后续没有加上LLM对返回内容进行加工,将展示多条数据。
在这里插入图片描述
因为它会对源文本进行语义上的分词处理,从召回段落也可以看出,三者的score得分不同,最高分是3月份,最低分是5月份,中间的是4月份。

一句话,三个月分的得分不同,向量检索,得分最高的表示最接近结果,但是不代表其符合用户的需求。

1、非知识库回复

在这里插入图片描述

2、知识库回复

  • 知识检索
    在这里插入图片描述
    输入信息:
{
  "result": [
    {
      "metadata": {
        "_source": "knowledge",
        "dataset_id": "7c9f831d-e3c8-4d9c-93d6-75c96770f76c",
        "dataset_name": "测试工资单.xlsx...",
        "document_id": "cf0e352b-964e-4f69-8280-d93af90d2005",
        "document_name": "测试工资单.xlsx",
        "document_data_source_type": "upload_file",
        "segment_id": "738fc1d5-ffdd-4dda-a6bb-b0fd7142d493",
        "retriever_from": "workflow",
        "score": 0.6628454057803826,
        "segment_hit_count": 1,
        "segment_word_count": 53,
        "segment_position": 3,
        "segment_index_node_hash": "714b1c956498b5b71d8059472b47fc249d23db857d7d27a6625c6d41bb5118e0",
        "doc_metadata": null,
        "position": 1
      },
      "title": "测试工资单.xlsx",
      "content": "月份\":\"3月\";\"应发工资(单位:元)\":\"14000.0\";\"实发工资(单位:元)\":\"4500.0\""
    },
    {
      "metadata": {
        "_source": "knowledge",
        "dataset_id": "7c9f831d-e3c8-4d9c-93d6-75c96770f76c",
        "dataset_name": "测试工资单.xlsx...",
        "document_id": "cf0e352b-964e-4f69-8280-d93af90d2005",
        "document_name": "测试工资单.xlsx",
        "document_data_source_type": "upload_file",
        "segment_id": "52907085-4416-44db-b434-9f8329d60f4f",
        "retriever_from": "workflow",
        "score": 0.43884340075579154,
        "segment_hit_count": 1,
        "segment_word_count": 53,
        "segment_position": 4,
        "segment_index_node_hash": "aaf4c8f45315529d91dc00531d062e203e5923380033f458951c831dd9811762",
        "doc_metadata": null,
        "position": 2
      },
      "title": "测试工资单.xlsx",
      "content": "月份\":\"4月\";\"应发工资(单位:元)\":\"13500.0\";\"实发工资(单位:元)\":\"4000.0\""
    },
    {
      "metadata": {
        "_source": "knowledge",
        "dataset_id": "7c9f831d-e3c8-4d9c-93d6-75c96770f76c",
        "dataset_name": "测试工资单.xlsx...",
        "document_id": "cf0e352b-964e-4f69-8280-d93af90d2005",
        "document_name": "测试工资单.xlsx",
        "document_data_source_type": "upload_file",
        "segment_id": "92a5691c-de99-42b0-aaed-0eaa8dc3f0ec",
        "retriever_from": "workflow",
        "score": 0.43219638345474776,
        "segment_hit_count": 1,
        "segment_word_count": 53,
        "segment_position": 5,
        "segment_index_node_hash": "5a768c240dc9fa40a09089354116ca86c2015aa35e046f40c306bff3479f5bf2",
        "doc_metadata": null,
        "position": 3
      },
      "title": "测试工资单.xlsx",
      "content": "月份\":\"5月\";\"应发工资(单位:元)\":\"13000.0\";\"实发工资(单位:元)\":\"3500.0\""
    }
  ]
}
  • 知识检索LLM
    其中,输入是上一个节点的结果,
    数据处理,下面的text是提示词。
{
  "model_mode": "chat",
  "prompts": [
    {
      "role": "system",
      "text": "根据从知识库查找,3月份的应发工资是多少的问题,检索{月份\":\"3月\";\"应发工资(单位:元)\":\"14000.0\";\"实发工资(单位:元)\":\"4500.0\"\n月份\":\"4月\";\"应发工资(单位:元)\":\"13500.0\";\"实发工资(单位:元)\":\"4000.0\"\n月份\":\"5月\";\"应发工资(单位:元)\":\"13000.0\";\"实发工资(单位:元)\":\"3500.0\"},返回成绩",
      "files": []
    }
  ],
  "model_provider": "langgenius/volcengine_maas/volcengine_maas",
  "model_name": "Doubao-pro-32k"
}

在这里插入图片描述

  • 最终输出

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐