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

103 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## ClassDef History
**History**: History 类用于表示对话历史记录。
**属性**:
- `role`: 表示发言角色,类型为字符串。
- `content`: 表示发言内容,类型为字符串。
**代码描述**:
History 类继承自 BaseModel用于封装对话中的单条历史记录包括发言角色和发言内容。它提供了将历史记录转换为消息元组的方法 `to_msg_tuple`,以及将历史记录转换为消息模板的方法 `to_msg_template`。此外,还提供了一个类方法 `from_data`,用于从不同类型的数据结构(列表、元组、字典)创建 History 实例。
在项目中History 类被广泛用于处理和存储对话历史记录。例如,在 `agent_chat``chat` 等功能中,通过将用户输入和历史对话记录作为参数传递给模型,以生成相应的回复。这些历史记录通过 History 类的实例来管理和传递,确保了数据的一致性和易用性。
**注意**:
- 在使用 `to_msg_tuple` 方法时,如果 `role` 属性为 "assistant",则返回的元组中角色部分为 "ai",否则为 "human",这有助于在处理对话时区分用户和助手的发言。
- `to_msg_template` 方法支持根据是否需要原始内容(`is_raw` 参数)来调整内容的格式,这在需要对内容进行特定格式处理时非常有用。
- `from_data` 类方法提供了灵活的数据转换功能,允许从多种数据源创建 History 实例,增加了代码的通用性和灵活性。
**输出示例**:
假设有以下历史记录数据:
```python
data = {"role": "user", "content": "你好"}
```
使用 History 类创建实例并转换为消息元组:
```python
h = History.from_data(data)
print(h.to_msg_tuple())
```
可能的输出为:
```
('human', '你好')
```
转换为消息模板时,假设不需要原始内容处理:
```python
print(h.to_msg_template(is_raw=False))
```
输出将根据实际的模板格式化内容,其中角色和内容将被相应地替换和处理。
### FunctionDef to_msg_tuple(self)
**to_msg_tuple**: 此函数的功能是将消息对象转换为一个包含角色和内容的元组。
**参数**: 此函数没有显式参数但隐式使用了self参数代表调用此函数的History对象实例。
**代码描述**: `to_msg_tuple`函数是History类的一个方法用于将消息对象的角色和内容转换成一个元组。此函数首先检查消息对象的`role`属性。如果`role`属性值为"assistant",则元组的第一个元素为字符串"ai";否则,第一个元素为字符串"human"。元组的第二个元素是消息对象的`content`属性值,即消息的内容。这样,通过`to_msg_tuple`方法可以快速地获取消息的角色和内容信息,便于后续处理或显示。
**注意**: 使用此函数时需要确保调用它的History对象实例已经正确设置了`role`和`content`属性,否则可能会遇到属性不存在的错误。
**输出示例**: 假设一个History对象实例的`role`属性为"assistant"`content`属性为"你好我是AI助手。",那么调用`to_msg_tuple`方法的返回值将会是:
```python
("ai", "你好我是AI助手。")
```
如果`role`属性为其他值,比如"user",并且`content`属性为"这是一个用户消息。",那么返回值将会是:
```python
("human", "这是一个用户消息。")
```
这种方式使得消息的角色和内容可以被快速地识别和使用,对于消息处理和展示非常有用。
***
### FunctionDef to_msg_template(self, is_raw)
**to_msg_template**: 该函数的功能是将历史消息转换为特定的消息模板格式。
**参数**:
- `is_raw`: 布尔值指示是否将消息内容作为原始文本处理。默认为True。
**代码描述**:
`to_msg_template`函数是`History`类的一个方法,用于将历史消息转换为`ChatMessagePromptTemplate`格式,以便进一步处理和使用。该函数首先定义了一个角色映射字典`role_maps`,将"ai"映射为"assistant",将"human"映射为"user"。然后,根据`History`对象的`role`属性查找相应的角色,如果找不到,则使用`role`属性的原始值。
根据`is_raw`参数的值,函数决定是否将消息内容包裹在"{% raw %}"和"{% endraw %}"标签中。这主要用于处理消息内容中可能包含的Jinja2模板标签以避免在后续处理中被错误地解释或执行。如果`is_raw`为True则消息内容被包裹否则保持原样不变。
最后,函数使用`ChatMessagePromptTemplate.from_template`方法,将处理后的内容、"jinja2"字符串(表示使用的模板类型)和角色作为参数,创建并返回一个`ChatMessagePromptTemplate`对象。
在项目中,`to_msg_template`方法被多个异步迭代器函数调用,这些函数负责处理不同类型的聊天会话,如`chat_iterator`、`knowledge_base_chat_iterator`和`search_engine_chat_iterator`等。在这些函数中,`to_msg_template`方法用于将历史消息或用户输入转换为适合模型处理的格式,进而生成聊天提示或查询模板。
**注意**:
- 当使用`to_msg_template`方法时,需要注意`is_raw`参数的使用场景。如果消息内容中包含需要保留的模板标签,则应将`is_raw`设置为True。
- 该方法依赖于`ChatMessagePromptTemplate.from_template`方法,因此需要确保`ChatMessagePromptTemplate`类及其方法的正确实现。
**输出示例**:
假设有一个`History`对象,其`role`为"human"`content`为"Hello, AI!",调用`to_msg_template(False)`可能会返回如下`ChatMessagePromptTemplate`对象:
```python
ChatMessagePromptTemplate(content="Hello, AI!", template_type="jinja2", role="user")
```
***
### FunctionDef from_data(cls, h)
**from_data**: 该函数用于根据提供的数据创建一个History对象。
**参数**:
- `h`: 可以是列表、元组或字典类型用于初始化History对象的数据。
**代码描述**:
`from_data`函数是一个类方法用于根据不同类型的输入数据创建一个History对象。该函数接受一个参数`h`,这个参数可以是列表、元组或字典类型。如果`h`是列表或元组并且长度至少为2那么会使用列表或元组的前两个元素作为History对象的`role`和`content`属性进行初始化。如果`h`是字典类型那么会将字典中的键值对作为参数通过解包的方式传递给History类的构造函数从而创建History对象。无论输入数据的类型如何该函数最终都会返回一个History对象。
在项目中,`from_data`函数被多个地方调用用于将用户的输入或历史对话数据转换为History对象以便后续处理。例如在`agent_chat`、`chat_iterator`、`file_chat`、`knowledge_base_chat`和`search_engine_chat`等函数中,都可以看到`from_data`函数的调用它们通过这个函数将传入的历史对话列表转换为History对象列表以便进行进一步的处理和分析。
**注意**:
- 当输入参数`h`为列表或元组时至少需要包含两个元素分别代表角色和内容否则无法正确创建History对象。
- 当输入参数`h`为字典时需要确保字典中包含的键与History类的构造函数参数相匹配以便正确初始化对象。
**输出示例**:
假设输入参数`h`为列表`["user", "今天天气怎么样?"]`则函数返回的History对象将具有属性`role="user"`和`content="今天天气怎么样?"`。如果输入参数`h`为字典`{"role": "assistant", "content": "今天是晴天。"}`则返回的History对象将具有相同的属性值。
***