链载Ai

标题: AutoGen: ReAct 和 RAG [打印本页]

作者: 链载Ai    时间: 昨天 09:37
标题: AutoGen: ReAct 和 RAG

本文主要介绍在AutoGen中如何使用ReAct策略及RAG,如何更好的解决问题及使用本地知识库。

ReAct

ReAct(Reasoning and Acting) 是一种基于提示的范式,可以在使用LLM来进行一系列分析任务的自动执行。注意包含:ThoughtActionObservationFinal Answer

关于ReAct更多的内容可以查看这篇论文:https://arxiv.org/abs/2210.03629

下面我们来看如何在AutoGen中使用ReAct策略:

定义ReAct策略Prompts

ReAct_prompt="""尽可能回答以下问题。你可以使用提供的工具。请使用以下格式:
问题:你必须回答的输入问题
思考:你应该始终考虑该做什么
行动:要采取的行动
行动输入:对行动的输入
观察:行动的结果
...(这个过程可以多次重复)
思考:我现在知道最终答案了
最终答案:对原始输入问题的最终回答

开始!
问题:{input}
"""

定义一个方法转换ReAct策略的prompt,传入问题:

defreact_prompt_message(sender,recipient,context):
returnReAct_prompt.format(input=context["question"])

定义一个调用工具

定义一个获取医生信息的方法,返回医生名字、价格和级别;这里使用另外一种方式来注册工具,使用function_map来注册工具,需要定义工具的schema:

defget_doctor_info(subject:str)->str:
ifsubject=="骨科":
returnstr([{"name":"李四","price":10,"level":"专家"},{"name":"赵六","price":15,"level":"主任"}])
ifsubject=="眼科":
returnstr([{"name":"张三","price":10,"level":"专家"},{"name":"李四","price":15,"level":"主任"}])
#定义schema
defget_doctor_info_tool():
#Definethefunctionschemabasedonthetool'sargs_schema
function_schema={
"name":"get_doctor_info",
"description":"获取医生信息",
"parameters":{
"type":"object",
"properties":{
'subject':{
'type':'string',
'description':'科室',
}
},
"required":['query'],
},
}
returnfunction_schema

function_schema 遵循openai规范,可参考:https://platform.openai.com/docs/api-reference/chat/create#chat-create-function_call

定义Agent并注册工具

user_proxy=autogen.UserProxyAgent(
name="user_proxy",
is_termination_msg=lambdax:x.get("content","")andx.get("content","").rstrip().endswith("TERMINATE"),
human_input_mode="NEVER",
max_consecutive_auto_reply=10,
code_execution_config={
"use_docker":False,
},
)

user_proxy.register_function(
function_map={
"get_doctor_info":get_doctor_info
}
)

assistant=autogen.AssistantAgent(
name="Assistant",
system_message="请使用提供的工具回答问题,当任务结束时回复:TERMINATE",
llm_config={"config_list":config.config_list,
"functions":[
get_doctor_info_tool(),
]},
)

这里也同样可以使用上一篇提到的两种方式来注册工具。

执行ReAct策略

user_proxy.initiate_chat(assistant,message=react_prompt_message,question="我腿部骨折需要看医生")

可以看到下面的输出,通过输出内容更易了解ReAct策略的运行过程和用处:

user_proxy(toAssistant):
尽可能回答以下问题。你可以使用提供的工具。请使用以下格式:
...
开始!
问题:我腿部骨折需要看医生
--------------------------------------------------------------------------------
Assistant(touser_proxy):
思考:需要找出处理骨折的医生,一般来说,这是骨科医生的职责。
行动:用提供的工具来找出医生信息。
行动输入:{'subject':'骨科'}
*****Suggestedfunctioncall:get_doctor_info*****
Arguments:
{
"subject":"骨科"
}
****************************************************
--------------------------------------------------------------------------------
>>>>>>>>EXECUTINGFUNCTIONget_doctor_info...
user_proxy(toAssistant):
*****Responsefromcallingfunction(get_doctor_info)*****
[{'name':'李四','price':10,'level':'专家'},{'name':'赵六','price':15,'level':'主任'}]
************************************************************
--------------------------------------------------------------------------------
Assistant(touser_proxy):
观察:找到了两位骨科医生,一个是专家级别的李四,花费是10,另一个是主任级别的赵六,花费是15。
思考:我现在知道最终答案了。
最终答案:你可以选择李四医生或赵六医生进行诊疗,李四是骨科的专家,费用为10,赵六是骨科主任,费用为15。
TERMINATE
--------------------------------------------------------------------------------
Processfinishedwithexitcode0

另外,Teachability使用向量库可以使Agent记住用户所给予的信息,从而可以更轻松地回答类似的问题。类似于给了Agent一个备忘录,当使用teachability.add_to_agent(agent)时,再次提问,Agent将会直接给出答案。

RAG

RAG(Retrieval Augmented Generation),检索增强将语言模型与外部知识检索相结合,以提高生成响应的质量和相关性。在AutoGen中提供了RetrieveUserProxyAgentRetrieveUserProxyAgent支持RAG。

构建embedding_function与文本拆分器

RAG数据准备大致分为四个阶段:数据提取文本分割向量化数据入库

openai_embedding_function=embedding_functions.OpenAIEmbeddingFunction(api_key="",api_base="",api_type="",api_version="",model_name="text-embedding-ada-002")
text_splitter=RecursiveCharacterTextSplitter(separators=["\n\n","\n","\r","\t"])

构建智能体

assistant=RetrieveAssistantAgent(
name="assistant",
system_message="Youareahelpfulassistant.",
llm_config={
"timeout":600,
"cache_seed":42,
"config_list":config.config_list,
},
)

ragproxyagent=RetrieveUserProxyAgent(
name="ragproxyagent",
human_input_mode="NEVER",
max_consecutive_auto_reply=3,
retrieve_config={
"task":"qa",
"docs_path":[
"https://xxxx.md",
os.path.join(os.path.abspath(""),".","file","info.md"),
],
"chunk_token_size":2000,
"model":config.config_list[0]["model"],
"client":chromadb.PersistentClient(path="/tmp/chromadb"),
"embedding_model":"text-embedding-ada-002",
"must_break_at_empty_line":False,
"get_or_create":True,
"embedding_function"penai_embedding_function,
"custom_text_split_function":text_splitter.split_text,
"collection_name":"my-test"
},
code_execution_config=False,
)

retrieve_config(dict 或 None):检索代理的配置,参数介绍:

执行问答

ragproxyagent.initiate_chat(assistant,message=ragproxyagent.message_generator,problem='总结下文档信息,介绍下企业情况',search_string="code",n_results=2)

输出如下:

Tryingtocreatecollection.
doc_ids:[['doc_1','doc_2']]
Addingdoc_iddoc_1tocontext.
Addingdoc_iddoc_2tocontext.
...
User'squestionis:总结下文档信息,介绍下企业情况
...
assistant(toragproxyagent):
这是一个由Hugging Face组织的项目,旨在开发最佳的句子嵌入模型...。文档无法提供任何关于企业的情况。

可以看到在AutoGen中RetrieveUserProxyAgent首先自动处理文档,拆分、分块并将它们存储在矢量数据库中。然后,对于给定的用户输入,它会检索相关块作为上下文并将其发送到RetrieveAssistantAgent,RetrieveAssistantAgent使用 LLM 生成代码或文本来回答问题。Agent交谈,直到他们找到满意的答案。

此外,AutoGen中也添加了QdrantRetrieveUserProxyAgent使用 qdrant 作为向量数据库; 集成了 UNSTRUCTURED 来支持许多非结构化文档。关于 RAG的内容,Autogen 仍然在快速迭代中。

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: normal;text-wrap: wrap;background-color: rgb(255, 255, 255);">






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5