7.5 KiB
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 实例,增加了代码的通用性和灵活性。
输出示例: 假设有以下历史记录数据:
data = {"role": "user", "content": "你好"}
使用 History 类创建实例并转换为消息元组:
h = History.from_data(data)
print(h.to_msg_tuple())
可能的输出为:
('human', '你好')
转换为消息模板时,假设不需要原始内容处理:
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方法的返回值将会是:
("ai", "你好,我是AI助手。")
如果role属性为其他值,比如"user",并且content属性为"这是一个用户消息。",那么返回值将会是:
("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对象:
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对象将具有相同的属性值。