4.8 KiB
FunctionDef chat(query, conversation_id, history_len, history, stream, model_name, temperature, max_tokens, prompt_name)
chat: 此函数用于实现与LLM模型的对话功能。
参数:
query: 用户输入的查询字符串。conversation_id: 对话框ID,用于标识一个对话会话。history_len: 从数据库中取历史消息的数量。history: 历史对话记录,可以是一个整数或一个历史记录列表。stream: 是否以流式输出的方式返回对话结果。model_name: LLM模型名称。temperature: LLM采样温度,用于控制生成文本的随机性。max_tokens: 限制LLM生成Token的数量。prompt_name: 使用的prompt模板名称。
代码描述:
此函数主要负责处理用户与LLM模型之间的对话。它首先通过add_message_to_db函数将用户的查询和对话信息保存到数据库中。然后,根据传入的参数,如历史对话记录、模型名称、温度等,构建一个适合LLM模型的输入提示(prompt)。接着,使用LLMChain对象发起对话请求,并通过AsyncIteratorCallbackHandler处理模型的异步响应。如果启用了流式输出,函数将逐个Token地返回响应结果;否则,会等待所有响应完成后,一次性返回整个对话结果。最后,通过EventSourceResponse将结果以服务器发送事件(SSE)的形式返回给客户端。
注意:
- 在使用
history参数时,可以直接传入历史对话记录的列表,或者传入一个整数,函数会从数据库中读取指定数量的历史消息。 stream参数控制输出模式,当设置为True时,对话结果将以流式输出,适用于需要实时显示对话过程的场景。max_tokens参数用于限制LLM模型生成的Token数量,有助于控制生成文本的长度。
输出示例: 假设函数以非流式模式运行,并且返回了一条简单的对话响应:
{
"text": "好的,我明白了。",
"message_id": "123456"
}
这表示LLM模型对用户的查询给出了回复“好的,我明白了。”,并且该对话消息在数据库中的ID为"123456"。
FunctionDef chat_iterator
chat_iterator: 此函数的功能是异步迭代聊天过程,生成并流式传输聊天响应。
参数:
- 无参数直接传递给此函数,但函数内部使用了多个外部定义的变量和对象。
代码描述:
chat_iterator是一个异步生成器函数,用于处理聊天会话,生成聊天响应并以流的形式传输。函数首先定义了一个callback对象,该对象是AsyncIteratorCallbackHandler的实例,用于处理异步迭代的回调。接着,创建了一个回调列表callbacks,并将callback对象添加到其中。
函数通过调用add_message_to_db函数,将聊天请求添加到数据库中,并创建了一个conversation_callback对象,该对象是ConversationCallbackHandler的实例,用于处理聊天过程中的回调,并将其添加到回调列表中。
根据max_tokens的值调整生成文本的最大token数量,如果max_tokens为非正整数,则将其设置为None。
接下来,通过调用get_ChatOpenAI函数,初始化一个聊天模型model,并根据聊天历史(如果有)或会话ID(如果指定)来构建聊天提示chat_prompt。如果没有提供历史或会话ID,则使用默认的提示模板。
然后,创建了一个LLMChain对象chain,它负责将聊天提示传递给聊天模型,并开始一个异步任务,该任务使用wrap_done函数包装了chain.acall的调用,以便在任务完成时通过callback.done方法进行通知。
最后,根据stream变量的值决定是流式传输每个生成的token,还是等待所有token生成后一次性返回。在流式传输模式下,使用json.dumps将生成的token和消息ID封装成JSON格式并逐个yield返回;在非流式传输模式下,将所有生成的token拼接后一次性yield返回。
注意:
chat_iterator函数是异步的,因此在调用时需要使用await关键字或在其他异步函数中调用。- 函数内部使用了多个外部定义的变量和对象,如
history、max_tokens等,这要求在调用chat_iterator之前,这些变量和对象必须已经被正确初始化和配置。 - 函数依赖于多个外部定义的函数和类,如
AsyncIteratorCallbackHandler、add_message_to_db、ConversationCallbackHandler、get_ChatOpenAI等,确保这些依赖项在项目中已正确实现。 - 在处理聊天响应时,函数考虑了多种情况,包括有无聊天历史、是否从数据库获取历史消息等,这要求调用者根据实际情况提供正确的参数和配置。
- 使用此函数时,应注意异常处理和资源管理,确保在聊天会话结束时释放所有资源。