compressible_agent
可压缩代理
class CompressibleAgent(ConversableAgent)
可压缩代理。虽然这个代理保留了 AssistantAgent
的所有默认功能,但它还提供了通过 compress_config
设置激活时的压缩功能。
compress_config
默认设置为 False,使得这个代理与 AssistantAgent
等效。这个代理在 GroupChat 中表现不佳:压缩后的消息不会发送给群组中的所有代理。默认系统消息与 AssistantAgent 相同。human_input_mode
默认为 "NEVER",code_execution_config
默认为 False。这个代理默认不执行代码或函数调用。
__init__
def __init__(name: str,
system_message: Optional[str] = DEFAULT_SYSTEM_MESSAGE,
is_termination_msg: Optional[Callable[[Dict], bool]] = None,
max_consecutive_auto_reply: Optional[int] = None,
human_input_mode: Literal["ALWAYS", "NEVER",
"TERMINATE"] = "NEVER",
function_map: Optional[Dict[str, Callable]] = None,
code_execution_config: Optional[Union[Dict, bool]] = False,
llm_config: Optional[Union[Dict, bool]] = None,
default_auto_reply: Optional[Union[str, Dict, None]] = "",
compress_config: Optional[Dict] = False,
description: Optional[str] = None,
**kwargs)
参数:
name
str - 代理名称。system_message
str - 用于 ChatCompletion 推理的系统消息。 如果您想重新编程代理,请覆盖此属性。llm_config
dict - llm 推理配置。注意
- 您必须在 llm_config 中设置model
。它将用于计算令牌数。 有关可用选项,请参阅 OpenAIWrapper.create。is_termination_msg
function - 一个函数,接受一个以字典形式表示的消息,并返回一个布尔值,指示接收到的消息是否为终止消息。 字典可以包含以下键:"content"、"role"、"name"、"function_call"。max_consecutive_auto_reply
int - 连续自动回复的最大次数。 默认为 None(没有提供限制,此时将使用类属性 MAX_CONSECUTIVE_AUTO_REPLY 作为限制)。 该限制仅在human_input_mode
不是 "ALWAYS" 时起作用。compress_config
dict 或 True/False - 在 oai_reply 之前进行压缩的配置。默认为 False。 您应该包含以下键:- "mode"(可选,str,默认为 "TERMINATE"):可选值为 ["COMPRESS", "TERMINATE", "CUSTOMIZED"]。
TERMINATE
:仅当令牌数超过当前模型的最大限制时,才终止对话。在此模式下,不使用trigger_count
。
COMPRESS
: 当令牌数量超过限制时,压缩消息。CUSTOMIZED
: 传入一个自定义函数来压缩消息。
- "compress_function" (可选, callable, 默认为 None): 当模式为 "CUSTOMIZED" 时必须提供。 该函数应接受一个消息列表,并返回一个元组 (is_compress_success: bool, compressed_messages: List[Dict])。
- "trigger_count" (可选, float, int, 默认为 0.7): 触发压缩的阈值。 如果是介于 (0, 1] 之间的浮点数,则表示使用的令牌的百分比。如果是整数,则表示使用的令牌数量。
- "async" (可选, bool, 默认为 False): 是否异步压缩。
- "broadcast" (可选, bool, 默认为 True): 是否将压缩后的消息历史记录更新给发送者。
- "verbose" (可选, bool, 默认为 False): 是否打印压缩前后的内容。当模式为 "COMPRESS" 时使用。
- "leave_last_n" (可选, int, 默认为 0): 如果提供了该参数,则最后的 n 条消息将不会被压缩。当模式为 "COMPRESS" 时使用。
description
str - 代理的简短描述。其他代理(例如 GroupChatManager)将根据此描述决定何时调用该代理。(默认值:system_message)**kwargs
dict - 请参考 ConversableAgent 中的其他 kwargs。
generate_reply
def generate_reply(
messages: Optional[List[Dict]] = None,
sender: Optional[Agent] = None,
exclude: Optional[List[Callable]] = None) -> Union[str, Dict, None]
添加到第 202 行:
if messages is not None and messages != self._oai_messages[sender]:
messages = self._oai_messages[sender]
on_oai_token_limit
def on_oai_token_limit(
messages: Optional[List[Dict]] = None,
sender: Optional[Agent] = None,
config: Optional[Any] = None) -> Tuple[bool, Union[str, Dict, None]]
(实验性功能)当令牌达到阈值时,压缩之前的消息。
TODO: 异步压缩 TODO: 维护旧的 oai 消息列表(压缩之前的消息)
compress_messages
def compress_messages(
messages: Optional[List[Dict]] = None,
config: Optional[Any] = None
) -> Tuple[bool, Union[str, Dict, None, List]]
将一系列消息压缩成一条消息。
第一条消息(初始提示)不会被压缩。 其余的消息将被压缩成一条消息,模型将被要求区分每条消息的角色:USER、ASSISTANT、FUNCTION_CALL、FUNCTION_RETURN。 请查看 compress_sys_msg。
TODO: 压缩代理使用的模型与助手代理不同:例如,如果原始模型使用的是 gpt-4;我们从使用率的 70% 开始压缩,70% 的 8092 = 5664;而我们在这里使用的是 gpt 3.5,max_token = 4096,会引发错误。自动选择模型?