Langchain-Chatchat/markdown_docs/server/chat/chat.md

58 lines
4.8 KiB
Markdown
Raw Normal View History

2024-12-20 16:04:03 +08:00
## 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数量有助于控制生成文本的长度。
**输出示例**:
假设函数以非流式模式运行,并且返回了一条简单的对话响应:
```json
{
"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`等,确保这些依赖项在项目中已正确实现。
- 在处理聊天响应时,函数考虑了多种情况,包括有无聊天历史、是否从数据库获取历史消息等,这要求调用者根据实际情况提供正确的参数和配置。
- 使用此函数时,应注意异常处理和资源管理,确保在聊天会话结束时释放所有资源。
***