创建知识库并进行检索
操作场景
本文通过调用一系列知识中心的API,介绍从零开始创建知识库并进行检索的基本流程。API调用方法请参见如何调用API。
前提条件
准备一篇名为“问题.txt”的文档,文档内容为:
“什么是量子计算?它是一种利用量子力学原理进行信息处理的计算方式。====
什么是RAG?它是一种通过整合检索系统和生成模型的优势,来提升模型生成文本的质量和上下文相关性。====”
操作流程
步骤一:创建数据集
{ "name": "测试", "description": "测试", "data_type": "TEXT", "tags": [ "对话问答", "文案生成" ], "ingestion_config": { "data_source": "FILE_UPLOAD", "file_types": [ "txt" ] }, "schedule_config": { "schedule_type": "ONCE" }, "preprocess_config": { "cleaning_methods": [ "invisible" ], "pdf_preprocess_type": "NO_PREPROCESS" }, "chunk_config": { "slicing_configs": { "txt": { "slicing_method": "sentence", "sentence_slicing_config": { "slicing_strategy": "equivalent", "spec_symbols": [ "====" ], "contain_separator": false, "chunk_size": 26, "chunk_overlap": 0 } } } }, "extraction_config": { "extraction_example": "今天天气如何?答:还不错哦。", "extraction_mode": "RULE_EXTRACTION", "rule_extraction_configs": [ { "extraction_rule": "SEPARATOR", "field_name": "question", "separator_extraction": { "contain_separator": false, "extraction_code": 2, "separator": "?" } }, { "extraction_rule": "TEMPLATE", "field_name": "answer", "template_extraction": { "contain_end": true, "contain_start": false, "end_with": "。", "extraction_code": 1, "start_with": "它是" } } ] }, "index_config": { "description": "索引配置", "long_text_solution": "TRUNCATE_MODE", "name": "索引配置", "rag_type": "VECTOR_RAG", "retrieval_configs": [ { "category": "FULL_CHUNK", "name": "chunk", "retrieval_return": false, "text_filter": false, "vector_retrieval": false }, { "category": "CHUNK_FRAGMENT", "name": "question", "retrieval_return": true, "text_filter": true, "vector_retrieval": true }, { "category": "CHUNK_FRAGMENT", "name": "answer", "retrieval_return": true, "text_filter": true, "vector_retrieval": false } ], "vector_model_service_key": "GPT-4" } }
在创建知识数据集中,有几个参数需要注意:
- ingestion_config内的data_source:表明数据来源,FILE_UPLOAD为文件上传,您需上传文件;OBS_INGESTION表示OBS接入,您需添加OBS信息的配置。
- chunk_config:表示如何对文本进行切分。
- extraction_config:表明要对切片做提取操作,切片提取出的字段可以在索引配置中使用。
- index_config:索引配置,其中retrieval_configs配置完整切片内容,以及提取出的字段内容,在知识库检索时如何使用。
{ "data" : "3f28e62-xxxxxxxx-a15be0d638a2" }
步骤二:查询知识数据集创建结果
调用查询知识数据集最新执行记录接口查询创建结果,该接口所需的知识数据集id为步骤一:创建数据集返回的内容。
根据返回结果响应:
{ "data" : { "id" : "djh28e62-3a81-4018-a48f-a15be0d63812", "result" : "SUCCESS", "progress" : 100.0, "run_time" : 27684, "start_time" : "2024-11-22T03:15:49.000+00:00", "end_time" : "2024-11-22T03:16:17.000+00:00", "log_detail" : "开始任务......结束任务" } }
- 如果result字段值为SUCCESS,则表明数据集创建成功。
- 如果result字段值为RUNNING,则表明数据集正在创建,请稍候。
- 如果result字段值为FAILURE,则表明数据集创建失败,请检查文件是否符合要求。
步骤三:查询数据集版本和索引信息
知识数据集创建成功后,调用查询知识数据集详情接口,查询数据集版本和索引信息,响应示例如下:
{ "data" : { "data_set_versions" : [ { "id" : "askdjh28e62-xxxxxxxxx-a15be0d63812", "version" : "v2024-11-21T11:36:55Z", "created_date" : "2024-11-11 19:36:57", "last_updated_date" : "2024-11-21 19:36:57" } ], "index_configs" : [ { "id" : "d3f28e62-xxxxxxx-a15be0d638a2", "name" : "索引配置名称", "description" : "索引配置", "data_set_id" : "d3f28e62-3a81-4018-a48f-a15be0d638a2", "vector_model_service_key" : "service_key", "index_vector_config" : { "long_text_solution" : "TRUNCATE_MODE" } } ] } }
保存创建知识库对应的数据集版本id、版本号、索引配置id。数据集版本和索引可能有多个,可以任意组合。
步骤四:创建知识库
调用创建知识库接口创建知识库。根据保存的数据集id,数据集版本号,索引配置id,构建请求体,创建知识库即可。请求体如下:
{ "name": "知识库名称", "description": "知识库描述", "retrieval_status": "ENABLE", "rag_type": "VECTOR_RAG", "retrieval_config": { "retrieval_modes": [ "SEMANTIC_RETRIEVAL", "FULL_TEXT_RETRIEVAL" ], "retrieval_hybrid_mode": "RRF" }, "knowledge_data_sets": [ { "data_set_id": "djh28e62-xxxxxxxxx-a15be0d63812", "data_set_version": "v2024-11-21T11:36:55Z", "index_config_id": "d3f28e62-xxxxxxx-a15be0d638a2" } ] }
注意:retrieval_status字段设置知识库是否启用检索,如果启用,则检索前不需要再调用修改知识库召回状态接口启用知识库。
将创建接口响应内容保存起来,该内容为知识库id:
{ "data" : "3f28e62-xxxxxxxx-a15be0d638a2" }
步骤五:查询知识库创建结果
调用查询知识库最新执行记录接口查询创建结果。该接口所需的知识库id为步骤四:创建知识库返回的内容。
返回结果响应如下:
{ "data" : { "id" : "djh28e62-3a81-4018-a48f-a15be0d63812", "result" : "SUCCESS", "progress" : 100.0, "run_time" : 27684, "start_time" : "2024-11-22T03:15:49.000+00:00", "end_time" : "2024-11-22T03:16:17.000+00:00", "log_detail" : "开始任务......结束任务" } }
- 如果result字段值为SUCCESS,则表明知识库创建成功。
- 如果result字段值为RUNNING,则表明知识库正在创建,请稍候。
- 如果result字段值为FAILURE,则表明知识库创建失败,请检查文件是否符合要求。
步骤六:启用或停用知识库召回功能
调用修改知识库召回状态接口启用或停用知识库召回功能。
若创建知识库时已经启用知识库,则不需要执行此步骤。否则需启用知识库,请求体为:
ENABLE
若响应如下,则启用成功。
{ "data" : true }
步骤七:检索知识库数据
调用检索知识库数据接口检索知识库(知识库召回状态需为启用),请求体示例如下:
{ "keyword" : "什么是", "similarity_min" : "0.78", "limit" : 10, "filter" : { "group_type" : "AND", "expressions" : [ { "field" : "metadata.answer", "field_type" : "STRING", "operator" : "EQUAL", "values" : [ "一种利用量子力学原理进行信息处理的计算方式。" ] } ] }, "order_by" : { "order_items" : [ { "field" : "metadata.order", "field_type" : "INT", "order_type" : "DESC" } ] }, "data_sets" : [ { "data_set_id" : "a31ed909-xxxx-xxxx-xxxx-10958c90b3f7" } ] }
根据索引配置,返回结果为:
{ "data" : [ { "id" : "812857ef-xxxx-xxxx-xxxx-24ba9fd5e95c", "document" : "什么是量子计算?它是一种利用量子力学原理进行信息处理的计算方式。", "chunk" : "什么是量子计算?它是一种利用量子力学原理进行信息处理的计算方式。", "chunk_fragments" : { "question" : "什么是量子计算。", "answer" : "一种利用量子力学原理进行信息处理的计算方式" }, "similarity" : 0.87, "metadata" : { "order" : 10, "file_name" : "问题.txt", "path" : "问题.txt ", "question" : "什么是量子计算。", "answer" : "一种利用量子力学原理进行信息处理的计算方式。" }, "download_addresses" : { "xxx.png" : "https://xxxx" }, "download_address" : null, "data_set_id" : "3967c49d-xxxx-xxxx-xxxx-5eda056a1f1b" } ] }
响应参数解释:
- document:表示向量化检索内容,索引配置时选择某个字段为向量化字段,检索命中时返回该字段内容,即vector_retrieval为true。
- chunk:表示完整切片,索引配置时配置chunk作为附加字段返回时,该字段有内容,即索引配置中category为FULL_CHUNK,retrieval_return为true。
- chunk_fragments:表示切片提取字段,索引配置时配置所提取的字段作为附加字段返回时,该字段有内容,即索引配置中category为CHUNK_FRAGMENT,retrieval_return为true。
- metadata:默认包含order、file_name、path三个字段,若索引配置时配置所提取的字段作为文本过滤字段时,即索引配置中category为CHUNK_FRAGMENT,text_filter为true时,metadata下会新增该字段及其内容。