跳到主要内容

agentchat.contrib.retrieve_user_proxy_agent

检索用户代理

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 函数 - 一个函数,它以字典形式接收消息并返回一个布尔值,指示接收到的消息是否为终止消息。该字典可以包含以下键:"content", "role", "name", "function_call"。

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

    要使用默认配置,请设置为None。否则,设置为包含以下键的字典:

    • task(可选,str)- retrieve chat的任务。可能的值为"code"、"qa"和"default"。系统提示将因任务不同而不同。 默认值为default,支持code和qa,并在响应末尾提供来源信息。
    • vector_db(可选,Union[str, VectorDB])- 用于检索聊天的向量数据库。如果它是一个字符串,则应该是向量数据库的类型,例如“chroma”;否则,它应该是VectorDB协议的一个实例。默认值为“chroma”。设置为None以使用已弃用的client
    • db_config(可选,Dict) - 向量数据库的配置。默认为{}。请确保你理解所使用的向量数据库的配置,否则请保持为{}。 仅在vector_db为字符串时有效。
    • client(可选,chromadb.Client)- chromadb 客户端。如果未提供键,将使用默认客户端 chromadb.Client()。如果你想使用其他向量数据库,请扩展此类并覆盖 retrieve_docs 函数。[已弃用] 请改用 vector_db
    • docs_path(可选,Union[str, List[str]]) - 文档目录的路径。它也可以是单个文件的路径、单个文件的URL或目录、文件和URL的列表。默认值为None,仅在集合已创建时有效。
    • extra_docs(可选,布尔值)- 当为真时,允许添加具有唯一ID的文档而不覆盖现有文档;当为假时,使用默认ID替换现有文档,存在集合被覆盖的风险。当设置为真时,系统会为新的文档块分配从"length+i"开始的唯一ID,防止现有文档被替换,并方便向集合中添加更多内容。默认情况下,"extra_docs"设置为假,文档ID从零开始。这存在风险,因为新文档可能会覆盖现有文档,可能会导致集合中的数据无意中被丢失或更改。[已弃用] 在使用vector_db而不是client时,请使用new_docs
    • new_docs (可选, bool) - 当为True时,仅向集合中添加新文档; 当为False时,更新现有文档并添加新的文档。默认值为True。 文档id用于确定文档是新文档还是现有文档。默认情况下, id是内容的哈希值。
    • model (可选, str) - 用于检索聊天的模型。 如果未提供键,将使用默认模型 gpt-4
    • chunk_token_size(可选,int)- 用于检索聊天的块 token 大小。 如果未提供此键,将使用默认大小 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/guides/embeddings中的示例。
    • customized_prompt (可选, str) - 用于检索聊天的自定义提示。 默认值为 None。
    • customized_answer_prefix (可选, str) - retrieve chat 的自定义回答前缀。默认为 ""。 如果不是 "" 且自定义回答前缀不在回答中, 将触发 Update Context
    • update_context (可选, bool) - 如果为False,将不会应用Update Context进行交互式检索。默认值为True。
    • collection_name(可选,str) - 集合的名称。 如果未提供键,将使用默认名称autogen-docs
    • get_or_create (可选,bool) - 如果集合存在,是否获取该集合。默认值为 False。
    • overwrite (可选, bool) - 如果集合已存在,是否覆盖它。默认为 False。 情况 1. 如果集合不存在,创建集合。 情况 2. 集合存在,如果 overwrite 为 True,它将覆盖集合。 情况 3. 集合存在且 overwrite 为 False,如果 get_or_create 为 True,它将获取集合,否则会引发 ValueError。
    • custom_token_count_function(可选,可调用)- 用于计算字符串中令牌数量的自定义函数。该函数应接受 (text:str, model:str) 作为输入,并返回 token_count(int)。retrieve_config["model"] 将传递给该函数。默认值为 autogen.token_count_utils.count_token,它使用 tiktoken,可能对非 OpenAI 模型不准确。
    • custom_text_split_function (可选, Callable) - 一个自定义函数,用于将字符串分割成字符串列表。 默认值为 None,将使用 autogen.retrieve_utils.split_text_to_chunks 中的默认函数。
    • custom_text_types(可选,List[str])- 一个要处理的文件类型的列表。 默认是 autogen.retrieve_utils.TEXT_FORMATS。 这仅适用于 docs_path 目录下的文件。明确包含的文件和URL无论其类型如何都会被分块处理。
    • recursive (可选, bool) - 是否在 docs_path 中递归搜索文档。默认为 True。
    • distance_threshold (Optional, float) - 距离分数的阈值,只有小于该值的距离才会被返回。如果小于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]]]]:
# define your own query function here
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("doc_ids: ", 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 - 仅检索包含此字符串完全匹配的文档。默认为“”。 如果 vector_db 不支持,则不使用。

返回:

无。

消息生成器

@staticmethod
def message_generator(sender, recipient, context)

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

参数:

  • sender Agent - 发送者代理。它应该是RetrieveUserProxyAgent的实例。
  • recipient Agent - 接收方代理。通常它是助手代理。
  • context dict - the context for the message generation. It should contain the following keys:
    • problem (str) - 需要解决的问题。
    • n_results (int) - 要检索的结果数量。默认值为20。
    • search_string (str) - 仅包含该字符串完全匹配的文档将被检索。默认为""。

返回:

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