AutoGen简介
简介
通过多智能体协作,AutoGen 框架能够有效地解决单智能体系统在处理复杂任务时的局限性,例如缺乏反思能力、工作记忆和感知能力等。
可定制性和可扩展性:选择、配置不同的智能体和功能, 实现定制化功能,也支持扩展智能体的能力。
记忆机制
RAG
基于chroma向量数据库实现的RAG存储机制。
核心向量索引技术是基于hnswlib库实现的HNSW算法
向量数据库
AutoGen使用ChromeDB而不是其他类型的向量数据库。
| 特性 | ChromaDB | Milvus | FAISS | Pinecone |
|---|---|---|---|---|
| 安装与部署 | ✅ pip 即可用 | ❌ 需要 docker + 服务端 | ✅ 仅库 | ❌ 需注册云账号 |
| 适合规模 | 小~中 | 中~大 | 小 | 中~大 |
| 是否需要网络 | ❌ 无需 | ❌ 通常需要 | ❌ 无需 | ✅ 必需联网 |
| 集成复杂度 | ✅ 极简 | ❌ 有学习成本 | ✅ 简单但功能少 | ✅ 高封装,需注册 |
| 本地调试 | ✅ 极好 | ❌ 不便 | ✅ 极好 | ❌ 不能本地运行 |
任务中心记忆
缓存
底层使用redis
缓存存储
提供了两种缓存存储机制:Redis和DiskCache。
实现
组件架构
实现了AutoGen的Component接口,支持序列化和反序列化
提供了_to_config和_from_config方法,实现配置与实例间的转换
泛型支持
支持缓存任何类型的数据
依赖注入
构造函数接受外部创建的缓存实例,使用户可以灵活配置
应用场景
缓存LLM结果
减少重复的API调用,节约成本
提供应用的响应速度
作为分布式应用的共享状态
Redis实现适合多实例/多服务器部署
支持团队协作和共享缓存
持久化存储
DiskCache提供了本地持久化存储
适合单机部署或不要共享缓存的场景
代码执行器
azure
docker
jupyter
local
工具
代码执行器
Microsoft Azure
Graphrag
AutoGen的GraphRAG是一个基于图结构的检索增强生成(RAG)工具,它将图数据库和语义搜索相结合,用于在大型文档集合上执行更智能的搜索和信息检索。GraphRAG扩展了传统RAG系统,通过将文档间的关系建模为图,实现了更复杂、更相关的信息检索。
核心组件
GraphRAG在AutoGen中提供了两种主要的搜索工具:
1. GlobalSearchTool
用于执行全局范围的搜索,关注整个文档集合的概述和社区级别的信息:
1 | |
- 用途: 回答关于整体趋势、主题社区和高层次概念的广泛问题
- 配置: 通过
GlobalDataConfig配置数据源,使用GlobalContextConfig配置上下文参数 - 主要组件:
- 社区(Communities): 相关实体的集合
- 社区报告(Reports): 关于社区的文本摘要和见解
- Map-Reduce流程: 使用
MapReduceConfig配置分批处理大型文档集
2. LocalSearchTool
用于执行专注于特定实体和关系的本地搜索:
1 | |
- 用途: 回答关于特定实体、实体间关系或详细事实的精确问题
- 配置: 通过
LocalDataConfig配置数据源,使用LocalContextConfig配置上下文参数 - 主要组件:
- 实体(Entities): 文档中的关键概念或对象
- 关系(Relationships): 实体之间的连接
- 文本单元(Text Units): 包含实体信息的文本段落
配置类
GraphRAG工具使用多级配置系统来自定义搜索行为:
数据配置
- DataConfig: 基础数据配置,指定输入目录和表名
- GlobalDataConfig: 全局搜索专用配置,添加了社区相关表格
- LocalDataConfig: 本地搜索专用配置,添加了关系和文本单元表格
上下文配置
- ContextConfig: 基础上下文配置,设置最大令牌数
- GlobalContextConfig: 控制社区数据如何被使用(权重、排名等)
- LocalContextConfig: 控制实体、关系和文本单元的使用比例
搜索和处理配置
- MapReduceConfig: 控制全局搜索中的Map-Reduce流程
- SearchConfig: 控制本地搜索行为
使用流程
前提条件:
- 安装依赖:
pip install -U "autogen-agentchat" "autogen-ext[graphrag]" - 完成GraphRAG索引过程,生成必要的数据文件
- 安装依赖:
初始化工具:
1
2
3# 从GraphRAG设置文件创建工具
global_tool = GlobalSearchTool.from_settings(settings_path="./settings.yaml")
local_tool = LocalSearchTool.from_settings(settings_path="./settings.yaml")集成到AutoGen代理:
1
2
3
4
5
6assistant_agent = AssistantAgent(
name="search_assistant",
tools=[global_tool, local_tool],
model_client=openai_client,
system_message="你是一个使用GraphRAG框架的AI助手..."
)执行搜索:
1
2
3
4
5# 全局搜索示例
await assistant_agent.run_stream(task="整个数据集的整体情感是什么?")
# 本地搜索示例
await assistant_agent.run_stream(task="站长关于Becher博士说了什么?")
技术细节
- 向量存储: 使用
LanceDBVectorStore存储实体嵌入,用于语义搜索 - 文本编码: 使用
tiktoken进行标记化和编码 - 上下文构建:
GlobalCommunityContext: 构建基于社区的全局上下文LocalSearchMixedContext: 混合实体、关系和文本单元构建本地上下文
- 并发处理: 全局搜索支持高并发协程执行
工作原理
数据预处理与索引:
- 文档被分解为实体、关系和文本单元
- 实体被分组为社区,生成社区报告
- 所有元素被嵌入到向量空间
查询处理:
- 分析用户查询,确定相关实体和主题
- 根据查询类型选择适当的搜索策略
上下文构建:
- 全局搜索: 收集相关社区及其报告
- 本地搜索: 获取特定实体及其关系和相关文本
生成回答:
- 将构建的上下文与用户查询一起发送给LLM
- (对于全局搜索)使用Map-Reduce处理大型上下文
GraphRAG通过将图结构与语义搜索相结合,提供了比传统RAG系统更强大的搜索能力,尤其适合处理多文档、复杂关系的信息检索任务。
Http
特点与优势
灵活的API集成: 可以连接到任何HTTP/HTTPS服务
参数验证: 使用JSON Schema保证输入参数的合法性
路径参数支持: 可以方便地在URL路径中插入参数
异步实现: 基于httpx的异步HTTP客户端
多种HTTP方法: 支持GET、POST、PUT、DELETE、PATCH
灵活的响应处理: 可以返回原始文本或JSON对象
应用场景
访问Web API: 连接到外部服务如天气API、翻译服务等
数据检索: 从在线数据源获取信息
服务集成: 接入企业内部服务
工具扩展: 通过HTTP扩展代理的能力
Langchain
MCP
Semantic Kernel
Semantic Kernel(语义内核)是微软推出的开源SDK,旨在将大型语言模型(LLM)与传统编程语言(如C#、Pythovn、Java)无缝集成,帮助开发者构建结合AI自然语言能力和传统编程精确性的智能应用。
大模型
Cache
Olloma
OpenAI
多智能体协作(AutoGen Teams)
SelectorGroupChat
适用场景
潜在问题
并行执行
模型
任务中心记忆
AutoGen的@experimental模块是一个包含实验性功能的代码集合,目前主要包含”Task-Centric Memory”(任务中心记忆)功能。这个功能旨在解决AI代理的记忆限制问题,让AI能够从之前的交互中学习并在未来的任务中应用这些知识。
Task-Centric Memory 核心组件
MemoryController:
- 主要控制器类,管理记忆的创建、存储和检索
- 提供API用于添加记忆(memo)、检索相关记忆,以及从任务中学习
- 负责与MemoryBank通信并处理记忆流程
MemoryBank:
- 存储记忆的核心组件
- 使用向量数据库存储”topic”到”insight”的映射
- 管理记忆的持久化存储和检索
Memo:
- 记忆的基本单位,包含两个主要字段:
task:可选的任务描述insight:帮助解决类似任务的提示、解决方案或计划
- 记忆的基本单位,包含两个主要字段:
StringSimilarityMap:
- 实现语义相似度搜索功能
- 用于找到与当前任务语义上相关的记忆
Prompter:
- 负责生成各种提示以与LLM交互
- 处理任务泛化和主题提取
工作流程
记忆创建和存储:
1
await memory_controller.add_memo(task="What color do I like?", insight="Deep blue is my favorite color")- 系统将任务泛化,以便更好地匹配未来相似但不完全相同的任务
- 从任务和洞察中提取主题(topics)
- 这些主题被映射到记忆,并存储在向量数据库中
记忆检索:
1
memos = await memory_controller.retrieve_relevant_memos(task="What colors do I like most?")- 对给定任务进行泛化处理
- 从泛化任务中提取查询主题
- 在向量数据库中查找与这些主题最相似的存储主题
- 筛选出最相关的记忆,并通过LLM验证它们对当前任务的有用性
记忆使用:
- 检索到的记忆被格式化为提示,附加到发送给代理的任务描述中
- 代理可以利用这些记忆解决当前任务
学习循环:
- 系统可以通过
train_on_task方法从任务执行中学习 - 它会多次尝试任务,发现失败模式,然后生成有用的洞察力(insights)
- 这些洞察力被添加到记忆库中,用于未来相似任务
- 系统可以通过
技术特点
- 任务泛化:将特定任务转化为更一般的形式,提高知识迁移能力
- 主题提取:从任务和洞察中提取多词主题,增强语义匹配
- 相似度过滤:使用向量相似度和LLM验证双层过滤,确保检索记忆的相关性
- 持久化存储:记忆可以保存到磁盘,在不同会话间保持
集成方式
代码提供了两种集成方式:
直接使用MemoryController:
1
2
3memory_controller = MemoryController(reset=True, client=client)
await memory_controller.add_memo(task="...", insight="...")
memos = await memory_controller.retrieve_relevant_memos(task="...")创建支持记忆的代理:
1
2
3class MemoryEnabledAgent(RoutedAgent):
def __init__(self, description, model_client, memory_controller):
# ...代理实现
研究状态和限制
注意代码中多次标记”EXPERIMENTAL, RESEARCH IN PROGRESS”,表明这是一个实验性功能,仍在积极开发中。主要目标是解决以下问题:
- 帮助AI代理突破上下文窗口的限制
- 记住用户提供的指导、纠正和计划
- 从代理自身经验中学习
- 避免重复之前犯过的错误
应用实践
个性化
每个用户的问题/回答如何存储?
再次提问时如何构造当前问题的上下文?
如何实现借助超过大模型Context窗口的上下文实现更好的推理?