AutoGen学习笔记系列(十二)Advanced - Memory
这篇文章瞄的是AutoGen官方教学文档 Advanced
章节中的 Memory
篇章,介绍了如何将外部知识添加进 Team或Agent中以实现RAG功能。
- 官网链接:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/memory.html ;
【注意】:本文的Memory可以被翻译成“知识库”,但这里为了和专家系统进行区分就翻译成“记忆体”了;
Memory
对于一个Team或者Agent而言维护一些有价值的知识 facts
能够更好的让其开展工作,因为他们能够在合适的时间将这些知识添加到上下文中。最经典的使用实例就是 Retrieval-Augmented Generation (RAG)
,即检索增强生成,是一种结合了 信息检索 和 文本生成 的技术,主要用于提升LLM在生成文本时的准确性和相关性。
RAG 的核心思想是:在生成文本之前,先从外部知识库或文档中检索相关信息,然后将检索到的信息给LLM生成更准确、更有依据的答案。这种方法特别适合 需要基于事实或特定领域知识的任务。有点类似于构建了一个 小型或临时 的专家系统,但与专家系统之间存在本质区别:
RAG | 专家系统 | |
---|---|---|
目标 | 动态生成准确、相关的文本 | 模拟专家决策,解决特定领域问题 |
知识来源 | 外部动态检索 | 手工构建的知识库 |
灵活性 | 高,适用于开放领域 | 低,适用于封闭领域 |
输出特性 | 概率性,可能存在幻觉 | 确定性,基于规则推理 |
技术实现 | 深度学习 + 检索技术 | 规则引擎 + 符号推理 |
应用场景 | 问答、内容生成、开放领域任务 | 诊断、决策支持、封闭领域任务 |
关于RAG和专家系统之间的差异这里就不再过多赘述,感兴趣的可以自己去查看相关文献。
AutoGen库提供了一个 Memory
协议以提供以下功能,其核心方法是 query
、update_context
、add
、clear
以及close
:
add
:向记忆中添加新的知识;query
:从记忆中检索相关知识;update_context
:通过添加检索到的知识来修改Agent内部的上下文信息model_context
;clear
:清空记忆中的所有知识;close
:清空记忆中的所有知识并回收资源;
ListMemory Example
微软提供了一个基于 ListMemory
对象的记忆体并按照时间关系来维护,能够将近期的记忆添加到模型的上下文中,你可以将其看作是一个 list
数组。该对象被设计成明确且直接可用的,因为list中的内容本身就是你新增的知识,而不是LLM生成的。
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_core.memory import ListMemory, MemoryContent, MemoryMimeType
from autogen_ext.models.openai import OpenAIChatCompletionClient
import os, asyncio
os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"
#------------------------------------------------------------#
# Step1. 创建一个 ListMemory 对象
user_memory = ListMemory()
#------------------------------------------------------------#
# Step2. 手动添加一些知识给 ListMemory 对象
# 1. 天气的返回信息必须是公制单位
# 2. 食谱必须是素食;
async def user_memory_add():
await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))
await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))
#------------------------------------------------------------#
# Step3. 定义一个用来获取天气的工具tool
async def get_weather(city: str, units: str = "imperial") -> str:
if units == "imperial":
return f"The weather in {city} is 73 °F and Sunny."
elif units == "metric":
return f"The weather in {city} is 23 °C and Sunny."
else:
return f"Sorry, I don't know the weather in {city}."
#------------------------------------------------------------#
# Step4. 创建Agent
assistant_agent = AssistantAgent(
name="assistant_agent",
model_client=OpenAIChatCompletionClient(
model="gpt-4o-2024-08-06",
),
tools=[get_weather],
memory=[user_memory],
)
async def main():
# 任务一:使用工具 get_weather 查询纽约天气
await user_memory_add()
stream = assistant_agent.run_stream(task="What is the weather in New York?")
await Console(stream)
print("-" * 50)
message = await assistant_agent._model_context.get_messages()
for item in message:
print(item)
print("-" * 50)
# 任务二:向LLM进行轮询,要求写一个肉汤食谱
stream = assistant_agent.run_stream(task="Write brief meal recipe with broth")
await Console(stream)
asyncio.run(
main()
)
运行结果如下,第一个任务:
$ python demo.py
【缺失库】Custom Memory Stores (Vector DBs, etc.)
除了上面用纯文本的方式添加记忆体意外,AutoGen也提供了使用向量或者ext文件的形式来添加记忆体中的内容,即你可以使用矢量数据库存储和检索信息,但需要对 add
, query
, update_context
这三个方法进行重载:
【注意】:对于我当前的AutoGen版本 0.4.7
而言,官网的demo在此处至少缺失一个库 chromadb
,但文档中提示 autogen-ext 0.4.7 does not provide the extra 'memory'
,我后续将这个问题解决后再放上修改后的demo;