5.1 KiB
FunctionDef knowledge_base_chat(query, knowledge_base_name, top_k, score_threshold, history, stream, model_name, temperature, max_tokens, prompt_name, request)
knowledge_base_chat: 该函数用于处理用户与知识库的交互对话。
参数:
query: 用户的输入查询,类型为字符串。knowledge_base_name: 知识库的名称,类型为字符串。top_k: 匹配向量数,类型为整数。score_threshold: 知识库匹配相关度阈值,取值范围在0-1之间,类型为浮点数。history: 历史对话列表,每个元素为一个History对象。stream: 是否以流式输出,类型为布尔值。model_name: LLM模型名称,类型为字符串。temperature: LLM采样温度,类型为浮点数。max_tokens: 限制LLM生成Token数量,类型为整数或None。prompt_name: 使用的prompt模板名称,类型为字符串。request: 当前的请求对象,类型为Request。
代码描述:
函数首先通过KBServiceFactory.get_service_by_name方法获取指定名称的知识库服务实例。如果未找到对应的知识库,将返回404状态码的响应。然后,将传入的历史对话数据转换为History对象列表。接下来,定义了一个异步生成器knowledge_base_chat_iterator,用于处理知识库查询和LLM模型生成回答的逻辑。在这个生成器中,首先根据条件调整max_tokens的值,然后创建LLM模型实例,并执行文档搜索。如果启用了重排序(reranker),则对搜索结果进行重排序处理。根据搜索结果构建上下文,并生成LLM模型的输入提示。最后,使用LLM模型生成回答,并根据stream参数决定是以流式输出还是一次性输出所有结果。
注意:
- 在调用此函数时,需要确保传入的知识库名称在系统中已经存在,否则会返回404错误。
history参数允许传入空列表,表示没有历史对话。stream参数控制输出模式,当设置为True时,将以流式输出回答和文档信息;否则,将一次性返回所有内容。- 函数内部使用了多个异步操作,因此在调用时需要使用
await关键字。
输出示例:
调用knowledge_base_chat函数可能返回的JSON格式示例:
{
"answer": "这是根据您的查询生成的回答。",
"docs": [
"出处 [1] [文档名称](文档链接) \n\n文档内容\n\n",
"<span style='color:red'>未找到相关文档,该回答为大模型自身能力解答!</span>"
]
}
如果启用了流式输出,每个生成的回答片段和文档信息将作为独立的JSON对象逐个发送。
FunctionDef knowledge_base_chat_iterator(query, top_k, history, model_name, prompt_name)
knowledge_base_chat_iterator: 此函数的功能是异步迭代生成基于知识库的聊天回答。
参数:
query: 字符串类型,用户的查询内容。top_k: 整型,指定返回的最相关文档数量。history: 可选的历史记录列表,每个历史记录是一个History对象。model_name: 字符串类型,默认为model_name,指定使用的模型名称。prompt_name: 字符串类型,默认为prompt_name,指定使用的提示模板名称。
代码描述:
knowledge_base_chat_iterator函数是一个异步生成器,用于处理用户的查询请求,并基于知识库内容异步生成聊天回答。首先,函数检查max_tokens的有效性,并根据需要调整其值。接着,使用get_ChatOpenAI函数初始化一个聊天模型实例,该模型配置了模型名称、温度、最大token数和回调函数。
函数通过run_in_threadpool异步运行search_docs函数,根据用户的查询内容在知识库中搜索相关文档。如果启用了重排序功能(USE_RERANKER),则使用LangchainReranker类对搜索结果进行重排序,以提高结果的相关性。
根据搜索到的文档数量,函数选择相应的提示模板。如果没有找到相关文档,使用“empty”模板;否则,使用指定的prompt_name模板。然后,将历史记录和用户的查询请求转换为聊天提示模板。
使用LLMChain类创建一个聊天链,并通过wrap_done函数包装异步任务,以便在任务完成时进行回调处理。函数还生成了源文档的信息,包括文档的出处和内容。
最后,根据是否启用流式传输(stream),函数以不同方式异步生成聊天回答。如果启用流式传输,使用服务器发送事件(server-sent-events)逐个发送回答的token;否则,将所有token拼接后一次性返回。
注意:
- 在使用此函数时,需要确保提供的
model_name和prompt_name在系统中已配置且有效。 - 当启用重排序功能时,需要确保
LangchainReranker类的配置正确,包括模型路径和设备类型。 - 函数的异步特性要求调用者使用
async和await关键字进行调用,以确保异步操作的正确执行。 - 在处理大量查询请求时,合理配置
top_k和重排序参数可以有效提高处理效率和回答质量。