主流的AI Agent框架:

  • LangChain: 全能型框架,管道式编排与丰富生态;
  • nanobot: 轻量级全能选手,工具调用与代码解释器;
  • LlamaIndex: 数据驱动的 RAG 专家;
  • AutoGen: 多智能体协作的;

Agent框架对比

维度LangChainLlamaIndexAutoGen
核心定位全能型框架RAG 数据接口多Agent协作
工具注册@tool 装饰器FunctionTool 类@register 装饰器
RAG 支持需集成 VectorStore专业级向量索引需自行集成
多AgentLangGraph 支持需自行编排原生GroupChat
代码执行需集成需集成UserProxyAgent
记忆管理RunnableWithMessageHistoryAgent chat()GroupChat 自动
学习曲线中等中等中等
生态完整度最丰富RAG 社区微软生态

根据业务场景,选择Agent框架:

  • 选 LangChain: 如果你要开发通用的 AI 应用,需要灵活控制流程,或者需要切换多种模型。
  • 选 LlamaIndex: 如果你主要做 RAG(企业知识库),手里有一堆 PDF/Word/Excel 要处理。
  • 选 AutoGen: 如果任务太复杂,一个人(Agent)干不完,需要团队(多角色)吵架/协作才能出结果。

场景 1:企业知识库问答
推荐:LlamaIndex

  • 专业的文档处理能力;
  • 多种检索策略(向量、关键词、混合);
  • 索引持久化,支持增量更新;

场景 2:快速 Demo / POC

推荐:Qwen-Agent/Nanobot

  • 配置最简单;
  • 内置 WebUI,无需前端开发;
  • 开箱即用的工具(code_interpreter);

场景 3:复杂业务流程
推荐:LangChain/LangGraph

  • LCEL 支持灵活的流程编排;
  • 丰富的组件生态;
  • 可与其他框架组合使用;

场景 4:多人协作
推荐:AutoGen

  • 多智能体协同对话;
  • 支持角色自定义与任务分工;
  • 内置群聊管理与执行控制;

AI Agent框架解决的问题

AI Agent框架,解决的核心问题:

  • LLM适配层,可以进行统一调度(头脑);
  • 工具注册与调度(双手);
  • Context管理(记忆、上下文、RAG);
  • 控制流编排(中枢);

LLM主动解决各自问题,就需要设计一个机制,抽象出来共性的东西。

大脑的适配层:LLM 统一接口与 Prompt 管理

大脑的适配层: LLM 统一接口与 Prompt 管理。

Model Adapter (适配器模式): 抹平不同模型 (OpenAI, DeepSeek, Qwen) 的 API 差异,各框架的实现方式:

from langchain_community.chat_models
import ChatTongyi

llm = ChatTongyi(
	model_name="deepseek-v3",
	dashscope_api_key=api_key
)
from llama_index.llms.dashscope import DashScope

llm = DashScope(
	model="deepseek-v3",
	api_key=api_key,
	temperature=0.7
)

框架层做了一个中间层,把统一的指令(如 invoke(“你好”))翻译成特定模型的 API 调用。
LLM 统一接口的作用:

  • 统一调用方式;
  • 统一了参数配置(如 temperature);
  • 输出格式(统一转为 Message 对象);
框架LLM 封装方式特点
LangChainChatTongyi / ChatOpenAI 类丰富的模型适配器,统一接口
LlamaIndexDashScope / OpenAI 类与 Settings 全局配置结合

Prompt Engineering 工程化
System Message 的动态注入,将人设与上下文解耦:

# LangChain 的 PromptTemplate
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages([
	("system", "You are a helpful assistant."),
	MessagesPlaceholder(variable_name="history"),
	("human", "{input}")
])
# Qwen-Agent 的 system_message
system_instruction = '''你是一个乐于助人的AI助手。在收到用户的请求后,你应该:
- 首先绘制一幅图像,得到图像的url,
- 然后运行代码下载该图像。
你总是用中文回复用户。'''

人设 (角色定义) 与任务流程 (上下文指令) 分离,便于复用和维护。

双手的标准化:工具注册与调度 (Tool Registry)

各框架提供了不同的工具注册方式:

模式框架特点
@tool 装饰器LangChain最简洁,docstring 自动解析
@register_tool + 类Qwen-Agent显式参数定义,结构清晰
FunctionTool 封装LlamaIndex强类型约束,适合复杂工具

LLM的调度也叫做LLM自我问答:
System Prompt + Tool Prompt(工具自我问答的模板)
工具通过@tool、@register_tool 或FunctionTool把工具的相关信息(name、param、description)给到Tool Prompt。

比如:以下是我可以使用的工具,包括
1)tool_name = 天气预告,描述:tool_description,参数tool_params;
2)tool_name = 地图导航,描述:tool_description,参数tool_params;

如果我想要调用工具,我将返回以下格式:
{
“tool_name”:“”,
“tool_params”:{}
}

====
LLM response =
{
“tool_name”:“get_weather”,
“tool_params”:{“city”:“beijing”}
}

下一步,在agent框架中,进行识别拦截
tool_name == get_weather的方法名,tool_params方法的参数{“city”:“beijing”}
在SDK内找到后,调用脚本get_weather方法的代码。

三大框架工具注册对比

LangChain @tool 的优势: 自动从 docstring 解析工具描述和参数说明,支持类型注解,LLM 自动理解参数类型,一行装饰器,零配置即可使用。

# ========== LangChain @tool 装饰器 ==========
from langchain_core.tools import tool

@tool
def ping_tool(target: str) -> str:
"""检查本机到指定主机名或IP地址的网络连通性。
参数:target: 目标主机名或IP地址
返回:模拟的ping结果
"""

if "unreachable" in target:
	return f"Ping {target} 失败"
return f"Ping {target} 成功"
# ========== Qwen-Agent @register_tool ==========
@register_tool('my_image_gen')
class MyImageGen(BaseTool):
	description = 'AI 绘画服务,输入文本描述,返回图像 URL'
	parameters = [{
		'name': 'prompt',
		'type': 'string',
		'description': '期望的图像内容的详细描述',
		'required': True
	}]

def call(self, params: str, kwargs) -> str:
	prompt = json5.loads(params)['prompt']
	return json5.dumps({'image_url': f'https://...'})
# ========== LlamaIndex FunctionTool ==========
def retrieve_documents(query: str) -> str:
	"""从文档中检索相关信息"""
	response = query_engine.query(query)
	return str(response)

retrieve_tool = FunctionTool.from_defaults(fn=retrieve_documents)

LLM 是如何看见工具的?
框架会将 Python 函数的 name、docstring (功能描述) 和 type hints (参数类型) 转换成 JSON Schema 喂给 LLM 。

LangChain: 也就是 @tool,主要是在使用 Python 原生特性,最符合直觉 。
Qwen-Agent: @register_tool,使用显式定义,强约束,适合复杂参数 。

记忆的存储:Context 管理机制

记忆系统的架构:
1)短期记忆 (Window)

  • 对话历史截断;
  • 滑动窗口策略;
  • 避免 Token 爆炸;

2)长期记忆 (RAG)

  • VectorStoreIndex 向量索引;
  • 文档分块与 Embedding;
  • 相似度检索;

三大框架记忆管理对比

# LangChain 短期记忆 (RunnableWithMessageHistory)
from langchain_core.chat_history import InMemoryChatMessageHistory

from langchain_core.runnables.history import RunnableWithMessageHistory

# 会话存储
store = {}

def get_session_history(session_id: str):
	if session_id not in store:
		store[session_id] = InMemoryChatMessageHistory()
	return store[session_id]

# 创建带记忆的对话链
conversation = RunnableWithMessageHistory(
	chain,
	get_session_history,
	input_messages_key="input",
	history_messages_key="history"
)

# 使用时指定 session_id
config = {"configurable": {"session_id": "user_123"}}
output = conversation.invoke({"input": "Hi!"}, config=config)

session_id 机制支持多用户并发会话;
MessagesPlaceholder 自动注入历史到 Prompt。

# === Qwen-Agent 短期记忆 (messages 列表) ===
messages = [] # 对话历史
messages.append({'role': 'user', 'content': query})

for response in bot.run(messages=messages):
	pass
messages.extend(response) # 追加响应
# ==== LlamaIndex 长期记忆 (VectorStoreIndex) ====
index = VectorStoreIndex.from_documents(documents)
# 持久化
index.storage_context.persist(persist_dir="./storage")
框架短期记忆长期记忆
LangChainRunnableWithMessageHistory + session_id需集成 VectorStore
Qwen-Agentmessages 列表手动管理files 参数加载文档
LlamaIndexAgent chat() 内置专业级 VectorStoreIndex

为什么需要进行Context管理?
LLM 是无状态的,它记不住你说过什么,且 Context Window(上下文窗口)是昂贵的资源。 => 有限注意力的管理。

短期记忆:

  • Session ID 很重要,它是多用户并发的基础 。
  • 滑动窗口策略——只保留最近 N 轮,防止 Token 爆炸。

长期记忆:

  • 这是 RAG 的范畴,利用向量数据库进行相关性检索,而非时间顺序回忆 。

中枢的编排:控制流设计 (Orchestration)

复杂的任务不能靠 LLM 一口气说完,需要拆解步骤。

模式说明适用场景
管道模式 (Pipeline)LangChain 的 prompt | llm | parser 链式调用线性处理流程
单人模式 (Loop)经典 ReAct 循环:思考 -> 行动 -> 观察单 Agent 完成任务
多人模式 (DAG)接力赛:明确的执行顺序流程化任务 (如投资决策)
多人模式 (Chat)圆桌会议:自由讨论开放式协作

LangChain LCEL (LangChain Expression Language) 特点:

  • | 管道符:直观的链式调用,类似 Unix 管道;
  • invoke():统一的调用接口;
  • 支持流式输出、批处理、异步调用;

LangChain 管道模式:Prompt => LLM => Parser

# ========== LangChain 管道式编排 (LCEL),管道语法: prompt | llm ==========
from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate(
	input_variables=["product"],
	template="What is a good name for a company that
	makes {product}?",
)

# 使用管道符组合
chain = prompt | llm
# invoke 调用
result = chain.invoke({"product": "colorful socks"})

ReAct 循环 (Agent模式):
Thought思考
=> Action行动
=> Observation 观察
=> Thought思考

# ========== Agent 模式: create_agent ==========
from langchain.agents import create_agent

# 定义工具
tools = [ping_tool, dns_tool, calculator]

# 创建 Agent (LangChain 1.x 新写法)
agent = create_agent(llm, tools)

# 使用 messages 格式调用
result = agent.invoke({"messages": [("user", "检查www.example.com 的连通性")]})
print(result["messages"][-1].content)

控制流的编排:

  • Chain (链式):由于输入确定,输出确定,像工厂流水线(Pipeline)。
  • Loop (循环):即 ReAct 模式(思考-行动-观察-思考),像一个不断试错的实验员,直到任务完成 。
  • DAG (有向无环图):像多人接力赛,有明确的前后依赖关系。

LangChain 全能型LLM应用框架

大家对Langchain感兴趣,可以去看下我之前写的文章 LangChain=AI瑞士军刀?零基础小白秒变多任务高手!

LangChain 全能型LLM应用框架,丰富的生态和组件,适合各种复杂场景。

LangChain 的核心优势:

  • 生态丰富:支持 100+ 模型、50+ 向量数据库、大量预置工具;
  • LCEL 管道语法:直观的链式调用,支持流式/批处理/异步;
  • @tool 装饰器:最简洁的工具注册方式;
  • 完善的记忆管理:session_id 机制支持多用户并发;
场景说明
工具调用型 Agent网络诊断、数据查询、API 调用等需要多工具协作的场景
多轮对话系统客服机器人、智能助手等需要记忆上下文的场景
复杂流程编排使用 LCEL 构建多步骤处理流程
快速原型开发丰富的组件库,快速搭建 POC

核心特性:LCEL 管道语法

LangChain Expression Language (LCEL) 是 LangChain 1.x 的核心创新,使用 | 管道符连接组件。

在这里插入图片描述

LangChain 采用组件化的方式,核心优势是把 Prompt、Model、Memory、Retriever 都做成了标准积木(Runnable)。

基础管道示例

from langchain_core.prompts import PromptTemplate
from langchain_community.llms import Tongyi

# 加载模型
llm = Tongyi(model_name="qwen-turbo", dashscope_api_key=api_key)

# 创建 Prompt Template
prompt = PromptTemplate(
	input_variables=["product"],
	template="What is a good name for a company that makes {product}?",
)

# 管道语法组合
chain = prompt | llm

# invoke 调用
result = chain.invoke({"product": "colorful socks"})
print(result)

工具注册:@tool 装饰器

LangChain 的 @tool 装饰器是最简洁的工具注册方式,自动从 docstring 解析工具描述:

from langchain_core.tools import tool

@tool
def ping_tool(target: str) -> str:

	"""检查本机到指定主机名或IP地址的网络连通性。
	参数: target: 目标主机名或IP地址
	返回: 模拟的ping结果
	"""

if "unreachable" in target:
	return f"Ping {target} 失败:请求超时。"
return f"Ping {target} 成功:延迟 20ms。"

@tool
def dns_tool(hostname: str) -> str:
	"""解析给定的主机名,获取其对应的IP地址。
	参数: hostname: 要解析的主机名
	返回: 模拟的DNS解析结果
	"""

if hostname == "www.example.com":
	return f"DNS 解析 {hostname} 成功:IP 地址是 93.184.216.34"
return f"DNS 解析 {hostname} 失败:找不到主机。"

创建 Agent

# LangChain 1.x Agent 创建方式
from langchain.agents import create_agent
from langchain_community.chat_models import ChatTongyi

# 加载模型 (使用 ChatModel 以支持 tool calling)
llm = ChatTongyi(model_name="deepseek-v3", dashscope_api_key=api_key)

# 定义工具列表
tools = [ping_tool, dns_tool, calculator]

# 创建 Agent (LangChain 1.x 新写法)
agent = create_agent(llm, tools)

# 使用 messages 格式调用
result = agent.invoke({"messages": [("user", "我无法访问 w帮我诊断一下")]})

# 获取最终回复
print(result["messages"][-1].content)

带记忆的对话链

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

from langchain_core.chat_history import InMemoryChatMessageHistory

from langchain_core.runnables.history import RunnableWithMessageHistory

# 创建带历史记录的 prompt
prompt = ChatPromptTemplate.from_messages([
	("system", "You are a helpful assistant."),
	MessagesPlaceholder(variable_name="history"),
	("human", "{input}")
])

# 创建 chain
chain = prompt | llm
store = {} # 会话存储

def get_session_history(session_id: str):
	if session_id not in store:
		store[session_id] = InMemoryChatMessageHistory()
	return store[session_id]

# 创建带记忆的对话链
conversation = RunnableWithMessageHistory(
	chain,
	get_session_history,
	input_messages_key="input",
	history_messages_key="history"
)

# 使用时指定 session_id
config = {"configurable": {"session_id": "user_123"}}
output = conversation.invoke({"input": "Hi there!"}, config=config)
print(output.content)

LlamaIndex - 数据驱动的RAG 专家

LlamaIndex:为 LLM 装上私有数据的最强接口,如果不涉及复杂的多人协作,只是想基于文档问答,它是首选。

LlamaIndex 的核心优势:

  • 一站式文档处理:加载、分块、向量化、索引、检索;
  • 索引持久化:避免重复创建,快速启动;
  • 多种检索策略:向量检索、关键词检索、混合检索;
  • 与 Agent 无缝集成:FunctionTool 封装查询引擎;
场景说明
企业知识库内部文档、FAQ、操作手册的智能问答
合同审查助手基于合同文档的条款检索与解读
学术论文分析论文摘要、引用关系、知识图谱构建
客服机器人产品手册、服务政策的实时检索回答

核心概念:Index优先

Index-First 哲学:
不同于 LangChain 关注流程,LlamaIndex 关注数据结构。
它认为 LLM 应用的核心瓶颈在于如何让 LLM 索引私有数据。

在这里插入图片描述

加载文档并创建索引

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

# 读取文档目录
reader = SimpleDirectoryReader('./docs')
documents = reader.load_data()
print(f"加载了 {len(documents)} 个文档")

# 创建向量索引
index = VectorStoreIndex.from_documents(documents)

# 持久化索引 (避免重复创建)
index.storage_context.persist(persist_dir="./storage")

从存储加载索引

from llama_index.core import StorageContext, load_index_from_storage

# 检查索引是否已存在
persist_dir = "./storage"

if os.path.exists(persist_dir):
	# 从存储中加载索引 (快速启动)
	storage_context = StorageContext.from_defaults(persist_dir=persist_dir)
	index = load_index_from_storage(storage_context)
	print("从存储加载索引成功")	
else:
	# 创建新索引
	index = VectorStoreIndex.from_documents(documents)

ReAct Agent 与工具集成

将 retrieve_tool 作为一个函数插拔到 Agent 上:

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool

# 创建查询引擎
query_engine = index.as_query_engine(similarity_top_k=5)

# 定义检索工具
def retrieve_documents(query: str) -> str:
	"""从文档中检索相关信息"""
	response = query_engine.query(query)

	return str(response)

# 封装为 FunctionTool
retrieve_tool = FunctionTool.from_defaults(fn=retrieve_documents)

# 创建 ReAct Agent
agent = ReActAgent.from_tools(
	tools=[retrieve_tool],
	llm=llm,
	verbose=True, # 显示思考过程
	system_prompt="你是一个乐于助人的AI助手,可以从文档中检索信息",
)

AutoGen 多智能体框架

AutoGen 是微软开源的多智能体对话框架,用于构建多个 AI Agent 协作完成复杂任务。
它的核心理念是让 Agent 之间通过自然语言对话来协作,而非硬编码的函数调用。

你也可以使用 Agent Framework 2025 年 10 月起,微软将 AutoGen 置为维护模式——仅修漏洞,不再新增功能;所有新特性都做到 Agent Framework 上。
官方文档明确把 Agent Framework 称为下一代 Semantic Kernel 与 AutoGen,鼓励新项目直接迁移。

Agent 是 AutoGen 的基本单元,每个 Agent 具备以下属性:

属性说明
nameAgent 的名称标识,在对话中用于区分发言者
system_message角色设定/提示词,定义 Agent 的职责和行为方式
llm_configLLM 配置,包括模型、API Key、温度等参数
tools可调用的外部工具函数,扩展 Agent 能力

常用 Agent 类型

类型用途特点
ConversableAgent基础对话 Agent最灵活,可完全自定义
AssistantAgent助手 Agent默认由 LLM 驱动,适合生成内容
UserProxyAgent用户代理可执行代码、调用工具、请求人工输入

项目中使用 ConversableAgent 创建了 4 个角色,区别在于是否注册工具函数。

GroupChat (群聊): 将多个 Agent 放在同一个对话中协作的容器。

在这里插入图片描述

from autogen import GroupChat, GroupChatManager

# 创建群聊,设定发言顺序
group_chat = GroupChat(
	agents=[
		# 1. 数据员先获取数据
		self.data_agent, 
		# 2. 分析师进行分析
		self.analyst_agent, 
		# 3. 风控官评估风险
		self.risk_agent, 
		# 4. 交易员给出建议
		self.trader_agent
],

messages=[],
# 4个Agent各发言1-2次
max_round=8, 
# 按顺序轮流发言
speaker_selection_method="round_robin",
)

# 创建群聊管理器
manager = GroupChatManager(
	groupchat=group_chat,
	llm_config=self.data_agent.llm_config,
)

# 发起对话
result = self.data_agent.initiate_chat(
	manager,
	message="用户查询: 分析一下宁德时代能不能买",
)

对话流程:
1)用户发起查询;
2)GroupChatManager 根据策略选择第一个发言的 Agent;
3)被选中的 Agent 生成回复(可能调用工具);
4)回复加入对话历史,所有 Agent 可见;
5)GroupChatManager 选择下一个发言者;
6)重复 3-5,直到达到 max_round 或满足终止条件;

在这里插入图片描述

发言者选择策略

策略说明适用场景
round_robin按 agents 列表顺序轮流发言流程明确的任务(如:数据→分析→风控→决策)
random随机选择下一个发言者头脑风暴、创意讨论
auto由 LLM 判断谁最适合回答当前问题开放式讨论、问答场景
自定义函数完全控制选择逻辑复杂业务流程、条件分支
如果你的任务有明确的执行顺序,用 round_robin;如果需要灵活讨论,用 auto。
投资委员会使用 round_robin 是因为投资决策有固定流程:先获取数据 → 再分析 → 再风控 → 最后决策。

案例:多文件智能问答Agent

搭建一个 保险产品智能问答Agent,用于帮助用户快速了解各类保险产品的详细信息。
加载了多个保险产品文档,包括:

  • 雇主责任险;
  • 平安商业综合责任保险;
  • 企业团体综合意外险;
  • 财产一切险;
  • 施工保、装修保等;

用户可以通过自然语言提问,系统会从文档中检索相关信息并给出回答。

源码仓库:liulvuchen/Llamaindex-agent-RAG

技术方案:RAG (检索增强生成)
RAG 的核心流程:
用户问题 → 向量检索 → 召回相关文档 → LLM 生成回答

使用RAG的原因:

  • LLM 没有私有数据的知识;
  • 避免模型幻觉(编造信息);
  • 回答可追溯到具体文档来源;

DeepAgents 实现

  • 配置极简,上手迅速;
  • 专属界面,便捷交互;
  • 内置沙箱,支撑编码;
  • 多模文件,直接解析;

LlamaIndex 实现

  • Index 优先:专注于数据索引和检索;
  • 一站式 RAG:文档加载、分块、索引、检索一体化;
  • ReAct Agent:内置思考-行动循环;

数据清洗

prompt:

  1. 你先扫码下 @docs 内的.pdf文件,我建议使用PyPDF2库提取@docs 内.pdf文件,生成对应的markdown文件,给我3个方案,并且给出置信度;
  2. 补充,平安商业综合责任保险(亚马逊).pdf没办法通过PyPDF2提取文本,需要使用ocr,单独为这个文件给个方案,能进行文本提取;
  3. 文字 PDF:我选方案三;亚马逊 PDF:固定本独立 OCR 方案(PaddleOCR);输出统一建议:docs/ * .md;requirements.txt 增加:PyPDF2、paddleocr(及所需 paddle 依赖)。按照我给的方案更新todos;

在这里插入图片描述

Agent方案设计

prompt:

  1. 我要搭建一个 保险产品智能问答Agent,用于帮助用户快速了解各类保险产品的详细信息。
    加载了@docs/md 文件夹内所有的.md文件(保险产品文档),包括:
  • 雇主责任险;
  • 平安商业综合责任保险;
  • 企业团体综合意外险;
  • 财产一切险;
  • 施工保、装修保等;
    用户可以通过自然语言提问,系统会从文档中检索相关信息并给出回答。
  1. 技术方案:
    agent框架使用deepagents,RAG使用llama_index,向量检索使用faiss-cpu,向量库使用ChromaDB,
    embedding嵌入模型使用AGICTO平台的text-embedding-v4模型,可以直接参考@at/DEV_AGI进行LLM请求.py,切片策略使用LLM语义切片,
    本地进行数据持久化:保存Faiss索引文件(.faiss)、元数据信息(.pkl)、页码映射关系(page_info.pkl),向量相关文件都放到@rag_data 文件夹内。
    其他的向量逻辑,你可以参考@cankao/langchain-agent-multi-files.py,进行优化,参考文件内涉及用户query改写(利用上下文信息,把用户query不同query类型进行改写:上下文依赖性型、对比型、模糊指代型、多意图型、反问型、条件型),query改写的LLM模型可以使用qwen3.5-35b-a3b模型,LLM调用你可以参考@at/DEV_AGI进行LLM请求.py。
    Llamindex相关的,你可以参考@cankao/llamaindex-agent-multi-files.py 进行优化。
    agent使用deepagents框架AGICTO平台的qwen3.7-plus模型,LLM调用你可以参考@at/DEV_AGI进行LLM请求.py,剩下的你可以参考@cankao/qwen-agent-multi-files.py 进行优化agent业务。

你帮我设计3套方案,并且给出置信度。

在这里插入图片描述

页面展示:
[[Pasted image 20260804104251.png]]

更多推荐