逐步掌握最佳Ai Agents框架-AutoGen 九 RAG应用

从LangChain使用Agent的懵懵懂懂,到AutoGen的"放肆"Agents,这周的学习和写作实在太幸福了。假如您是第一次接触AugoGen,请先要查看AutoGen官方文档,或翻阅AutoGen系列的前几篇。

逐步掌握最佳Ai Agents框架-AutoGen 一

逐步掌握最佳Ai Agents框架-AutoGen 二

逐步掌握最佳Ai Agents框架-AutoGen 三 写新闻稿新方式

[逐步掌握最佳Ai Agents框架-AutoGen 四 多代理群聊实例]

逐步掌握最佳Ai Agents框架-AutoGen 五 与LangChain手拉手 - 掘金 (juejin.cn)

逐步掌握最佳Ai Agents框架-AutoGen 六 语音AI代理 - 掘金 (juejin.cn)

逐步掌握最佳Ai Agents框架-AutoGen 七 低代码AI助理 - 掘金 (juejin.cn)

逐步掌握最佳Ai Agents框架-AutoGen 八 开源模型 - 掘金 (juejin.cn)

在最近的几篇文章里,我们使用AutoGen实现了一些Demo。这篇文章,我们将使用AutoGen来完成RAG应用开发。

RAG应用

RAG全称"Retrieval-Augmented Generation",即检索增强生成,它是自然语言处理中的一项技术。这种模型结合了检索式(retrieval-based)和生成式(generative)两种组件,以生成更准确、更相关的回答。

在之前我们的基于文档的聊天机器人的例子,就是RAG的一种应用。在本系列的逐步掌握最佳Ai Agents框架-AutoGen 五 与LangChain手拉手 - 掘金 (juejin.cn),我们将文档读取、向量化和存储工作交给了LangChain, AutoGen以agent with function calls 的方式调用LangChain封装好的函数。AutoGen在最近版本里,新增了RetriveChat,可以减少对LangChain的依赖。那么,我们一起来看下AutoGen如何独立完成RAG应用开发。

RetrievalAgent

让我们来看下,官方文档对Retrieval-Augmented Generation (RAG) Applications with AutoGen | AutoGen (microsoft.github.io)的介绍。

从上图可以看出,AutoGen提供了Retrieval-augmented User Proxy 和Retrieval-augmented Assistant两个agent。

现在就让我们开干。

实战

  • 文档

之前的RAG项目中我们用到的是Uniswap的白皮书,这个项目里,我们换成了arxiv.org/pdf/2308.00..., 这是一份rag和向量技术在医疗教育中的相关研究文章。让我们在notebook里把它下载到当前项目中。

python 复制代码
!wget -o rag.pdf https://arxiv.org/pdf/2308.00479.pdf
  • 安装库
python 复制代码
%pip install pyautogen[retrievechat] langchain "chromadb<0.4.15" -q

这次安装pyautogen,多加了retrieveChat功能包的声明。我们依然安装了langchain, 在这里主要使用它的splitter功能,当然autogen也是提供了。最后我们安装了指定版本的chromadb 向量数据库,存储文档embedding。

  • 配置autogen config_list
css 复制代码
import autogen # 大家可以使用gpt-4 或其它,我这里用的是3.5, 还能用。 config_list = [ { 'model': 'gpt-3.5-turbo', 'api_key': '' }]
llm_config={ "seed": 42, #为缓存做的配置 "config_list": config_list }

接下来是比较典型的文档机器人的构建步骤

  • 配置embedding函数

我们会对question和文档都在embedding, AI助理回答问题的过程,其实就是将question的embedding和文档的embedding进行cosine 计算,得到相似度的过程。我们使用openai 做embedding。

ini 复制代码
# 从chromadb数据库中引入embedding_functions
from chromadb.utils import embedding_functions
# 调用OpenAIEmbeddingFunction 
openai_embedding_function = embedding_functions.OpenAIEmbeddingFunction(api_key = config_list[0]["api_key"])
  • 设置文本拆分器
python 复制代码
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n", "\r", "\t"])
  • 实例化arg agents
python 复制代码
from autogen.agentchat.contrib.retrieve_assistant_agent import RetrieveAssistantAgent
from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent

llm_config = {
    "request_timeout": 600,
    "config_list": config_list,
    "temperature": 0
}

assistant = RetrieveAssistantAgent(
    name="assistant",
    system_message="You are a helpful assistant.",
    llm_config=llm_config,
)

rag_agent = RetrieveUserProxyAgent(
    human_input_mode="NEVER",
    retrieve_config={
        "task": "qa",
        "docs_path": "./rag.pdf",
        "collection_name": "rag_collection",
        "embedding_function": openai_embedding_function,
        "custom_text_split_function": text_splitter.split_text,
    },
)

首先我们引入了RetrieveUserProxyAgentRetrieveAssistantAgent两个agent。从引入的路径autogen.agentchat.contrib.retrieve_assistant_agent来看,rag agent也是由autogen的chat agent派生,它这里称为"contrib"。接着,我们定义了llm_config,autogen使用的大模型配置,注意,这里的temperature为0, 基于文档的Q/A应该严谨。RetrieveAssistantAgent负责执行rag工作,system_message 指定了assistant的角色。RetrieveUserProxyAgent 的retrieve_config,提起了RAG的重担,我们做了以下配置:

  1. task:qa 指定任务为 QA问答任务类型
  2. docs_path 指定文档路径
  3. collection_name chromadb 向量数据库的名字
  4. embedding_function为上面设置的openai_embedding_function
  5. custom_text_split_function为上面设置的langchain的文本分割器
  • 启动对话,执行QA
python 复制代码
assistant.reset()
rag_agent.initiate_chat(assistant, problem="What is the workflow in docGPT?", n_results=2)

rag_agent 初始化任务,提的问题是What is the workflow in docGPT?, n_results 表示返回多少个结果,默认是20个, 这里只需要2个。

  • 结果分析

在这里看到有两个文档分块被加入到上下文当中。上下文即context,等下将会交给assistant 进行回答生成。RetrieveChatAgent(to assistant) 表示向assistant提供了如下的内容,也就是上下文。

如上图,它包括了RAG QA任务的模板(You're a retrieve aumented chatbot. You answer user's questions based on your own knowledge and the context provied by the user....)和内容(context)。模板中也说的很清楚,如果基于context无法回复用户提出的问题,那么就向proxy 发出UPDATE CONTEXT的需要。上图的后半部分,就是通过embedding查询获得的文档内容。

最后, RetrieveAssistantAgent根据RetrieveUserProxyAgent提供的context,完成了回答的生成, 这也是大模型最擅长的summarize。

总结

RAG是LLM的经典应用,AutoGen通过提供chat agent的 rag 升级agent,完成了相应功能。

  • RetrieveUserProxyAgent的配置需要完成文档读取、向量数据库、分词器的配置
  • RetrieveUserProxyAgent的prompt模板预置了QA 内容。
  • RetrieveAssistantAgent对RetrieveUserProxyAgent提供的context,完成回答生成。

如果您喜欢我的AutoGen系列,请点赞,收藏。谢谢。

参考资料

相关推荐
余炜yw25 分钟前
【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
人工智能·rnn·深度学习
莫叫石榴姐41 分钟前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
如若1231 小时前
利用 `OpenCV` 和 `Matplotlib` 库进行图像读取、颜色空间转换、掩膜创建、颜色替换
人工智能·opencv·matplotlib
YRr YRr1 小时前
深度学习:神经网络中的损失函数的使用
人工智能·深度学习·神经网络
ChaseDreamRunner1 小时前
迁移学习理论与应用
人工智能·机器学习·迁移学习
Guofu_Liao1 小时前
大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法
人工智能·语言模型·矩阵·llama
我爱学Python!1 小时前
大语言模型与图结构的融合: 推荐系统中的新兴范式
人工智能·语言模型·自然语言处理·langchain·llm·大语言模型·推荐系统
果冻人工智能2 小时前
OpenAI 是怎么“压力测试”大型语言模型的?
人工智能·语言模型·压力测试
日出等日落2 小时前
Windows电脑本地部署llamafile并接入Qwen大语言模型远程AI对话实战
人工智能·语言模型·自然语言处理
麦麦大数据2 小时前
Python棉花病虫害图谱系统CNN识别+AI问答知识neo4j vue+flask深度学习神经网络可视化
人工智能·python·深度学习