dify中级入门示例--使用知识库搭建智能客服机器人

一、背景

参考官方文档

知识库功能将 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

先指定上下文,把上一个节点的输出作为上下文。

系统提示信息是:

bash 复制代码
根据{{#sys.query#}}的问题,检索{{#context#}},返回成绩

4、输出知识检索的回复

5、ELSE分支

普通的LLM+直接回复,兼容输入内容不包含"知识库"的场景。

五、总结

如果仅进行知识检索,后续没有加上LLM对返回内容进行加工,将展示多条数据。

因为它会对源文本进行语义上的分词处理,从召回段落也可以看出,三者的score得分不同,最高分是3月份,最低分是5月份,中间的是4月份。

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

1、非知识库回复

2、知识库回复

  • 知识检索

    输入信息:
json 复制代码
{
  "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是提示词。
bash 复制代码
{
  "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"
}
  • 最终输出
相关推荐
2601_9638699514 小时前
【计算机毕业设计】基于 Spring Boot+Vue的手工体验馆管理系统的设计与实现
java·spring boot·后端
方渐鸿15 小时前
【2026】Pi Agent一键安装使用
ai
江畔柳前堤20 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
陈随易1 天前
moon,apt和yum之外linux系统命令安装新选择
前端·后端·程序员
码事漫谈1 天前
当单库日增 4.5TB,异构实时同步还能稳得住吗?
后端
1名持续学习的码农1 天前
GPT Plus、GPT Pro用户第一次用Codex,项目权限和Git分支怎么设置?
人工智能·git·gpt·elasticsearch·ai编程·codex
yuanyxh1 天前
AI Agent 的使用进化史
agent·ai编程·claude
thesky1234561 天前
27届大模型岗面试准备(十三):长上下文与上下文工程——从位置外推到分块策略的完整考点
人工智能·ai·大模型
kyriewen1 天前
Claude自己跑出去hack了3家公司——我为什么还在用它写代码
前端·ai编程·claude
IT_陈寒1 天前
SpringBoot自动配置的坑,这次真踩疼我了
前端·人工智能·后端