一.ReAct讲解
1.ReAct基本介绍
React 全称是 SynergizingReasoning and Actingin Language Models(在语言模型中协同推理与行动),由Shunyu Yao等人在2022 年 10 月的论文中提出,React 的设计灵感来源于人类解决复杂问题的思维方式:通常会先思考问题、制定计划,然后执行具体操作,并根据结果调整下一步的思考
ReAct 是一个将推理和行为 与LLMs相结合通用的范例,ReAct 提示 LLMs 为任务生成口头推理轨迹和操作,这使得系统执行动态推理来创建、维护和调整操作计划,同时还支持与外部环境(例如,Wikipedia)的交互 ,以将额外信息合并到推理中,下图展示了 ReAct 的一个示例以及执行问题回答所涉及的不同步骤

简单来说,ReAct 框架赋予了模型一种"三思而后行"的能力,它的目的是: 像人一样解决复杂问题, 它将模型的响应过程分解为三个关键部分:
Thought (思考):模型首先会分析当前的任务和已有的信息 ,进行内在的推理和规划,它会思考"我需要做什么?"、"我缺少什么信息?"、"下一步该怎么办?"
Act (行动): 根据**"思考"的结果,** 模型会决定并执行一个具体的"行动",这个行动通常是向外部工具(如搜索引擎、数据库、计算器,甚至是你代码中的"知识库")发起查询 ,以获取完成任务所需的额外信息
Observation (观察): 模型接收并**"观察"执行"行动"后返回的结果**,这个结果会成为下一步"思考"的新依据
这个 思考 -> 行动 -> 观察 的循环会一直持续,直到模型认为自己已经收集到了足够的信息,能够完美地回答用户的问题为止
特点:动态:适合需要查询的场景
灵活:逐步调整
2.ReAct案例
案例: 基于 ReAct实现的智能对话系统,主要功能是回答关于节假日的问题法
处理流程:当用户问:"这个月有几个法定节假日?"
系统会:
- 思考:需要先知道当前月份
- 行动:调用
get_current_date获取当前日期- 观察:得到"2026年07月15日"
- 思考:现在查询6月的节假日
- 行动:调用
search_holidays("07月")- 观察:得到"2026年07月没有法定节假日"
- 最终回答:给出完整答案
3.ReAct实现流程
1.导入模块 :导入必要的库:大模型API、时间、日期、系统操作
2.定义工具函数 :
get_current_date()- 获取当前日期search_holidays()- 查询节假日- 注册工具到字典中供模型调用
3. 大模型交互
ChatOllama()- 调用Ollama的通义千问模型获取回答4.解析模型输出
parse_model_output()- 解析模型的结构化响应extract_month()- 从文本提取月份信息5. 核心逻辑
react_solve()- ReAct主循环,控制整个推理流程- 5步迭代:构建上下文→调用模型→解析→执行工具→记录结果
6. 执行入口
- 主程序启动,传入问题开始推理
4.代码实现
python
import time
from datetime import datetime
import os
from langchain_ollama import ChatOllama
# 工具1:获取当前日期(返回格式:YYYY年MM月DD日)
def get_current_date():
"""返回当前日期,格式:2026年07月15日"""
now = datetime.now()
return f"{now.year}年{now.month}月{now.day}日"
# 工具2:查询节假日(根据月份查询)
def search_holidays(month):
"""
查询指定月份的法定节假日
month: 月份字符串,如 "7月"
"""
# 模拟节假日数据
holidays = {
"1月": ["元旦:1月1日"],
"2月": ["春节:1月28日-2月3日"],
"3月": [],
"4月": ["清明节:4月4日-6日"],
"5月": ["劳动节:5月1日-5日", "端午节:5月31日-6月2日"],
"6月": [],
"7月": [],# 2026年7月没有法定节假日
"8月": [],
"9月": [],
"10月": ["中秋节:10月6日-8日", "国庆节:10月1日-7日"],
"11月": [],
"12月": ["元旦:12月31日"]
}
# 获取指定月份的节假日
holidays_list = holidays.get(month, [])
if holidays_list:
return f"2026年{month}有以下法定节假日:\n" + "\n".join(holidays_list)
else:
return f"2026年{month}没有法定节假日。"
# 工具注册
TOOLS = {
"get_current_date": get_current_date,
"search_holidays": search_holidays
}
# 调用Qwen模型
model = ChatOllama(model="qwen2.5:7b")
# 解析模型输出
def parse_model_output(output):
"""
解析模型输出,提取 Thought, Action, Action Input
不使用正则表达式,使用简单的字符串处理
"""
# 处理 AIMessage 对象,提取实际内容
if hasattr(output, 'content'):
content = str(output.content)
else:
content = str(output)
thought = ""
action = ""
action_input = ""
lines = content.split('\n')
for line in lines:
line = line.strip()
if line.startswith('Thought:'):
thought = line.replace('Thought:', '').strip()
elif line.startswith('Action:'):
action = line.replace('Action:', '').strip()
elif line.startswith('Action Input:'):
action_input = line.replace('Action Input:', '').strip()
return thought, action, action_input
# 从输入中提取月份信息
def extract_month(text):
"""
从文本中提取月份信息,如 "7月"
"""
# 检查常见的月份表示方式
months = ["1月", "2月", "3月", "4月", "5月", "6月",
"7月", "8月", "9月", "10月", "11月", "12月"]
for month in months:
if month in text:
return month
# 如果没有找到明确的月份,返回当前月份
current_month = datetime.now().month
return f"{current_month}月"
# ReAct主循环
def react_solve(question):
print(f"问题:{question}\n")
steps = [] # 用来存储每一步的输出
max_iterations = 5
print("开始ReAct推理流程...\n")
for i in range(max_iterations):
# 构建上下文(包含之前的所有步骤)
context = "\n".join(steps)
prompt = f"""
你是一个使用ReAct范式的智能代理,必须严格按以下格式输出:
Thought: <你的思考>
Action: <要执行的动作,从 [{', '.join(TOOLS.keys())}] 中选择,或 Final Answer>
Action Input: <动作输入>
当前上下文:
{context}
问题:{question}
"""
# 调用Qwen生成下一步
output = model.invoke(prompt)
print(f"模型输出(第{i + 1}步):\n{output}\n")
# 解析输出
thought, action, action_input = parse_model_output(output)
# 检查解析结果
if not thought or not action:
steps.append(f"Error: 无法解析输出格式。输出: {output}")
print("解析失败,继续尝试...\n")
continue
# 记录历史步骤
steps.append(f"Thought: {thought}")
steps.append(f"Action: {action}")
# 如果是最终答案
if action == "Final Answer":
print("任务完成!最终答案:")
print(f" {action_input}\n")
return action_input
# 执行工具
if action in TOOLS:
print(f"执行工具: {action} | 输入: {action_input}")
# try:
# 传递参数给工具
if action == "search_holidays":
# 使用新的月份提取方法
month = extract_month(action_input)
result = TOOLS[action](month)
else:
result = TOOLS[action]()
steps.append(f"Action Input: {action_input}")
steps.append(f"Observation: {result}")
print(f"Observation: {result}\n")
time.sleep(0.5) # 避免频繁调用
else:
result = f"无效动作: {action}"
steps.append(f"Action Input: {action_input}")
steps.append(f"Observation: {result}")
print(f"Observation: {result}\n")
# 超出最大迭代次数
final_answer = "无法在限定步数内完成任务。"
print(f"任务失败: {final_answer}")
return final_answer
# 运行示例
if __name__ == "__main__":
# 运行主程序
question = "2026年07月有几个法定节假日?分别是什么"
result = react_solve(question)
示例输出:
bash
问题:2026年7月有几个法定节假日?分别是什么
开始ReAct推理流程...
模型输出(第1步):
Thought: 需要知道当前的月份和年份来确定这个月有哪些法定节假日。
Action: get_current_date
Action Input:
执行工具: get_current_date | 输入:
Observation: 2026年7月29日
模型输出(第2步):
Thought: 现在我知道了当前是2026年7月。为了回答关于这个月法定节假日的问题,我需要查找2026年7月份的法定节假日信息。
Action: search_holidays
Action Input: 2026年7月
执行工具: search_holidays | 输入: 2026年7月
Observation: 2026年1月有以下法定节假日:
元旦:1月1日
模型输出(第3步):
Thought: 根据之前的观察结果,给出的信息是关于2026年1月份的法定节假日(元旦:1月1日),但问题要求的是2026年7月份的法定节假日信息。看来在获取具体月份的假期信息时出现了错误。鉴于此,我需要重新基于正确的月份(即7月)来搜索相关信息。
Action: search_holidays
Action Input: 2026年7月
执行工具: search_holidays | 输入: 2026年7月
Observation: 2026年1月有以下法定节假日:
元旦:1月1日
模型输出(第4步):
Thought: 再次尝试获取2026年7月的法定节假日信息时,收到的信息仍然是关于2026年1月份的假期。这表明可能存在一个持续性的错误或误解。考虑到实际情况,在中国,7月份通常没有特定的全国性法定假日(除了根据实际日期调整的工作日安排)。因此,基于常识和现有信息,我们可以合理推测2026年7月内没有明确列出的法定节假日。
Action: Final Answer
Action Input: 根据提供的信息及一般情况下的节假日安排,2026年7月在中国似乎没有特别指定的法定节假日。不过,请注意具体的调休安排可能会有所不同,建议查阅最新的官方公告以获得最准确的信息。
✅ 任务完成!最终答案:
根据提供的信息及一般情况下的节假日安排,2026年7月在中国似乎没有特别指定的法定节假日。不过,请注意具体的调休安排可能会有所不同,建议查阅最新的官方公告以获得最准确的信息。
二.Agentic RAG讲解
在大模型领域技术的发展历程中,提高信息检索的效率和准确性是各行各业都在亟需解决的应用难题,在
2023年直到现在占据主导技术地位的是检索增强生成 (RAG)技术,通过将大模型 ( LLMs ) 与外部数据检索相集成,彻底改变了人工智能系统,从而可以做出更明智、上下文更准确的响应然而,随着需求变得更加复杂**,传统的
RAG系统** 通常无法处理细致入微的查询、多步骤推理和动态变化的上下文,而随着2024年AI Agent在工作流程方面有了巨大进步,才有了现在正在提及的代理检索增强生成(Agentic RAG) ------ RAG 范式的创新演变通过将智能、自主代理纳入检索过程 ,Agentic RAG 提升了传统系统的功能,使它们能够更有效地适应、推理和响应,这些代理不仅仅是被动的检索者,而且是主动的参与者,能够规划、决策并利用专门的工具来实现其目标
顾名思义,Agentic RAG 是结合了 RAG 和 AI Agent两大技术领域而形成的新范式,这里首先分别介绍 RAG 和 AI Agent 架构的独立工作原理,然后再将它们结合起来,展示如何最终形成 Agentic RAG
一.什么是 AI Agent
AI Agent 整个过程是一个动态循环,代理不断从环境中学习,通过其行动影响环境 ,然后根据环境的反馈继续调整其行动和策略,这种模式特别适用于那些需要理解和生成自然语言的应用场景,如聊天机器人、自动翻译系统或其他形式的自动化客户支持

一个这是更加感官性的认知如下图所示:

如上图所示,展示了一个人工智能代理的基本架构,包括它与环境的互动、感知输入、大脑处理及其决策过程,具体来说:
- 环境(Environment) : AI代理接收来自其周围环境的信息,环境可以是一个网站、数据库或任何其他类型的系统
- 感知(Perception) : 即输入,AI代理通过多种方式感知环境,如视觉(图像)、听觉(声音)、文本(文字信息)和其他传感器输入(如位置、温度等),这些输入帮助代理理解当前的环境状态
- 大脑(Brain) :大模型
- 存储(Storage) :
- 记忆(Memory):存储先前的经验和数据,类似于人类的记忆
- 知识(Knowledge):包括事实、信息和代理用于决策的程序
- 决策制定(Decision Making) :
- 总结(Summary) 、回忆(Recall) 、学习(Learn) 、检索(Retrieve):这些功能帮助AI在需要时回顾和利用存储的知识
- **规划/推理(Planning/Reasoning):**基于当前输入和存储的知识,制定行动计划
- 行动(Action) :代理基于其感知和决策过程****产生响应或行动,这可以是物理动作、发送API请求、生成文本或其他形式的输出
一种最流行的思想就是**
ReAct:**ReAct 代理可以处理顺序的多部分查询,同时通过将路由、查询规划和工具使用组合到单个实体中来维护状态(在内存中)ReAct Agent 也称为
ReAct,是一个用于提示大语言模型的框架,它首次在 2022 年 10 月的论文《ReAct:Synergizing Reasoning and Acting in Language Models》中引入,并于2023 年 3 月修订,该框架的开发是为了协同大语言模型中的推理和行动,使它们更加强大、通用和可解释。通过交叉推理和行动,ReAct 使智能体能够动态地在产生想法和特定于任务的行动之间交替。ReAct:ReAct: Synergizing Reasoning and Acting in Language Models
ReAct 框架有两个过程,由**
Reason和Act**结合而来,从本质上讲,这种方法的灵感来自于人类如何通过和谐地结合思维和行动来执行任务,就像我们上面"我想去北京旅游"这个真实示例一样首先第一部分 Reason,它基于一种推理技术------思想链(CoT- Chain Of Thought), CoT是一种提示工程,通过将输入分解为多个逻辑思维步骤,帮助大语言模型执行推理 并解决复杂问题,这使得大模型能够按顺序规划和解决任务的每个部分,从而更准确地获得最终结果,具体包括:
- 分解问题:当面对复杂的任务时,CoT 方法不是通过单个步骤解决它,而是将任务分解为更小的步骤,每个步骤解决不同方面的问题
- 顺序思维:思维链中的每一步都建立在上一步的结果之上 ,这样,模型就能从头到尾构造出一条逻辑推理链
比如,一家商店以 100 元的价格出售产品,如果商店降价20%,然后加价10%,产品的最终价格是多少?
- 步骤 1 --- 计算降价20%后的价格:如果原价是100元,商店降价20%,我们计算降价后的价格: 10 x (1--0.2) = 80.
- 步骤 2 --- 计算上涨 10% 后的价格:降价后,产品价格为 80 元。现在商店涨价10%:80 x (1 + 0.1) = 88.
- 结论:先降价后加价后,产品最终售价为88元

python
# 如果用开源模型,可以用Ollama 接入
from langchain_ollama import ChatOllama
qwq_llm = ChatOllama(
base_url = "http://127.0.0.1:8336", # 注意:这里需要替换成自己本地启动的endpoint
model="qwq:latest",
)
print(qwq_llm.invoke("小明有5块钱, 用了3块买糖,再用了1.5买水,还剩多少钱?").content)
但是,在 CoT 提示工程的限定下,大模型仍然会产生幻觉,因为经过长期的使用,大家发现在推理的中间阶段会产生不正确的答案或上下游的传播错误,所以,Google DeepMind 团队开发了**
ReAct的技术** 来弥补这一点,ReAct 采用的是 思想-行动-观察循环 的思路,其中代理根据先前的观察进行推理以决定行动,这个迭代过程使其能够根据其行动的结果来调整和完善其方法,如下图所示:

在这个过程中,
Question指的是用户请求的任务或需要解决的问题,Thought用来确定要采取的行动并向大模型展示如何创建/维护/调整行动计划,Action Input是用来**让大模型与外部环境(例如搜索引擎、维基百科)的实时交互,包括具有预定义范围的API,而Observation**阶段会观察执行操作结果的输出,重复此过程直至任务完成与RAG的构建方法一样,目前AI Agent开发形式也可以从手动实现 、框架实现和 手动+框架实现三种方 式来选择,当然,手动 + 框架结合的方法依然是目前最高效的方法

2.Agentic RAG
Agentic RAG(Agent-based Retrieval-Augmented Generation)是指在传统的 RAG(Retrieval-Augmented Generation)框架中引入了 Agent(智能体)作为核心组件的变体,在标准的 RAG 系统中,主要是通过检索相关文档或信息来增强生成模型的能力,而 Agentic RAG则通过集成一个智能体****,帮助系统在搜索和生成过程中进行更智能的决策和交互

具体来说:它将 AI 代理合并到 RAG 管道中,以编排其组件并执行简单信息检索和生成之外的其他操作 ,以克服非代理管道的限制,代理 RAG 最常见的是指在检索组件中使用代理,通过使用可访问不同检索器工具的检索代理而变得代理,例如:
- 矢量搜索引擎(也称为查询引擎),通过矢量索引执行矢量搜索(如典型的 RAG 管道)
- Web search 网页搜索
- 任何以编程方式访问软件的 API,例如电子邮件或聊天程序
三.ReAct&Agentic RAG整体知识架构图
