能否在不依赖超大型、昂贵的 大语言模型 (LLM)的情况下,构建智能体工作流?答案是肯定的。在本教程中,我们将演示如何使用 AutoGen 在本地使用 IBM® Granite 构建多智能体 RAG 系统。
检索增强生成 (RAG) 是一种有效的方法,可以为 LLM 提供来自各种数据源的附加数据集,而无需进行昂贵的微调。类似地,智能体式 RAG 利用 AI 智能体的能力来规划和执行子任务,以及检索相关信息以补充 LLM 的知识库。与传统的聊天机器人相比,这种能力使 RAG 应用能够实现更高的优化程度和更强的可扩展性。我们不再需要编写复杂的 SQL 查询来从知识库中提取相关数据。
智能体式 RAG 的未来在于多智能体 RAG 架构,通过多个专业智能体的协同运作,实现最优延迟与效率。我们将通过使用 Granite 3.2 等小型高效模型并将其与模块化智能体架构相结合,来演示这种协作。我们将使用多个专门的“迷你智能体”,它们通过自适应规划和工具或功能调用来协作完成任务。正如人类团队协作,由多个智能体构成的系统,在角色分工明确、沟通机制高效的情况下,其表现往往优于单一个体的孤军奋战。
为了协调这种协作,我们可以使用 AutoGen (AG2) 作为核心框架来管理工作流和决策,同时结合 Ollama(用于本地 LLM 服务)和 Open WebUI(用于交互)等工具。AutoGen 是 Microsoft 开发的用于创建多智能体 AI 应用程序的框架。1 值得注意的是,本教程中使用的每个组件都是开源的。这些工具共同使您能够在不离开笔记本电脑的情况下,构建一个既强大又注重隐私的 AI 系统。
我们的 Granite 检索智能体依赖于模块化架构,其中每个智能体都有专门的角色。与人类一样,当智能体有针对性的指令和足够的上下文来做出明智的决定时,他们的表现最佳。过多无关信息(例如未经筛选的聊天记录)会引发“大海捞针”难题,导致有效信号与背景噪音难以甄别。
在这个智能体式 AI 架构中,智能体按顺序协同工作以实现目标。生成式 AI 系统的组织方式如下:
规划器智能体:在工作流开始时创建初始的高阶计划。例如,如果用户问:“有哪些与我团队正在使用的项目相似的开源项目?”那么,该智能体将制定一个逐步计划,可能如下所示:“1.在团队文档中搜索开源技术。2. 在网络上搜索与第 1 步中找到的开源项目相似的项目。”如果其中任何一步失败或结果不充分,这些步骤随后可以由反思智能体进行调整。
研究助手:研究助手是系统的主力执行者。它接收并执行指令,例如“在团队文档中搜索开源技术”。在计划的第 1 步,它使用来自规划器的初始指令。在随后的步骤中,它还会从前一步的结果中获取整理后的上下文信息。
例如,如果被要求“在网上搜索类似的开源项目”,它还会接收到前一步文档搜索的输出结果。根据指令,研究助手可以使用网页搜索、文档搜索,或两者结合来完成任务。
步骤评审者:步骤评审者负责判断前一步的输出是否令人满意地完成了所接收到的指令。它会接收到两条信息:刚执行的单步指令以及该指令的输出结果。让步骤评审者对对话进行评估,有助于明确目标是否已达成,而这对于下一步的规划是必要的。
目标评判者:目标评判者根据所提供目标的所有要求、为实现目标制定的计划以及迄今收集到的信息,来判断最终目标是否已达成。评判者的输出要么是“YES”,要么是“NOT YET”,并附上一段不超过一到两句的简短说明。
反思智能体:反思智能体是我们的执行决策者。它会决定下一步该采取什么行动,是提前进入下一个计划步骤、调整方向以弥补偏差,还是确认目标已完成。就像现实生活中的首席执行官一样,当反思智能体有一个明确目标,并获得关于实现该目标的进展情况(无论是否取得进展)的简明信息时,它能够做出最佳决策。反思智能体的输出要么是下一步的行动指令,要么是在目标已达成时发出的终止指令。我们向反思智能体提供以下内容:
以结构化的格式呈现这些事项,可以让我们的决策者清楚地了解已经完成的工作,从而决定下一步需要做什么。
报告生成器:一旦目标达成,报告生成器会将所有发现整合成一个连贯的输出,直接回答最初的查询。虽然流程中的每一步都会生成目标输出,但报告生成器会将所有内容整合到最终报告中。
对于初学者来说,从零构建一个智能体式 AI 应用可能比较困难。因此,我们将使用一组开源工具。Granite Retrieval Agent 整合了多种工具,用于构建智能体式 RAG 系统。
开放式 WebUI:用户通过开放式 WebUI 中托管的直观聊天界面与系统交互。该界面充当提交查询(例如“获取与我的项目笔记相关的最新新闻文章”)和查看输出的主要入口。
基于 Python 的智能体(AG2 框架):系统的核心是使用 AutoGen (AG2) 构建的基于 Python 的智能体。该智能体通过分解任务并动态调用工具执行各个步骤来协调工作流程。
智能体可以访问两个主要工具:
文档搜索工具:从包含上传的项目说明或以嵌入形式存储的文档的矢量数据库中获取相关信息。此矢量搜索充分利用 Open WebUI 内的内置文档检索 API,而不是设置完全独立的数据存储。
网络搜索工具:执行基于网络的搜索以收集外部知识和实时信息。在本例中,我们使用 SearXNG 作为我们的元搜索引擎。
Ollama:IBM Granite 3.2 LLM 充当为系统提供支持的语言模型。它通过 Ollama 本地托管,确保推理速度快、成本高效并保障数据隐私。如果您希望使用更大模型运行此项目,建议通过 IBM watsonx.ai或 OpenAI 等方式访问 API。不过,这种方法需要 watsonx.ai 或 OpenAI API 密钥。在本教程中,我们改为使用本地托管的 Ollama。
可以在 IBM Granite Community GitHub 上查看详细的设置说明以及整个项目。可以在 GitHub 上找到 Jupyter Notebook 版本的教程。
以下步骤提供了 Granite 检索智能体的快速设置。
安装 Ollama 非常简单,只需从 Ollama 官方网站下载客户端即可。安装 Ollama 后,运行以下命令以提取 Granite 3.2 LLM。
您现在已启动并运行 Ollama 和 Granite。
AutoGen Studio 是用于构建智能体式工作流的一个低代码解决方案。但是,自己构建一个简单的智能体可以帮助我们更好地理解这个完整的多智能体 RAG 项目的设置。要继续,请在首选集成开发环境 (IDE) 中设置 Jupyter Notebook,并通过在终端中运行以下命令激活虚拟环境。
python3.11 -m venv venv
source venv/bin/activate
构建这个简单智能体,我们需要一些库和模块。确保安装并导入以下内容。
!pip install -qU langchain chromadb tf-keras pyautogen "ag2[ollama]" sentence_transformers
import getpass
from autogen.agentchat.contrib.retrieve_assistant_agent import AssistantAgent
from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent
需要在本地设置几个配置参数,以调用我们通过 Ollama 获取的正确大语言模型 (LLM)。
ollama_llm_config = {
"config_list": [
{
"model": "granite3.2:8b",
"api_type": "ollama",
}
],
}
我们可以将这些配置参数传递给 AssistantAgent 类的 llm_config 参数,从而实例化我们的第一个 AI 智能体。
assistant = AssistantAgent(
name="assistant",
system_message="You are a helpful assistant.",
llm_config=ollama_llm_config,
)
该智能体使用 Granite 3.2 对 ragproxyagent 智能体返回的信息进行综合处理。我们向 RAG 智能体提供作为附加上下文的文档是原始 README Markdown 文件,可以在 GitHub 的 AutoGen 存储库中找到。此外,我们可以传递特定于检索智能体的新配置字典。一些您可能会觉得有用的额外键包括 vector_db、chunk_token_size 和 embedding_model。
有关配置密钥的完整列表,请参阅官方文档。
ragproxyagent = RetrieveUserProxyAgent(
name="ragproxyagent",
max_consecutive_auto_reply=3,
is_termination_msg=lambda msg: msg.get("content") is not None or "TERMINATE" in msg["content"],
system_message = "Context retrieval assistant.",
retrieve_config={
"task": "qa",
"docs_path": "https://raw.githubusercontent.com/microsoft/autogen/main/README.md",
"get_or_create": True,
"collection_name": "autogen_docs",
"overwrite": True
},
code_execution_config=False,
human_input_mode="NEVER",
)
现在,我们可以与 RAG 智能体发起对话,提出与所提供文档作为上下文相关的问题。
qs = "What languages does AutoGen support?"
result = ragproxyagent.initiate_chat(
assistant, message=ragproxyagent.message_generator, problem=qs
)
print(result)
请注意,为了简洁,README 文件的 Markdown 内容已从输出中删除。
输出:
Trying to create collection.
2025-07-21 12:20:36,125 - autogen.agentchat.contrib.retrieve_user_proxy_agent - INFO - Found 1 chunks.
2025-07-21 12:20:36,129 - autogen.agentchat.contrib.vectordb.chromadb - INFO - No content embedding is provided. Will use the VectorDB's embedding function to generate the content embedding.
VectorDB returns doc_ids: [['8e9131c7']]
Adding content of doc 8e9131c7 to context.
ragproxyagent (to assistant):
You're a retrieve augmented chatbot. You answer user's questions based on your own knowledge and the context provided by the user.
If you can't answer the question with or without the current context, you should reply exactly `UPDATE CONTEXT`.
You must give as short an answer as possible.
User's question is: What languages does AutoGen support?
Context is:
[REDACTED]
assistant (to ragproxyagent):
提供的文本似乎是 AutoGen 项目的 README 文件,该项目是 Microsoft 的一个开源计划。其内容摘要如下:
README 还包括一个表格,总结了每种受支持语言(C# 和 Python)及其各自的包管理器(NuGet 和 PyPI)的可用包。这使开发人员可以轻松快速地识别必要的组件,以便以他们喜欢的语言开始使用 AutoGen。
>>>>>>>> 终止运行 (601a53dc-8a5d-4e19-8503-1517fe3c7634):满足智能体 ragproxyagent 的终止消息条件
太棒了!我们的助手智能体和 RAG 智能体成功地综合了额外的上下文信息,从而正确地回答了用户查询,即 AutoGen 当前支持的编程语言。您可以把这看作是智能体之间交换信息的群聊。这个示例是使用 AutoGen 在本地实现智能体式 RAG 的简单演示。
现在,让我们继续构建一个更高级的智能体式 RAG 系统。在终端中,安装并运行 Open WebUI。
pip install open-webui
open-webui serve
对于网络搜索,我们将充分利用 Open WebUI 中内置的网络搜索能力。
Open WebUI 支持多个搜索提供商。总体而言,您可以选择使用第三方应用程序接口 (API) 服务,这需要获取 API 密钥,或者在本地搭建一个 SearXNG Docker 容器。无论哪种情况,都需要在 Open WebUI 控制台中配置您的搜索提供商。
在 Open WebUI 控制台中,这一配置(指向 SearXNG 或输入您的 API 密钥)位于管理面板 > 设置 > 网络搜索下。
有关更详细的说明,请参阅 Open WebUI 文档中的说明。
1. 在浏览器中转到 http://localhost:8080/ 以访问 Open Web 用户界面。首次打开 Open WebUI 界面时,请注册用户名和密码。这些信息完全保存在您机器的本地。
2. 登录后,点击左下角显示用户名的图标。从菜单中单击管理面板。
3. 在 功能 (Functions) 选项卡中,点击 + 添加新功能。
4. 为该功能命名,例如“Granite RAG Agent”,并添加描述,两者均为
5. 将 granite_autogen_rag.py Python 脚本粘贴到提供的文本框中,替换所有现有内容。
6. 在屏幕底部点击保存 (Save)。
7. 返回功能 (Functions) 页面,确保该智能体已切换为启用 (Enabled) 状态。
8. 点击启用切换开关旁的齿轮图标,自定义设置,例如推理端点、SearXNG 端点或模型 ID。
现在,全新的 AutoGen 智能体会以模型形式显示在 Open WebUI 界面中。您可以选中它,并向其提供用户查询。
1.在 Open WebUI 中,导航至 工作区 (Workspace) > 知识 (Knowledge)。 2. 点击 + 创建新集合。 3. 上传文档,供 Granite 检索智能体查询。
要设置搜索提供商(例如 SearXNG),请参阅此指南。
配置参数如下:
| 参数 | 说明 | 默认值 |
|---|---|---|
| task_model_id | 任务执行的主要模式 | granite3.2:8b |
| vision_model_id | 用于图像分析的视觉模型 | granite-vision3.2:2b |
| openai_api_url | 用于 OpenAI 风格模型调用的 API 端点 | http://localhost:11434 |
| openai_api_key | 用于身份验证的 API 密钥 | ollama |
| vision_api_url | 视觉相关任务端点 | http://localhost:11434 |
| model_temperature | 控制响应随机性 | 0 |
| max_plan_steps | 智能体规划的最大步骤数 | 6 |
注意:在添加功能后,可以通过 Open WebUI 管理面板的“功能”(Functions) 部分的齿轮图标配置这些参数。### 第 8 步:查询智能体式系统 Granite 检索智能体通过查询本地文档和网络资源,执行多智能体任务规划并实施自适应执行,从而实现基于 AG2 的 RAG。启动对话,并向您的智能体式系统提供与所提供文档相关的查询,以观察 RAG 链的实际运行。
多智能体设置可以充分利用中等规模的开源模型(如 Granite 3.2)来创建实用、可用的工具。该智能体式 RAG 架构使用完全开源的工具构建,可作为设计和定制问答智能体及 AI 算法的起点。它也可以开箱即用,适用于各种使用场景。在本教程中,您有机会深入了解简单与复杂的智能体式系统,并利用 AutoGen 的功能。使用 Ollama 调用 Granite LLM,从而可以对这些系统进行完全本地探索。作为后续步骤,请考虑将更多自定义工具集成到您的智能体式系统中。
借助 IBM 业界领先的人工智能专业知识和解决方案组合,让人工智能在您的业务中发挥作用。
通过增加 AI 重塑关键工作流程和运营,最大限度提升体验、实时决策和商业价值。
[1] Wu, Qingyun, et al. “AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation Framework.” GitHub, 2023, github.com/microsoft/autogen.