知识库管理

在进行RAG应用流开发时,您需要为相关节点配置知识库。因此,在此之前,您必须先创建知识库。知识库用于高效地组织和检索大量知识库中的相关信息,以辅助生成更准确和相关的回答。知识库创建完成后,您可以在不同的应用流中重复使用,从而简化集成流程,提高开发效率。

功能简介

通过知识库,大语言模型可以获得更多领域相关的知识,从而提高回答的准确性和相关性。当新的知识库创建完成并更新索引后,系统会自动提交一个PAI工作流任务,工作流节点会通过DLC任务来执行,用于对OSS数据源中的文件进行预处理、分块和Embedding转换。处理完成后,数据将入库到向量数据库,并在PAI中注册为知识库索引,以便在应用流开发中实现高效的信息检索。

此外,知识库还支持手动更新和定时调度更新知识库,从而确保知识库的实时性和准确性。

前提条件

已创建所需的Embedding模型连接和向量数据库连接(如有需要)。具体操作,请参见连接配置

创建知识库

  1. 进入LangStudio,选择工作空间后,在知识库页签下创建知识库。

    image

    参数

    描述

    基础配置

    知识库名称

    自定义知识库名称。

    数据源OSS路径

    知识库数据所在的OSS目录,知识库文件格式仅支持.html.htm.pdf.csv.xlsx.xls.txt.docx

    输出OSS路径

    保存文档解析生成的中间结果和索引信息,最终输出内容与所选向量数据库类型相关。

    重要

    当使用FAISS作为向量数据库时,应用流会将生成的索引文件保存到OSS。若使用PAI默认角色(应用流开发-启动运行时时设置的实例RAM角色),应用流可以默认访问用户工作空间的默认存储Bucket,因此建议将此参数配置为当前工作空间默认存储路径所在的OSS Bucket下的任一目录。如果使用自定义角色,您需要为自定义角色授予OSS的访问权限(建议授予AliyunOSSFullAccess权限),详情请参见RAM角色授权

    文档解析分块配置

    文本分块大小

    将知识库文件基于固定大小进行切分,每个子块的最大长度默认为1024(字符)。

    文本分块重叠大小

    为确保检索信息连贯性,相邻两个分块间存在的重叠大小,默认为200(字符)。通常建议重叠大小为分块大小的10%~20%。关于分块大小和重叠大小具体设置详情,请参见附录:基于分块大小(chunk_size)和分块重叠大小(chunk_overlap)调优

    Embedding模型和数据库

    Embedding类型

    支持配置以下两种连接类型:

    • 通用Embedding模型:兼容OpenAI Embedding APIEmbedding模型服务,来源可以是PAI-EAS或第三方模型服务,详情请参见连接配置-通用Embedding模型服务连接

    • 百炼DashScope连接:基于阿里云百炼模型服务的Embedding模型连接。

    Embedding连接

    选择已创建的Embedding模型服务连接。

    Embedding模型

    配置Embedding模型名称:

    • 当通过Model Gallery进行模型部署时,可通过模型详情页(在Model Gallery页单击模型卡片)查看模型名称的获取方法,详情请参见创建连接-模型服务

    • 当使用阿里云百炼DashScopeEmbedding模型时,选择可调用的Embedding模型。

    向量数据库类型

    支持使用以下两种向量数据库类型:

    • 向量数据库Milvus:Milvus通常用于生产环境,支持处理大规模的向量数据。选择该类型时,需配置已创建的Milvus数据库连接和Collection。

    • FAISS:Faiss通常用于测试环境,无需额外创建数据库即可使用。选择该类型时,知识库文件及最终结果将存放于输出OSS路径中。

    运行时:选择一个运行时,用于访问向量数据库和Embedding服务,以实现知识库的文档分块预览和召回测试等功能。请确保运行时的VPC网络与向量数据库和Embedding服务的VPC网络一致或者可连通。

    重要

    如果您的运行时创建时间较早,请确认其镜像版本不低于2.1.4,或者重新创建运行时,以避免无法选择的问题。

  2. 单击已创建的知识库名称。

    image

  3. 单击右上角更新索引,配置计算资源,用于对知识库文件进行预处理、分块和Embedding转换。

    image

    参数

    描述

    计算资源

    执行工作流节点任务所需的计算资源,支持使用灵骏智算资源和通用计算资源。

    专有网络配置

    请确保选择的VPC网络与知识库的Embedding服务和向量数据库服务的VPC网络连通,建议使用相同的VPC以简化配置。

管理知识库

知识库创建完成后,您还可以对知识库进行更新、查看文档分块、召回测试等操作,以便于更好的满足您的实际需求。

功能

操作入口

备注

更新知识库

image

上传完知识库文件后,还需单击右上角更新索引,从而完成对新增文件的预处理、分块和Embedding转换。

查看文档分块(chunk)

更新索引之后,单击指定知识库文档,查看文档分块。

image

只有当向量数据库类型为Milvus,才支持启用/关闭文档分块。

召回测试

更新索引之后,可进行召回测试。您可通过配置检索设置测试召回效果是否满足实际需求。

image

Top KScore阈值含义:

  • Top K:取值范围为1~100,用于控制在召回阶段从知识库中检索的文本片段的数量。

  • Score阈值:取值范围为0~1,用于设置文本片段筛选的相似度阈值,只召回超过设置分数的文本片段。数值越高说明对于文本与检索内容要求的相似度越高。

元数据检索

  1. 配置元数据变量,如变量名称为author

    image

  2. 为知识库文档打标。添加元数据变量和值,如author=pfchen

    image

    image

  3. 添加元数据过滤条件,进行召回测试:

    image

    注:图中召回的文档均为步骤2中打标的文档。

  • 该功能要求运行时镜像版本不小于2.1.8,且向量数据库类型为Milvus。

  • 在后续应用流开发中,如果有使用到该知识库,需要配置元数据过滤条件:

    image

配置定时调度

  • 配置定时调度

    单击右上角配置定时调度,选择运行的资源配置、专有网络配置、定时调度配置后提交表单。

    image

    • 查看调度配置/周期任务

      提交表单后,系统会自动在DataWorks数据开发中心创建知识库定时调度的Workflow,并发布到DataWorks数据运维中心的周期任务(目前周期任务是T+1生效),DataWorks周期任务会按您配置的定时调度时间执行更新知识库的操作。您可以在知识库详情的调度配置页面,查看调度配置和周期任务。

      image

  • 定时调度功能依赖于DataWorks,请确保您已开通该服务。若未开通,请前往开通DataWorks服务

  • 定时调度配置参数说明:

    • 调度周期:用于定义节点在生产环境中的运行频率(生成周期实例个数及实例运行的时间)。

    • 调度时间:用于定义节点具体运行的时间。

    • 超时定义:用于定义节点运行超过多长时间会失败退出。

    • 生效日期:用于定义节点正常自动调度运行的时间范围,该时间范围外,节点将不再自动调度。

    • 调度资源组:用于DataWorks定时调度功能。如果尚未创建DataWorks资源组,可单击下拉框中的立即新建跳转至创建页面。创建完成后,需将资源组绑定到当前工作空间。

      image

    更多调度参数说明,请参见时间属性配置说明

查看工作流任务

更新索引之后,单击右上角操作记录,单击指定任务操作列的查看任务查看相关工作流:

image

image

更新索引后,系统会自动提交一个PAI工作流任务,工作流任务包括以下三个节点,除read-oss-file节点外,每个节点会创建一个DLC Job来执行任务,单击节点,您可以查看具体任务运行详情,包括运行信息、任务日志和输出结果。您还可以通过日志中的Job URL来查看DLC任务详情。

  • rag-parse-chunk:对知识库文档进行预处理和分块,将分块后的文档数据传递至下一个节点。

  • rag-sync-index:对预处理后的文档数据进行Embedding处理,生成配置文件并注册至向量数据库。

查看数据集

更新索引之后,系统会自动将输出OSS路径注册为数据集。您可以在AI资产管理-数据集中查看资产详情。

image

更新索引后,系统会自动提交一个PAI工作流任务,待工作流任务执行成功后,会自动生成一个同名的数据集。

使用知识库

知识库创建成功后,您可以在应用流开发(如RAG应用流的开发与部署-开发应用流)过程中使用,进行信息检索。

image

返回结果为List[Dict],其中DictKey包含contentscore,分别对应文档分片与输入查询的内容和相似度得分。返回结果包含得分最高的top_k条记录,示例如下:

[
  {
    "score": 0.8057173490524292,
    "content": "受疫情带来的不确定性影响,xx银行根据经济走势及中国或中国内地环境预判,主动\n加大了贷款和垫款、非信贷资产减值损失的计提力度,加大\n不良资产核销处置力度,提升拨备覆盖率,2020 年实现净利\n润289.28亿元,同比增长 2.6%,盈利能力逐步改善。\n(人民币百万元) 2020年 2019年 变动(%)\n经营成果与盈利\n营业收入 153,542 137,958 11.3\n减值损失前营业利润 107,327 95,816 12.0\n净利润 28,928 28,195 2.6\n成本收入比(1)(%) 29.11 29.61下降 0.50个\n百分点\n平均总资产收益率 (%) 0.69 0.77下降 0.08个\n百分点\n加权平均净资产收益率 (%) 9.58 11.30下降 1.72个\n百分点\n净息差(2)(%) 2.53 2.62下降 0.09个\n百分点\n注: (1) 成本收入比 =业务及管理费/营业收入。",
    "id": "49f04c4cb1d48cbad130647bd0d75f***1cf07c4aeb7a5d9a1f3bda950a6b86e",
    "metadata": {
      "page_label": "40",
      "file_name": "2021-02-04_中国xx保险集团股份有限公司_xx_中国xx_2020年__年度报告.pdf",
      "file_path": "oss://my-bucket-name/datasets/chatglm-fintech/2021-02-04__中国xx保险集团股份有限公司__601318__中国xx__2020年__年度报告.pdf",
      "file_type": "application/pdf",
      "file_size": 7982999,
      "creation_date": "2024-10-10",
      "last_modified_date": "2024-10-10"
    }
  },
  {
    "score": 0.7708036303520203,
    "content": "72亿元,同比增长 5.2%。\n2020年\n(人民币百万元)寿险及\n健康险业务财产保险\n业务 银行业务 信托业务 证券业务其他资产\n管理业务 科技业务其他业务\n及合并抵消 集团合并\n归属于母公司股东的净利润 95,018 16,083 16,766 2,476 2,959 5,737 7,936 (3,876) 143,099\n少数股东损益 1,054 76 12,162 3 143 974 1,567 281 16,260\n净利润 (A) 96,072 16,159 28,928 2,479 3,102 6,711 9,503 (3,595) 159,359\n剔除项目 :\n 短期投资波动(1)(B) 10,308 – – – – – – – 10,308\n 折现率变动影响 (C) (7,902) – – – – – – – (7,902)\n 管 理层认为不属于  \n日常营运收支而剔除的  \n一次性重大项目及其他 (D) – – – – – – 1,282 – 1,282\n营运利润 (E=A-B-C-D) 93,666 16,159 28,928 2,479 3,102 6,711 8,221 (3,595) 155,670\n归属于母公司股东的营运利润 92,672 16,",
    "id": "8066c16048bd722d030a85ee8b1***36d5f31624b28f1c0c15943855c5ae5c9f",
    "metadata": {
      "page_label": "19",
      "file_name": "2021-02-04_中国xx保险集团股份有限公司_xxx_中国xx__2020年__年度报告.pdf",
      "file_path": "oss://my-bucket-name/datasets/chatglm-fintech/2021-02-04__中国xx保险集团股份有限公司__601318__中国xx__2020年__年度报告.pdf",
      "file_type": "application/pdf",
      "file_size": 7982999,
      "creation_date": "2024-10-10",
      "last_modified_date": "2024-10-10"
    }
  }
]

附录:基于分块大小(chunk_size)和分块重叠大小(chunk_overlap)调优

设置原则

  1. 模型上下文限制:首先要确认所用的嵌入模型能处理的最大token数。如果模型对token数有限制,那么分块的大小就需要在这一范围内,避免过长文本导致截断或信息丢失。

  2. 信息完整性:对于各类型文本,需要能保留足够的上下文,又不会使每个块包含过多信息,从而影响相似度计算的精确性。如果文本内容是按段落组织的,可以选择让每个块包含完整的段落,而不是生硬地切割。

  3. 保持连续性:设置适当的重叠部分有助于在查询时保持上下文连续性,防止因为分块边界导致的关键信息丢失。通常建议重叠大小为分块总数的10%~20%。例如,分块大小为300tokens,则重叠部分可以设置在3060tokens之间。

  4. 避免重复干扰:虽然适当的重叠可以提高召回率,但重叠过多可能会引入重复信息,从而影响检索效率。因此需要在“信息完整性”和“冗余”之间找到平衡。

调试与实验

  • 迭代优化:例如您可以将初始分块大小设置为300,重叠大小设置为50。随后根据检索结果和问答效果不断调整这些参数。可以尝试不同的分块大小和重叠比例,以确定最适合文本特性的设置。

  • 自然语言边界:如果文本结构清晰(比如按照章节或段落划分),可以优先考虑基于自然语言的切分,这样在保持语义完整性的同时,也有利于后续问答匹配。

如何优化

问题情况

优化建议

检索结果不相关

增大chunk_size,减少chunk_overlap。

检索结果片段化(上下文不连贯)

增大chunk_overlap。

召回率低(找不到合适的匹配)

适当增加chunk_size。

计算开销过高(嵌入和存储占用太大)

降低chunk_size,减少chunk_overlap。

以下是基于以往经验推荐的各类文本对应的分块大小和重叠大小:

文本类型

推荐分块大小(chunk_size)

推荐重叠大小(chunk_overlap)

短文本(FAQ、摘要)

100~300

20~50

普通文本(新闻、博客)

300~600

50~100

技术文档(API、论文)

600~1024

100~200

长篇文档(法律、书籍)

1024~2048

200~400