本节将说明如何基于一个已创建的知识库做在线检索,并使用大模型进行整合生成回答。
说明
search_and_generate 用于对知识库进行检索,并将检索到的文本片和用户问题组装到 prompt 当中,调用大语言模型生成问题的回答。
说明
知识库文档导入/删除后,知识库更新时间最长滞后 5s,不能立即检索到,待知识库就绪后可正常检索。
参数 | 子参数 | 类型 | 是否必选 | 默认值 | 备注 |
---|---|---|---|---|---|
collection_name | -- | string | 否 | -- | 知识库名称
|
project | -- | string | 否 | default | 知识库所属项目 |
resource_id | -- | string | 否 | -- | 知识库唯一 id |
query | -- | string | 是 | -- | 检索文本,最大可输入长度为 8000:
|
query_param | map | 否 | -- | 检索请求参数配置 | |
doc_filter | map | 否 | -- | 检索过滤条件,支持对 doc 的 meta 信息过滤
| |
retrieve_param | map | 否 | -- | 检索召回参数配置 | |
rerank_switch | bool | 否 | False | 自动对结果做 rerank | |
retrieve_count | int | 否 | None | 进入重排的切片数量,默认为 25 | |
endpoint_id | string | 否 | -- | rerank 私有接入点 | |
rerank_model | string | 否 | "Doubao-pro-4k-rerank" | rerank 模型选择
| |
rerank_only_chunk | bool | 否 | False | 是否仅根据 chunk 内容计算重排分数
| |
limit | int | 否 | 10 | 最终返回的文本片数量,取值范围 [1, 200] | |
dense_weight | float | 否 | 0.5 | 混合检索中稠密向量的权重,1 表示纯稠密检索 ,0 表示纯字面检索。范围 [0.2, 1] | |
chunk_diffusion_count | int | 否 | 0 | 检索阶段返回命中文本片上下几片文本片
| |
llm_param | map | 否 | -- | 大语言模型参数配置 | |
model | string | 否 | "Doubao-pro-32k" | 生成使用的大语言模型
| |
max_new_tokens | int | 否 | 2000 | 最多生成多少个新 token | |
temperature | float | 否 | 0.7 | 生成温度 | |
top_p | float | 否 | 0.9 | 用于控制输出 tokens 的多样性,top_p 值越大输出的 tokens 类型越丰富,取值范围 [0, 1] | |
top_k | int | 否 | 0 | 选择预测值最大的 k 个 token 进行采样,取值范围 [0, 1000],0 表示不生效 | |
prompt | string | 否 | "使用以下的信息作为你学习到的知识,这些信息在XML tags 之内. {{ .retrieved_chunks }} 回答用户的问题,用户的问题在 XML tags 之内 {{ .user_query }} | {{ .retrieved_chunks }}和{{ .user_query }}是占位符,由后端传入检索到的文本片和用户的问题。 |
请先完成SDK初始化,再运行代码,详见初始化SDK
collection_name = "example" project = "" query = "DLSP: A Document Level Structure Parser for Multi-Page Digital Documents 这篇论文是关于什么的" doc_filter = { "op": "must", "field": "doc_id", "conds": ["tos_doc_id_123", "tos_doc_id_456"] } query_param = { "doc_filter": doc_filter } retrieve_param = { "rerank_switch": True, "retrieve_count": 30, "dense_weight": 0.7, "limit": 15, "chunk_diffusion_count": 1 } llm_prompt_extra_context = { "self_define_fields": ["自定义元数据1", "自定义元数据2"], "system_fields": ["doc_name", "title", "chunk_title", "content"] } llm_param = { "model": "Doubao-pro-32k", "max_new_tokens": 2500, "min_new_tokens": 5, "temperature": 0.8, "top_p": 0.95, "top_k": 10, "prompt": "使用以下的信息作为你学习到的知识,这些信息在 <context></context> XML tags 之内.\n\n<context>\n{{.retrieved_chunks}}\n</context>\n\n回答用户的问题,用户的问题在<query></query> XML tags 之内\n回答问题时,如果你不知道,请直接说明你不知道。\n\n<query>\n{{.user_query}}\n</query> " } refs = viking_knowledgebase_service.search_and_generate(collection_name=collection_name, query=query, query_param=query_param, retrieve_param=retrieve_param, llm_param=llm_param)
Python 调用执行上面的任务,返回字典,包含的属性如下表所示。
参数 | 类型 | 说明 |
---|---|---|
collection_name | string | 知识库名称 |
count | int | 检索返回的结果数量 |
generated_answer | string | 使用大模型生成的内容 |
prompt | string | 组装系统 prompt 和检索到的文本片后最终调用 LLM 时的完整 prompt |
usage | map | 使用大模型的用量信息
|
refs | list | 检索到的 points 列表 |
Point 实例包含的属性如下表所示。
属性 | 类型 | 说明 |
---|---|---|
collection_name | string | collection 名字 |
point_id | string | 知识点 id |
chunk_title | string | 知识点所在章节标题 |
original_question | string | 文档为 faq 类型的对应问题 |
process_time | string | 知识点完成处理的时间 |
content | string | 知识点内容 |
rerank_score | float | 重排得分 |
score | float | 检索得分 |
doc_info | Doc | 知识点所在文档信息 |
chunk_id | string | 知识点所在章节 id |
table_chunk_fields | list | 结构化行信息, 结构化类型生效 |