【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别
1. 什么是智能体
将大语言模型作为一个推理引擎。给定一个任务,
智能体自动生成完成任务所需步骤,
执行相应动作(例如选择并调用工具),
直到任务完成。
2. 先定义工具:Tools
- 可以是一个函数或三方 API
- 也可以把一个 Chain 或者 Agent 的 run()作为一个 Tool
# 需要注册 SerpAPI(限量免费),并将 SERPAPI_API_KEY 写在环境变量中
from langchain_community.utilities import SerpAPIWrapper
from langchain.tools import Tool, toolsearch = SerpAPIWrapper()
tools = [Tool.from_function(func=search.run,name="Search",description="useful for when you need to answer questions about current events"),
]
import calendar
import dateutil.parser as parser
from datetime import date# 自定义工具@tool("weekday")
def weekday(date_str: str) -> str:"""Convert date to weekday name"""d = parser.parse(date_str)return calendar.day_name[d.weekday()]tools += [weekday]
@tool
是 LangChain 框架中用于快速定义 Agent 工具的核心装饰器,其作用如下:
1. 核心功能
- 工具注册:将普通 Python 函数转化为 LangChain Agent 可调用的工具
- 元数据生成:自动提取函数签名和文档字符串生成工具描述
- 接口标准化:封装为符合 LangChain Tool 协议的格式
2. 代码示例解析
from langchain.tools import tool@tool("weekday") # 👈 关键装饰器
def weekday(date_str: str) -> str:"""Convert date to weekday name""" # 👈 工具描述(Agent决策依据)d = parser.parse(date_str)return calendar.day_name[d.weekday()]
3. 装饰器执行细节
阶段 | 操作 |
---|---|
装饰器调用 | 创建 Tool 对象,将函数包装为 structured_tool.StructuredTool 实例 |
元数据生成 | 自动提取以下信息: - 工具名称 ( name="weekday" )- 功能描述(docstring) - 参数类型(从类型注解推断) |
错误处理 | 添加参数验证逻辑,确保输入符合 date_str: str 类型声明 |
4. 等价显式写法
装饰器代码等价于:
from langchain.tools import Tooldef weekday(date_str: str) -> str:"""Convert date to weekday name"""d = parser.parse(date_str)return calendar.day_name[d.weekday()]weekday_tool = Tool.from_function(name="weekday",description="Convert date to weekday name",func=weekday,args_schema={"date_str": {"type": "str", "description": "Date string"}}
)
5. 关键特性
特性 | 说明 |
---|---|
自动描述生成 | Agent 根据 docstring 判断何时调用该工具 |
类型安全 | 强制检查输入参数类型(本例中确保 date_str 为字符串) |
错误反馈标准化 | 工具异常会被捕获并格式化为 Agent 可理解的错误消息 |
多工具协同 | 可与其他 @tool 装饰的函数组成工具集,供 Agent 智能调度 |
6. 调试建议
- 查看工具元数据:
print(weekday.name) # 输出 "weekday" print(weekday.description) # 输出 "Convert date to weekday name" print(weekday.args) # 输出 {'date_str': {'type': 'str', 'description': 'Date string'}}
- 测试工具直接调用:
print(weekday.run("2024-06-10")) # 输出 "Monday"
7. 进阶用法
- 自定义参数描述:
@tool("weekday", args_schema={"date_str": "日期字符串,格式为YYYY-MM-DD"})
- 异步支持:
@tool("weekday") async def weekday_async(date_str: str) -> str:...
- 返回结构化数据:
@tool("weekday", return_direct=True) # 直接返回原始结果不经过LLM处理
该装饰器极大简化了 LangChain 工具的开发流程,是构建复杂 Agent 系统的核心基础设施。
3. 智能体类型:ReAct
# !pip install google-search-results
# !pip install --upgrade langchainhub
from langchain import hub
import json# 下载一个现有的 Prompt 模板
react_prompt = hub.pull("hwchase17/react")print(react_prompt.template)
'''
输出:
Answer the following questions as best you can. You have access to the following tools:{tools}Use the following format:Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input questionBegin!Question: {input}
Thought:{agent_scratchpad}
'''
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agentllm = ChatOpenAI(model_name='gpt-4o', temperature=0, seed=23)# 定义一个 agent: 需要大模型、工具集、和 Prompt 模板
agent = create_react_agent(llm, tools, react_prompt)
# 定义一个执行器:需要 agent 对象 和 工具集
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 执行
agent_executor.invoke({"input": "2024年周杰伦的演唱会星期几"})'''> Entering new AgentExecutor chain...
To determine the weekday of Jay Chou's concert in 2024, I need to know the specific date of the concert. Once I have the date, I can find out the weekday. Action: Search
Action Input: "2024 Jay Chou concert dates"['Trending Performers · 8 events in all locations · Oct 11. Fri. 8:00 PM. This week. Singapore National Stadium. Singapore, Singapore · Oct 12. Sat. 7:30 PM.', 'Jay Chou Tour Dates See the Jay Chou concert schedule for 2024. · All Tour Dates · Oct. 11. 2024. Fri. Singapore National Stadium. Singapore, Singapore · Oct.', 'Unfortunately there are no concert dates for Jay Chou scheduled in 2024. Songkick is the first to know of new tour announcements and concert information, so if ...', 'Tour dates. edit. List of concert dates. Date, City, Country, Venue, Attendance ... ^ "Jay Chou Carnival World Tour 2024 - Singapore". Singapore Sports Hub ...', 'Jay Chou Singapore Concert 2024 Details · Jay Chou Carnival World Tour 2024 – Singapore · Date and time: 11 October 2024 (Friday) 20:00, 12-13 October 2024 ( ...', "Jay Chou is playing in Shenzhencun on Sep 12, 2024, 7:00 PM at 深圳大运中心体育场. Buy tickets, find concert information, and get ready for Jay Chou's show!", 'Concert tours ; 2019–2024, Carnival World Tour, October 17, 2019 – present ; The Carnival World Tour commenced in October 2019, and was halted by the COVID-19 ...', 'Tickets for Jay Chou Carnival World Tour Australia 2024 – Melbourne tickets will go on sale at 12pm on 26 October 2023, and Sydney tickets will go on sale at 2 ...', 'Jay Chou tickets for the upcoming concert tour are on sale at StubHub. Buy and sell your Jay Chou concert tickets today. Tickets are 100% guaranteed by ...', "'King of Mandopop' Jay Chou first to give solo concert at Taipei Dome | Taiwan News | Sep. 7, 2024 19:40."]I found that Jay Chou has a concert scheduled for October 11, 2024, which is a Friday. Final Answer: Jay Chou's concert on October 11, 2024, is on a Friday.
'''输出:
{'input': '2024年周杰伦的演唱会星期几','output': "Jay Chou's concert on October 11, 2024, is on a Friday."}
代码功能解析
这段代码实现了一个基于 ReAct 范式的智能问答系统,通过结合大语言模型的推理能力与外部工具调用,解决需要多步骤交互的复杂问题。以下是逐层解析:
1. 核心组件概览
# 架构图
graph TDA[用户输入] --> B(ReAct Agent)B --> C{是否需要工具}C -->|是| D[调用工具]C -->|否| E[直接回答]D --> BE --> F[最终响应]
2. 代码逐层解析
2.1 模型初始化
llm = ChatOpenAI(model_name='gpt-4o', # 使用 GPT-4 Omni 模型temperature=0, # 确定性输出seed=23 # 固定随机种子保证可复现性
)
- 关键参数:
temperature=0
:禁用随机性,相同输入始终得到相同输出seed=23
:与 temperature 配合确保结果确定性model_name
:最新多模态模型,支持文本/视觉/音频混合输入
2.2 代理创建
from langchain.agents import create_react_agentagent = create_react_agent(llm=llm, # 指定大模型tools=tools, # 工具集(需预先定义)prompt=react_prompt # ReAct 专用模板
)
- ReAct 范式核心:
# 伪代码展示 ReAct 决策逻辑 for _ in max_steps:thought = generate_thought(question, history)if needs_tool(thought):action = decide_action(thought)observation = use_tool(action)else:answer = generate_final_answer(thought)break
2.3 执行器配置
agent_executor = AgentExecutor(agent=agent, tools=tools,verbose=True, # 显示详细执行过程# handle_parsing_errors=True # 可选错误处理
)
- Verbose 模式输出示例:
[Thought] 需要先确定2024年周杰伦演唱会日期 [Action] 调用演唱会日期查询工具 [Tool Input] {"artist": "周杰伦", "year": 2024} [Observation] 返回日期:2024-08-15 [Thought] 需要将2024-08-15转换为星期 [Action] 调用日期转换工具 [Tool Input] {"date_str": "2024-08-15"} [Observation] 星期四 [Final Answer] 2024年周杰伦演唱会在星期四举行
3. 关键技术要点
3.1 ReAct 范式工作流程
- 思考 (Reason):分析问题并决定下一步行动
{"thought": "需要先获取演唱会具体日期"}
- 行动 (Act):选择工具并生成调用参数
{"action": "concert_date_search", "args": {"artist": "周杰伦", "year": 2024}}
- 观察 (Observe):获取工具返回结果
{"observation": "2024-08-15"}
- 循环:重复直到得出最终答案
3.2 工具集定义要求
# 需预先定义的工具示例(假设已存在)
tools = [Tool(name="concert_date_search",func=get_concert_date,description="查询歌手演唱会日期"),Tool(name="date_to_weekday",func=convert_to_weekday,description="将日期转换为星期")
]
- 命名规范:工具名称需与 Action 选择匹配
- 参数适配:工具函数参数需与模型生成的参数一致
3.3 Prompt 模板关键内容
# react_prompt 核心片段示例
template = '''
Answer the following questions using the tools provided. Format instructions:
{format_instructions}Tools:
{tools}History:
{history}Question: {input}
'''
- 必须包含:
- 工具描述列表
- 格式指令(JSON 模板)
- 历史交互记录(多轮对话场景)
4. 执行过程示例
response = agent_executor.invoke({"input": "2024年周杰伦的演唱会星期几"}
)
分步解析:
- 初始思考:
{"thought": "需要先找到周杰伦2024年演唱会的具体日期"}
- 调用工具:
concert_date_search.run({"artist": "周杰伦", "year": 2024}) # 返回 "2024-08-15"
- 二次思考:
{"thought": "需要将2024-08-15转换为星期"}
- 二次调用:
date_to_weekday.run({"date_str": "2024-08-15"}) # 返回 "Thursday"
- 最终答案:
"2024年周杰伦的演唱会在星期四(8月15日)举行"
5. 关键配置项
参数 | 说明 | 推荐值 |
---|---|---|
max_iterations | 最大思考-行动循环次数 | 5(复杂问题可调高) |
early_stopping | 当模型输出 “Final Answer” 时停止 | True |
handle_parsing_errors | 自动修复 JSON 格式错误 | True(生产环境必备) |
6. 性能优化建议
6.1 工具调用优化
# 为工具添加缓存(示例使用 diskcache)
from langchain.tools import tool
from diskcache import Cachecache = Cache("tool_cache")@tool
def concert_date_search(artist: str, year: int):cache_key = f"{artist}_{year}"if cache_key in cache:return cache[cache_key]result = api_call(...)cache.set(cache_key, result, expire=3600)return result
6.2 历史管理
# 添加对话历史支持
from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory()
agent_executor.memory = memory# 后续调用自动携带历史
agent_executor.invoke({"input": "那他的台北场呢?"}) # 能理解"他"指代周杰伦
6.3 异步支持
# 异步执行提升吞吐量
async def main():async for chunk in agent_executor.astream({"input": "..."}):print(chunk)
7. 典型问题排查
现象 | 可能原因 | 解决方案 |
---|---|---|
无限循环 | max_iterations 设置过高 | 设置合理阈值(如 6-8 次) |
工具参数不匹配 | 模型生成的参数名与工具定义不一致 | 统一命名规范 |
中文输出乱码 | Prompt 未指定中文响应 | 在 Prompt 中添加 “用中文回答” |
工具调用超时 | 网络延迟或工具响应慢 | 添加超时机制 |
8. 应用场景扩展
-
客户服务:
agent_executor.invoke({"input": "我的订单#123456物流状态如何?"}) # 需要集成订单查询工具
-
数据分析:
agent_executor.invoke({"input": "统计2023 Q3销售额最高的产品"}) # 需要连接数据库工具
-
智能家居控制:
agent_executor.invoke({"input": "把客厅空调调到25度"}) # 需要物联网控制工具
该代码展示了如何利用 ReAct 范式构建具备自主决策能力的智能系统,是开发复杂业务场景下AI助手的典型方案。通过合理配置工具集与 Prompt 模板,可快速适配不同业务需求。
4. 智能体类型:SelfAskWithSearch
# 下载一个模板
self_ask_prompt = hub.pull("hwchase17/self-ask-with-search")print(self_ask_prompt.template)输出:
# 下载一个模板
Question: Who lived longer, Muhammad Ali or Alan Turing?
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad AliQuestion: When was the founder of craigslist born?
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952Question: Who was the maternal grandfather of George Washington?
Are follow up questions needed here: Yes.
Follow up: Who was the mother of George Washington?
Intermediate answer: The mother of George Washington was Mary Ball Washington.
Follow up: Who was the father of Mary Ball Washington?
Intermediate answer: The father of Mary Ball Washington was Joseph Ball.
So the final answer is: Joseph BallQuestion: Are both the directors of Jaws and Casino Royale from the same country?
Are follow up questions needed here: Yes.
Follow up: Who is the director of Jaws?
Intermediate answer: The director of Jaws is Steven Spielberg.
Follow up: Where is Steven Spielberg from?
Intermediate answer: The United States.
Follow up: Who is the director of Casino Royale?
Intermediate answer: The director of Casino Royale is Martin Campbell.
Follow up: Where is Martin Campbell from?
Intermediate answer: New Zealand.
So the final answer is: NoQuestion: {input}
Are followup questions needed here:{agent_scratchpad}
from langchain.agents import create_self_ask_with_search_agenttools = [Tool(name="Intermediate Answer",func=search.run,description="搜素引擎",max_results=1)
]# self_ask_with_search_agent 只能传一个名为 'Intermediate Answer' 的 tool
agent = create_self_ask_with_search_agent(llm, tools, self_ask_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)agent_executor.invoke({"input": "冯小刚的老婆演过哪些电影,用中文回答"})
> Entering new AgentExecutor chain...
是。
Follow up: 冯小刚的老婆是谁?['Feng Xiaogang is a Chinese film director, screenwriter, actor, producer and politician. He is well known in China as a highly successful commercial filmmaker whose comedy films do consistently well at the box office, although Feng has broken out from that mold by making some drama and period drama films.', 'Feng Xiaogang (冯小刚) type: Chinese film director and screenwriter.', 'Feng Xiaogang (冯小刚) entity_type: people.', 'Feng Xiaogang (冯小刚) kgmid: /m/04xhrq.', 'Feng Xiaogang (冯小刚) born: 1958 (age 66 years), Daxing District, Beijing, China.', 'Feng Xiaogang (冯小刚) awards: Golden Horse Award for Best Leading Actor.', 'Feng Xiaogang (冯小刚) children: Siyu Feng.', 'Feng Xiaogang (冯小刚) height: 5′ 10″.', '冯小刚妻子徐帆,是内地知名女演员,文艺世家出身,1991年,24岁的她毕业于央戏表演专业。当时徐帆刚和王志文分手,很是失落,于是冯小刚时常安慰和开导她,两人 ...', '冯小刚老婆徐帆和好友热聊,心情大好,面带笑容,还和朋友相拥送别。从图片看,身旁的好友是亚洲面孔。 ... 1999年,冯小刚和第一任妻子正式离婚,同年迎娶徐帆。', '徐帆是著名导演冯小刚的妻子,可以说是家喻户晓的实力派女星。值得一提的是,如今已然五十二岁的徐帆看上去依旧是靓丽又显年轻,整个人没有半分老态, ...', '尽管冯小刚和徐帆已经结婚这么多年,但他们两个人始终没有孩子。 而是一直照顾着冯小刚和前妻的女儿冯思羽,最后两个人也领养了一个女儿。', '徐帆,作为冯小刚老婆,这个女人相貌美丽,心态也非常好,对家庭非常包容,85分。冯小刚老婆85分,张艺谋老婆93分,而他的老婆我想打666分.', '冯小刚和徐帆自1991年因为《大撒把》相识,1999年结婚,相识33年结婚25年,为什么还有网友不看好他们的婚姻呢?其实细究他们的婚姻就知道,徐帆背后的付出并不 ...', '冯小刚一共有几个妻子. 2任。冯小刚一共有2任老婆2段婚姻,原配妻子是张娣。冯小刚,1958年3月18日出生于北京市大兴区,祖籍湖南省湘潭市,中国内地导演、编剧、演员。', '1. 徐帆,著名导演冯小刚的妻子,是一位才华横溢的中国女演员。2. 她于1967年8月16日出生于湖北省武汉市江汉区,1991年毕业于中央戏剧学院表演系,并加入 ...', '1999年,徐帆和冯小刚如愿以偿领证结婚,婚后的道路,其实跟前妻张娣并无二致。 慢慢成为大导演的冯小刚,身边的莺莺燕燕 ...', '冯小刚的老婆是徐帆。 徐帆1967年8月16日出生于湖北省武汉市江汉区,是中国电视、电影演员。 她与冯小刚于1999年9月19日正式结婚。 原著同样精彩,可以点击《玫瑰的故事》 ...']Could not parse output: Intermediate answer: 冯小刚的老婆是徐帆。Follow up: 徐帆演过哪些电影?
Invalid or incomplete responseIntermediate answer: 徐帆演过的电影包括《唐山大地震》、《手机》、《一九四二》、《不见不散》等。So the final answer is: 徐帆演过的电影包括《唐山大地震》、《手机》、《一九四二》、《不见不散》等。> Finished chain.
输出
{'input': '冯小刚的老婆演过哪些电影,用中文回答','output': '徐帆演过的电影包括《唐山大地震》、《手机》、《一九四二》、《不见不散》等。'}
代码功能解析
Self-Ask 代码实现了一个 具备自主问题拆解能力的问答系统,通过 Self-Ask(自问自答)机制结合搜索引擎,解决需要多步推理的复杂问题。以下是关键模块解析:
1. 核心技术原理
Self-Ask with Search 是一种专门处理多跳推理(multi-hop reasoning)的 Agent 模式,其工作流程如下:
2. 代码逐层解析
2.1 工具定义
from langchain.agents import Tooltools = [Tool(name="Intermediate Answer", # 固定名称不可修改func=search.run, # 搜索引擎执行函数description="搜素引擎", # 工具描述(Agent决策依据)max_results=1 # 限制每次搜索返回1个结果)
]
- 强制命名:
name
必须为"Intermediate Answer"
,这是 Self-Ask 代理的硬性要求 - 结果限制:
max_results=1
确保每个中间问题只取最相关结果,避免信息过载
2.2 代理创建
from langchain.agents import create_self_ask_with_search_agentagent = create_self_ask_with_search_agent(llm, # 大语言模型(如GPT-4)tools, # 工具列表(必须包含Intermediate Answer)self_ask_prompt # 内置的专用Prompt模板
)
- 专有架构:使用 LangChain 内置的 Self-Ask 代理结构
- Prompt 约束:
self_ask_prompt
包含明确的中间问题生成指令,例如:Follow these steps: 1. Break the question into sub-questions 2. Search for each sub-question 3. Combine the answers
2.3 执行器配置
agent_executor = AgentExecutor(agent=agent,tools=tools,verbose=True, # 打印详细执行过程handle_parsing_errors=True # 自动修复JSON解析错误
)
- 过程可视化:
verbose=True
时输出类似以下信息:[Self-Ask] 生成中间问题:冯小刚的妻子是谁? [Search] 使用工具 Intermediate Answer 搜索:冯小刚 妻子 [Result] 获得答案:徐帆 [Self-Ask] 生成中间问题:徐帆演过哪些电影 [Search] 使用工具 Intermediate Answer 搜索:徐帆 电影作品 [Result] 获得答案:《唐山大地震》《甲方乙方》...
3. 执行过程示例
response = agent_executor.invoke({"input": "冯小刚的老婆演过哪些电影,用中文回答"}
)
分步解析:
- 问题拆解:
# 模型生成的中间问题 sub_question_1 = "冯小刚的妻子是谁?" sub_question_2 = "徐帆演过哪些电影?"
- 搜索调用:
search_result_1 = search.run(sub_question_1) # 返回"徐帆" search_result_2 = search.run(sub_question_2) # 返回电影列表
- 答案综合:
final_answer = "徐帆(冯小刚妻子)演过的电影包括:《唐山大地震》《甲方乙方》..."
4. 关键技术约束
要素 | 约束条件 |
---|---|
工具名称 | 必须为 "Intermediate Answer" ,否则代理无法识别 |
工具数量 | 只能有1个工具,因为 Self-Ask 代理设计为单一搜索工具场景 |
Prompt 模板 | 需使用 LangChain 内置模板,自定义模板可能破坏 Self-Ask 逻辑 |
输入格式 | 问题必须为需要多步推理的复杂问题,简单问题可能直接调用搜索无需拆解 |
5. 性能优化建议
5.1 搜索引擎优化
# 提升搜索精度(示例使用 Serper API)
from langchain_community.utilities import GoogleSerperAPIWrappersearch = GoogleSerperAPIWrapper(gl="cn", hl="zh-cn") # 指定中文结果
5.2 中间问题控制
# 在 Prompt 中添加约束(伪代码)
self_ask_prompt = """...最多拆解3个子问题..."""
5.3 结果后处理
# 添加结果清洗逻辑
def clean_search_result(query: str):result = search.run(query)return remove_html_tags(result) # 示例:去除HTML标签tools[0].func = clean_search_result
6. 典型问题场景
问题类型 | 示例 | 拆解步骤 |
---|---|---|
多实体关联 | “马云的第一任妻子的母校是哪所大学?” | 1. 马云的第一任妻子是谁 → 2. 该人的母校 |
时间线推理 | “北京奥运会那年诺贝尔文学奖得主是谁” | 1. 北京奥运会年份 → 2. 该年诺贝尔文学奖得主 |
跨领域综合 | “《三体》作者的母校最新排名多少” | 1. 《三体》作者 → 2. 该人的母校 → 3. 该学校最新排名 |
7. 错误处理机制
7.1 解析错误应对
handle_parsing_errors=True
可自动处理以下问题:
- 模型输出的非结构化响应
- JSON 格式错误
- 工具调用参数缺失
7.2 失败重试策略
# 自定义重试逻辑(需 LangChain 0.1+)
from langchain.retrievers import RetryOutputParseragent_executor = AgentExecutor(...,max_retries=3,retry_prompt=RetryPromptTemplate(...)
)
8. 应用场景扩展
-
知识图谱补全
agent_executor.invoke({"input": "OpenAI CEO的母校的创办时间是多少?"})
-
事实核查系统
agent_executor.invoke({"input": "验证以下说法:特斯拉创始人毕业于斯坦福大学"})
-
研究助手
agent_executor.invoke({"input": "量子计算在药物研发中的最新应用案例"})
该代码展示了如何利用 Self-Ask 代理解决需要多步推理的复杂问题,是构建智能问答系统的有效方案,尤其适合需要事实性验证的场景。
ReAct和Self-Ask的区别以及应用场景
在LangChain框架中,ReAct和Self-ASK是两种不同的智能体类型,它们的核心设计思想和适用场景有显著差异:
1. 最显著的区别
特征 | ReAct | Self-ASK |
---|---|---|
核心机制 | 交替进行推理(Reasoning)和行动(Action),形成动态决策循环 | 通过自我提问(Self-Questioning)分解问题,逐层解决子问题 |
流程控制 | 推理与行动交替执行,依赖上下文动态调整 | 显式拆分问题为子问题,独立解决后整合答案 |
工具调用方式 | 灵活调用工具以支持当前推理步骤 | 每个子问题独立调用工具或搜索 |
适用问题复杂度 | 多步骤、需动态调整策略的任务 | 复杂问答需分解为多个明确子任务 |
2. 应用场景
ReAct
- 场景特点:需要实时交互、多步骤推理且后续步骤依赖前序结果的任务。
- 典型用例:
- 交互式任务:如客服机器人处理用户的多轮请求(如订票需先查询余票再确认支付)。
- 动态决策:机器人导航中根据环境反馈调整路径。
- 代码调试:通过执行代码并观察输出来逐步修正错误。
Self-ASK
- 场景特点:问题需分解为多个独立子问题,每个子问题需外部信息支持。
- 典型用例:
- 多跳问答:例如“某公司CEO的母校是哪所?”需先查询CEO姓名,再查其教育背景。
- 事实核查:验证复合陈述(如“某城市人口是否超过A国首都?”需分别查询两个城市数据)。
- 复杂分析:如比较多个产品的市场表现,需逐一获取各产品数据后综合对比。
3. 选择建议
- 选ReAct:当任务需要灵活调整策略,且步骤间存在强依赖(如后续行动依赖前一步的结果)。
- 选Self-ASK:当问题可明确拆分为独立子问题,且每个子问题需独立检索或计算(如多源信息整合)。
示例对比:
-
ReAct处理订餐请求:
推理:“用户要订素食,需过滤餐厅菜单”→ 调用菜单API → 推理:“用户偏好辣味”→ 筛选辣味素食。 -
Self-ASK回答复杂问题:
提问:“诺贝尔奖创始人是谁?”→ 搜索→“阿尔弗雷德·诺贝尔”→“他的职业?”→ 搜索→“工程师”→ 整合答案。
通过理解两者的机制差异,可更高效地设计适合业务需求的智能体。
相关文章:
【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别
1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务, 智能体自动生成完成任务所需步骤, 执行相应动作(例如选择并调用工具), 直到任务完成。 2. 先定义工具:Tools 可以是一个函数或三方 API也…...
nginx 配置403页面(已亲测)
问题:GET请求访问漏洞url即可看到泄露的内网ip 解决方式: 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置: 编写一个403.html 在nginx的配置文件中,配置location参数: location /api/validationCode…...
安卓基础组件Looper - 02 native层面的剖析
文章目录 native使用使用总结创建Looper构造函数创建(不推荐)使用举例源代码 Looper::prepare 获取Looper可忽略初始化Looper主动休眠 pollAll主动唤醒 wake 发送消息 sendMessage轮询消息 native使用 Android Native Looper 机制 - 掘金 (juejin.cn) /system/core/libutils/…...
nodejs关于后端服务开发的探究
前提 在当前的环境中关于web server的主流开发基本上都是java、php之类的,其中java spring系列基本上占了大头,而python之流也在奋起直追,但别忘了nodejs也是可以做这个服务的,只是位置有点尴尬,现在就来探究下nodejs…...
QTday4
1:是进度条通过线程自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread>class mythread : public QThread {Q_OBJECT public:mythread(QObject* parent nullptr); protected:virtual void run() override; private: signals:virtual voi…...
服务器时间同步
方法一 [rootbogon hwh-ansible]# cat time-sync.sh #!/bin/bash # NTP 服务器信息 NTP_SERVER"192.168.42.12" PASSWORD"123456" # 多个 IP 地址 HOSTS("192.168.42.8" "192.168.42.9" "192.168.42.10" "192.168.42…...
蓝桥杯备赛日记【day1】(c++赛道)
一、裁纸刀问题(2022、规律、思维、省赛) 解法思路: 参考题目给出的例子发现。不管要裁剪多少次。最外围的四次是固定的。然后通过观察发现,我们的行的裁剪次数为(m-1) 次,而每行都需要裁剪列数…...
DeepSeek大模型 —— 全维度技术解析
DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1.1…...
嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库
目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…...
Ubuntu 24.04 配置ODBC连接ORACLE 11G数据库
1. 安装必要工具和驱动 1.1 安装unixODBC和依赖库 # apt update # apt install unixodbc unixodbc-dev libaio1 执行失败,报错 libaio1包找不到,先跳过,安装其他两个。 # apt install unixodbc unixodbc-dev 安装成功 1.2 下载Oracle…...
upload-labs靶场 1-21通关
目录 1.Pass-01 前端绕过 分析 解题 2.Pass-02 服务器端检测--修改IMME 分析 解题 3.Pass-03 黑名单绕过 分析 解题 4.Pass-04 .htaccess绕过 分析 解题 5.Pass-05 . .绕过和.user.ini绕过 分析 解题 6.Pass-06 大小写绕过 分析 解题 7.Pass-07 空格绕过 分…...
Docker新手入门(持续更新中)
一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。 所谓镜像,就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器,为每个镜像的应用进程创建…...
c语言笔记 指针篇(上)
1.指针 在计算的存储器中有很多的存储单元,我们的操作系统把这些存储单元以字节为单位进行编号,也就是每个存储单元(字节),都有编码。这些编码在我们内存中就称为地址。一个字节有八位,位是存储信息的最小单…...
要查看 SQLite 数据库中的所有表,可以通过查询 SQLite 的系统表 sqlite_master
要查看 SQLite 数据库中的所有表,可以查询 SQLite 的系统表 sqlite_master。 每个 SQLite 数据库都包含一个名为 sqlite_master 的系统表。该表定义了数据库的模式,存储了数据库中所有表、索引、视图和触发器等对象的信息。 通过查询 sqlite_master&am…...
C#释放内存空间的方法
目录 前言释放 C# 对象内存的六种方法1、手动释放内存空间2、使用 Using 语句3、使用 垃圾回收器4、GC.Collect() 方法5、GC.WaitForPendingFinalizers() 方法6、WeakReference 类 注意 前言 当不再需要对象时释放内存空间对于防止内存泄漏和提高应用程序性能至关重要。C# 提供…...
mapbox基础,使用点类型geojson加载symbol符号图层,用于标注文字
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️symbol符号图层样式二、🍀使用点类型…...
Java数组详解/从JVM理解数组/数组反转/随机排名/数组在计算机如何存储
本文详细讲解了数组的定义、数组的访问方法、数组的遍历、静态数组和动态数组、以及数组中的自动类型转换、引用类型指向数组的地址、以及从JVM理解数组、空指针异常、数组反转、随机排名的案例。 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索…...
网络安全wireshark题目
一、填空题: 网络安全的目标是在计算机网络的信息传输、存储与处理的整个过程中,提高 物理逻辑上 的防护、监控、反应恢复和 对抗 的能力。SSL协议是在网络传输过程中,提供通信双方网络信息 保密性 和 可靠性 。TCP/IP网络安全管理…...
TomcatServlet
https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图,与 jre,应用程序之前的关系 安装使用 tomcat 10 开始,api 从 javax.* 转为使用 jakarta.*,需要至少使用 jdk 11 cmd 中默认 gbk 编码,解决控制…...
Seurat - Guided Clustering Tutorial官方文档学习及复现
由于本人没有使用过Seurat4.0,而是直接使用的最新版。所以本文都是基于Seurat5.2.0(截止2025/3/6)来进行撰写。 参考的官方教程来进行学习(上图中的 Guided tutorial-2.700 PBMCs),肯定没有官方文档那么全面…...
Python数据分析面试题及参考答案
目录 处理 DataFrame 中多列缺失值的 5 种方法 批量替换指定列中的异常值为中位数 使用正则表达式清洗电话号码格式 合并两个存在部分重叠列的 DataFrame 将非结构化 JSON 日志转换为结构化表格 处理日期列中的多种非标准格式(如 "2023 年 12 月 / 05 日") 识…...
极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...
【JavaSE-7】方法的使用
1、方法的概念和使用 1.1、什么是方法 方法(method)是程序中最小的执行单元,类似于 C语言中的函数,方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
C语言笔记(通讯录)
目录 1.通讯录的架构 2.通讯录的功能 3.实现静态通讯录的功能步骤 3.1.创建通讯录数组 3.2.显示功能菜单 3.3.初始化通讯录 3.4.添加联系人的信息 3.5.显示联系人的信息 3.6.查找某个人的信息 3.7.删除某一个联系人信息 3.8.修改某一联系人的信息 3.9.按名字对联系…...
【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)
DeepSeek 之后,又一个AI沸腾,冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨,全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队(隶属中国夜莺科技)推出的“全球首款通用AI…...
Python 面向对象高级编程-定制类
目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()…...
安装remixd,在VScode创建hardhat
在终端,以管理员身份,cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中,安装solidity插件,是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件,在终端输入 npx hardhat 3.…...
开发环境搭建-02.后端环境搭建-熟悉项目结构
一.后端环境搭建...
Linux(Centos 7.6)命令详解:vi
1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令,vim 是vi 的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...
Ubuntu 20.04下配置VSCode以支持Eigen库开发
这里写目录标题 1. 安装Eigen库2. 配置VSCode的C开发环境3. 配置c_cpp_properties.json4. 编写代码并测试5. 配置tasks.json(可选)6. 运行程序总结 在VSCode中配置Eigen库(用于线性代数、矩阵和向量运算的C库)的步骤如下ÿ…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Android14 OTA差分包升级报kPayloadTimestampError (51)
由于VF 架构, 所以镜像的打包时间可能存在偏差, 如 boot.img 和 客制化的一些镜像打包 可能会在 vendor 侧进行打包。 而 与system 侧进行merge 时,时间戳比较乱,为了解决这个问题,让时间戳进行统一。 使用adb方式验证…...
PPT 技能:巧用 “节” 功能,让演示文稿更有序
在制作PPT时,你是否遇到过这样的情况:幻灯片越来越多,内容越来越杂,找某一页内容时翻得眼花缭乱?尤其是在处理大型PPT文件时,如果没有合理的结构,编辑和调整都会变得非常麻烦。这时候࿰…...
Mysql创建库、表练习
创建库 #创建 create database gc_novels default charsetutf8mb4;#default charsetutf8mb4 指定编码为utf-8#使用 use gc_novels#查看当前所在位置 select database(); 结果: 创建表 #创建 create table heros(-> id int,-> name varchar(50),-&…...
【原创】Ollama Test API For Linux/MacOS/Unix
安装Json解析工具 Linux/Unix sudo apt-get install jq -yMacOS brew install jq -y设置环境变量 export IP"192.168.250.229" export PORT"8080" export MODEL"deepseek-r1:7b"检查Ollama版本 curl http://"$IP":"$PORT&qu…...
盛铂科技 SLMF315频率综合器200MHz至15GHz 国产频综模块
在当今科技飞速发展的时代,射频技术在众多领域发挥着关键作用,从通信、雷达系统到科研实验,对频率综合器的性能要求日益严苛。以下是关于盛铂科技的 SLMF315 超低相位噪声频率综合器的介绍: SLMF315超低相位噪声0.2至15GHz频率综合…...
AI-前端开发webcrumbs.ai/frontend-ai,Fitten Code提高开发效率
1.webcrumbs.ai/frontend-ai Frontend AI by Webcrumbshttps://app.webcrumbs.ai/frontend-ai 可选择某一模版进行生成对应版本代码,减少开发量。 2.Fitten Code Vue AI 编程助手 Vue AI 编程助手 | 菜鸟教程https://www.runoob.com/vue2/fitten-code-vue2.htm…...
DeepSeek开源Day4:DualPipeEPLB技术详解
2 月 24 日,DeepSeek 启动 “开源周”,第四个开源的代码库为 DualPipe 与 EPLB(一下发布了两个)。DualPipe 与 EPLB 依然使用了大量与 Hopper 架构绑定的技术。 DualPipe 是由 DeepSeek-AI 团队开发的一种双向流水线并行通信算法&…...
代码随想录算法训练营第22天 | 组合 组合总和 电话号码的字母组合
77. 组合 77. 组合 - 力扣(LeetCode) class Solution {List<Integer> path new ArrayList<>();List<List<Integer>> result new ArrayList<>();public void backTracking(int n,int k,int startIndex){if(path.size() …...
Oracle19c进入EM Express(Oracle企业管理器)详细步骤
以下是使用Oracle 19c进入Oracle Enterprise Manager Database Express(EM Express)的详细步骤: ### **步骤 1:确认EM Express配置状态** 1. **登录数据库服务器** 使用Oracle用户或管理员权限账户登录操作系统。 2. **查看EM…...
Oracle 数据库基础入门(六):视图与索引的深入解析
在 Oracle 数据库的知识体系中,视图与索引是提升数据库操作效率和优化数据管理的重要工具。对于 Java 全栈开发者而言,熟练掌握视图与索引的运用,不仅能够增强数据库查询的性能,还能为构建高效稳定的后端应用提供有力支持。接下来…...
机器学习-随机森林解析
目录 一、.随机森林的思想 二、随机森林构建步骤 1.自助采样 2.特征随机选择 3构建决策树 4.集成预测 三. 随机森林的关键优势 **(1) 减少过拟合** **(2) 高效并行化** **(3) 特征重要性评估** **(4) 耐抗噪声** 四. 随机森林的优缺点 优点 缺点 五.…...
Qt添加MySql数据库驱动
文章目录 一. 安装MySql二.编译mysql动态链接库 Qt版本:5.14.2 MySql版本:8.0.41 一. 安装MySql 参考这里进行安装:https://blog.csdn.net/qq_30150579/article/details/146042922 将mysql安装目录里的bin,include和lib拷贝出来…...
MR的环形缓冲区(底层)
MapReduce的大致流程: 1、HDFS读取数据; 2、按照规则进行分片,形成若干个spilt; 3、进行Map 4、打上分区标签(patition) 5、数据入环形缓冲区(KVbuffer) 6、原地排序ÿ…...
RMAN备份bug-审计日志暴涨(select action from gv$session)
问题概述 /oracle 文件系统使用率过大,经过检查是审计日志过大,/oracle 目录 197G 审计日志占用70G,每6个小时产生大量审计日志,日志内容全是select action from gv$session ,猜测可能跟备份有关, $>df -h /oracle…...
30秒从零搭建机器人管理系统(Trae)
1. 安装 [Trae官网】(https://www.trae.com.cn/) 2. 提示词 创建一个BS架构的机器人远程操控系统,具备机器人状态及位置实时更新,可以实现机器人远程遥控,可以对机器人工作日志进行统计分析,以及其它管理系统的常用功能3. 模型…...
OpenFeign 学习笔记
OpenFeign 学习笔记 一、基础入门 1.1 简介 OpenFeign 是基于声明式的 REST 客户端,用于简化服务间远程调用。(编程式 REST 客户端(RestTemplate)) 通过接口注解方式定义 HTTP 请求,自动实现服务调用。 …...
单例模式(线程案例)
单例模式可以分为两种:1.饿汉模式 2.懒汉模式 一.饿汉模式 //饿汉模式👇 class MySingleTon{//因为这是一个静态成员变量,在类加载的时候,就创建了private static MySingleTon mySingleTon new MySingleTon();//创建一个静…...
HttpServletRequest 和 HttpServletResponse 不同JDK版本的引入
java中,可能会用到JWT令牌校验, 这时,大概率会用到 HttpServletRequest,和 HttpServletResponse。 若为 JDK8,SpringBoot 2.7.3 的版本则引入: import javax.servlet.http.HttpServletRequest; import ja…...