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"。- 当设置为“ALWAYS”时,代理每次收到消息时都会提示人工输入。在此模式下,当人工输入为“exit”时,或当is_termination_msg为True且没有人工输入时,对话将停止。
- 当“TERMINATE”时,代理仅在被接收到终止消息或自动回复次数达到 max_consecutive_auto_reply 时才会提示人工输入。
- 当设置为“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
- 生成的消息,准备发送给接收代理。