Skip to main content

retrieve_user_proxy_agent

RetrieveUserProxyAgent

class RetrieveUserProxyAgent(UserProxyAgent)

(预览)检索增强用户代理根据嵌入相似性检索文档块,并将它们与问题一起发送给检索增强助手。

__init__

def __init__(name="RetrieveChatAgent",
human_input_mode: Literal["ALWAYS", "NEVER",
"TERMINATE"] = "ALWAYS",
is_termination_msg: Optional[Callable[[Dict], bool]] = None,
retrieve_config: Optional[Dict] = None,
**kwargs)

参数

  • name str - 代理的名称。

  • human_input_mode str - 是否每次收到消息都要求人工输入。 可能的取值为 "ALWAYS"、"TERMINATE"、"NEVER"。

    1. 当为 "ALWAYS" 时,代理在收到消息时每次都会提示人工输入。 在此模式下,当人工输入为 "exit" 或 is_termination_msg 为 True 且没有人工输入时,对话停止。
    2. 当为 "TERMINATE" 时,只有在收到终止消息或自动回复次数达到 max_consecutive_auto_reply 时才提示人工输入。
    3. 当为 "NEVER" 时,代理将永远不会提示人工输入。在此模式下,当自动回复次数达到 max_consecutive_auto_reply 或 is_termination_msg 为 True 时,对话停止。
  • is_termination_msg function - 一个函数,接受一个以字典形式表示的消息,并返回一个布尔值,指示接收到的消息是否为终止消息。 字典可以包含以下键:"content"、"role"、"name"、"function_call"。

  • retrieve_config dict or None - 检索代理的配置。

    要使用默认配置,请设置为 None。否则,设置为一个具有以下键的字典:

    • task(可选,str)- 检索聊天的任务。可能的取值为 "code"、"qa" 和 "default"。不同任务的系统提示将不同。 默认值为 default,支持代码和问答,并在响应末尾提供源信息。
    • vector_db(可选,Union[str, VectorDB])- 检索聊天的向量数据库。 如果是字符串,则应为向量数据库的类型,例如 "chroma";否则,应为 VectorDB 协议的实例。默认值为 "chroma"。 设置为 None 以使用已弃用的 client
    • db_config(可选,Dict)- 向量数据库的配置。默认值为 {}。请确保您了解正在使用的向量数据库的配置,否则将其保留为 {}。 仅当 vector_db 是字符串时有效。
    • client(可选,chromadb.Client)- chromadb 客户端。如果未提供键,则将使用默认客户端 chromadb.Client()。如果要使用其他客户端,请提供键。 vector db,扩展这个类并重写retrieve_docs函数。
  • **已弃用** - 使用vector_db代替。

    • docs_path(可选,Union[str, List[str]]) - 文档目录的路径。它也可以是单个文件的路径,单个文件的URL或目录、文件和URL的列表。默认为None,仅在已创建集合的情况下有效。
    • extra_docs(可选,bool) - 当为True时,允许添加具有唯一ID的文档,而不会覆盖现有文档;当为False时,使用默认ID替换现有文档,有可能覆盖集合中的数据。当设置为True时,系统将为新文档块分配从"length+i"开始的唯一ID,防止替换现有文档,并便于向集合中添加更多内容。 默认情况下,"extra_docs"设置为false,从零开始的文档ID。这会带来风险,因为新文档可能会覆盖现有文档,可能导致集合中的数据意外丢失或更改。
  • **已弃用** - 使用vector_db代替client时,请使用new_docs

    • new_docs(可选,bool) - 当为True时,仅向集合添加新文档;当为False时,更新现有文档并添加新文档。默认为True。文档ID用于确定文档是新文档还是现有文档。默认情况下,ID是内容的哈希值。
    • model(可选,str) - 用于检索聊天的模型。如果未提供键,则将使用默认模型gpt-4
    • chunk_token_size(可选,int) - 用于检索聊天的块标记大小。如果未提供键,则将使用默认大小max_tokens * 0.4
    • context_max_tokens(可选,int) - 用于检索聊天的上下文最大标记大小。如果未提供键,则将使用默认大小max_tokens * 0.8
    • chunk_mode(可选,str) - 用于检索聊天的块模式。可能的值为"multi_lines"和"one_line"。如果未提供键,则将使用默认模式multi_lines
    • must_break_at_empty_line(可选,bool) - 如果为True,则块只会在空行处中断。默认为True。 如果chunk_mode为"one_line",则将忽略此参数。
    • embedding_model(可选,str) - 用于检索聊天的嵌入模型。如果未提供键,则将使用默认模型all-MiniLM-L6-v2。所有可用模型可以在https://www.sbert.net/docs/pretrained_models.html找到。 默认模型是一个快速模型。如果要使用高性能模型,建议使用all-mpnet-base-v2
  • **已弃用** - 使用vector_db代替client时不需要。

    • embedding_function(可选,Callable) - 创建向量数据库的嵌入函数。默认为None,将使用给定的embedding_model和SentenceTransformer。如果要使用OpenAI、Cohere、HuggingFace或其他嵌入函数,可以在此处传递。 请参考 https://docs.trychroma.com/embeddings 中的示例。
  • customized_prompt(可选,字符串)- 用于检索聊天的自定义提示。默认为 None。

  • customized_answer_prefix(可选,字符串)- 用于检索聊天的自定义答案前缀。默认为 ""。 如果不为空且自定义答案前缀不在答案中,则会触发“更新上下文”。

  • update_context(可选,布尔值)- 如果为 False,则不会对交互式检索应用“更新上下文”。默认为 True。

  • collection_name(可选,字符串)- 集合的名称。如果未提供键,则将使用默认名称“autogen-docs”。

  • get_or_create(可选,布尔值)- 是否获取已存在的集合。默认为 True。

  • overwrite(可选,布尔值)- 是否覆盖已存在的集合。默认为 False。 情况 1. 如果集合不存在,则创建该集合。 情况 2. 如果集合存在且 overwrite 为 True,则会覆盖该集合。 情况 3. 如果集合存在且 overwrite 为 False,如果 get_or_create 为 True,则获取该集合,否则会引发 ValueError。

  • custom_token_count_function(可选,可调用对象)- 用于计算字符串中标记数的自定义函数。 该函数应以 (text:str, model:str) 为输入,并返回 token_count(整数)。将传递 retrieve_config["model"] 给该函数。 默认为 autogen.token_count_utils.count_token,它使用 tiktoken,对于非 OpenAI 模型可能不准确。

  • custom_text_split_function(可选,可调用对象)- 用于将字符串拆分为字符串列表的自定义函数。 默认为 None,将使用 autogen.retrieve_utils.split_text_to_chunks 中的默认函数。

  • custom_text_types(可选,字符串列表)- 要处理的文件类型列表。 默认为 autogen.retrieve_utils.TEXT_FORMATS。 这仅适用于 docs_path 下的文件。无论其类型如何,显式包含的文件和 URL 都将被分块。

  • recursive(可选,布尔值)- 是否在 docs_path 中递归搜索文档。默认为 True。

  • distance_threshold(可选,浮点数)- 距离分数的阈值,只返回小于该阈值的距离。如果小于 0,则将被忽略。默认为 -1。

  • **kwargs dict - UserProxyAgent 中的其他 kwargs。

示例

覆盖 retrieve_docs 的示例 - 如果您已经设置了自定义的向量数据库,并且它与 chromadb 不兼容,您可以使用以下代码轻松插入它。

  • **已弃用** - 请改用 vector_db。您可以扩展 VectorDB 并将其传递给代理。
class MyRetrieveUserProxyAgent(RetrieveUserProxyAgent):
def query_vector_db(
self,
query_texts: List[str],
n_results: int = 10,
search_string: str = "",
**kwargs,
) -> Dict[str, Union[List[str], List[List[str]]]]:
# 在这里定义你自己的查询函数
pass

def retrieve_docs(self, problem: str, n_results: int = 20, search_string: str = "", **kwargs):
results = self.query_vector_db(
query_texts=[problem],
n_results=n_results,
search_string=search_string,
**kwargs,
)

self._results = results
print("文档ID: ", results["ids"])

retrieve_docs

def retrieve_docs(problem: str, n_results: int = 20, search_string: str = "")

根据给定的问题检索文档,并将结果赋值给类属性 _results。 检索到的文档应该是 QueryResults 类型,它是一个包含文档和距离的元组列表。

参数

  • problem str - 要解决的问题。
  • n_results int - 要检索的结果数量。默认为 20。
  • search_string str - 只检索包含该字符串完全匹配的文档。默认为空字符串。 如果向量数据库不支持该功能,则不使用。

返回值

无。

message_generator

@staticmethod
def message_generator(sender, recipient, context)

为 RetrieveUserProxyAgent 生成一个带有给定上下文的初始消息。

参数

  • sender Agent - 发送方代理。它应该是 RetrieveUserProxyAgent 的实例。
  • recipient Agent - 接收方代理。通常是助手代理。
  • context dict - 消息生成的上下文。它应包含以下键:
    • problem (str) - 要解决的问题。
    • n_results (int) - 要检索的结果数量。默认为 20。
    • search_string (str) - 只检索包含该字符串完全匹配的文档。默认为空字符串。

返回值

  • str - 生成的消息,准备发送给接收方代理。