【LangChain框架学习】LangChain之Agents
- 关键字
LangChain、Agents、LLM (大语言模型)、AgentExecutor、ZeroShotAgent、ConversationalChatAgent、StructuredChatAgent、ReAct、记忆 (Memory)
文章目录
为什么需要Agents?
传统LLM应用需硬编码工具调用逻辑,而Agents通过以下优势提升开发效率:
- 降低复杂度:开发者只需定义工具,决策逻辑由Agent自动处理
- 增强适应性:同一代理可处理不同任务(如搜索、计算、翻译),无需重写逻辑
- 提升扩展性:新增工具时仅需扩展工具列表,无需修改核心代码
在构建基于大语言模型(LLM)的应用时,开发者常面临一个关键问题:如何让模型动态调用外部工具(如搜索引擎、数据库、计算器等)以完成复杂任务? LangChain的Agents模块为此提供了标准化解决方案。
- 核心定位
Agents是LangChain框架中的高级组件,赋予LLM自主决策能力。与静态调用链不同,Agent能根据用户输入实时决定:
- 是否调用工具(如查询天气、计算数学公式)
- 选择哪个工具(从预定义工具集中动态匹配)
- 如何串联工具(将前序工具的输出作为后续输入)
- 这种灵活性使其成为自动化工作流(如数据分析、智能客服)的理想选择
- 核心特性
- 动态规划:通过ReAct(Reasoning + Acting)框架实现“思考-行动”循环,逐步拆解复杂任务
- 多工具协同:支持工具组合调用(如先搜索再计算),通过AgentExecutor管理执行流程
- 记忆集成:结合ConversationBufferMemory等模块保留对话历史,实现多轮交互
- 典型应用场景
- 智能问答:自动调用搜索引擎或知识库获取实时信息(如“特斯拉CEO是谁?”)
- 数学求解:通过llm-math工具处理复杂公式(如利率计算)
- 自动化运维:执行Shell命令、管理文件等系统操作(需安全限制)
特性 | chat-conversational-react-description | structured-chat-zero-shot-react-description | chat-zero-shot-react-description | zero-shot-react-description |
---|---|---|---|---|
目标模型 | 对话式 LLM(如 GPT-4 Chat) | 对话式 LLM(如 GPT-4 Chat) | 对话式 LLM(如 GPT-4 Chat) | 通用 LLM(如 text-davinci-003) |
输入格式 | 消息列表 + 对话历史 | 消息列表(系统提示要求 JSON) | 消息列表 | 单次字符串提示 |
输出格式 | 自然语言(需解析) | 结构化数据(如 JSON) | 自然语言或半结构化 | 固定格式(如 [Action] input) |
对话上下文 | 支持(内置 ChatMemory) | 支持(但更关注单次输出) | 支持(基本对话历史) | 不支持 |
提示设计 | 自然语言 + 工具描述 + 历史 | 系统提示要求结构化输出 | 自然语言 + 工具描述 | 静态提示 + 工具描述 |
解析复杂度 | 高(需正则解析) | 低(直接解析 JSON) | 中等(正则或简单解析) | 高(严格格式要求) |
灵活性 | 高(自然交互) | 低(强制结构化) | 中等(较灵活) | 低(格式固定) |
实现基础 | ConversationalAgent | StructuredChatAgent | 基础 ReAct Chat 实现 | 基础 ReAct |
适用场景 | 需要自然对话的聊天机器人或客服系统 | 自动化任务、后台工作流、需要可靠结构化输出的系统 | 对话式任务,但无需复杂记忆或结构化输出 | 单次任务,无需对话上下文 |
示例 | 用户问“今天天气如何”,接着问“明天呢” | 代理调用工具并将结果传递给 API 或数据库 | 简单的多轮问答或工具调用 | 计算数学问题(如 5+3) |
优点 | 用户体验好,交互自然 | 输出一致,易于集成 | 平衡灵活性和对话支持 | 简单直接 |
缺点 | 输出解析复杂,可能不一致 | 不够自然,对模型要求高 | 不如 conversational 自然,不如 structured 可靠 |
import os
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com/v1",
temperature=0.7,
max_tokens=600)
构建Agent的两种方式
- 方式一:initialize_agent快速构建方式
- 方式二:AgentExecutor构建
initialize_agent快速构建方式
- 优点:
- 开发便捷性
- 单行代码即可完成代理初始化,适合快速原型开发
- 内置默认提示模板和工具调用逻辑,减少配置成本
- 学习成本低
-
无需深入理解代理内部机制,适合初学者
-
缺点:
- 灵活性受限
- 无法自定义提示词结构和工具选择策略
- 工具描述(description)对代理决策的影响难以精确控制
-
维护风险
- 已被LangChain官方弃用,未来版本可能移除支持
-
调试困难
- 中间步骤(如agent_scratchpad)的可见性差,错误定位成本高
AgentExecutor自定义方式
-
优点:
- 精细控制:
- 可完全自定义提示模板(prefix/suffix),显式声明工具规则
- 支持结构化输入输出(如JSON Schema约束工具参数)
- 精细控制:
-
性能优化
- 通过max_iterations限制推理步骤,避免无效循环
- 支持early_stopping_method快速失败转移,提升响应速度
-
扩展性强
- 可集成多种记忆模块(如ConversationBufferMemory)实现多轮对话
- 支持动态工具加载和优先级调整
-
缺点:
- 开发复杂度高
- 需手动配置代理链(LLMChain)、工具和记忆模块
- 提示词工程需要一定经验
-
初期成本增加
- 从零构建代理的代码量显著多于initialize_agent
基于initialize_agent快速构建
CONVERSATIONAL_REACT_DESCRIPTION
- 特点:
- 专门为对话场景优化,能够记住之前的对话内容。
- 基于 ReAct 框架(Reasoning and Acting),具有对话式思维过程。
- 能够保持对话上下文,进行循序渐进的推理,并以自然的方式进行交互。
- 工作流程:
- 观察(Observation):理解用户输入,分析当前对话上下文,确定需要解决的问题。
- 思考(Thought):规划解决方案,选择合适的工具,制定行动策略。
- 行动(Action):执行选定的操作,使用相关工具,生成响应。
- 结果(Result):评估执行结果,更新对话状态,准备下一步交互。
- 示例:
- 第一轮询问“特斯拉CEO是谁?”,代理会搜索并给出答案。
- 第二轮询问“用比喻的手法描述他的领导风格,注意:无需搜索。”,代理会根据记忆和自身知识生成描述。
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.memory import ConversationBufferMemory
search = DuckDuckGoSearchAPIWrapper()
tools = [Tool(
name="Search",
func=search.run,
description="仅用于事实查询,不可用于创作任务。"
)]
# 强化记忆
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True
)
# 代理配置
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True,
handle_parsing_errors=True
)
# 第一轮(正常触发工具逻辑)
result = agent.run(input="特斯拉CEO是谁?")
print(f"#### result: {result}")
# 第二轮(强制文本生成)
result = agent.run(input="用比喻的手法描述他的领导风格,注意:无需搜索。")
print(f"#### result: {result}")
Entering new AgentExecutor chain…
Thought: Do I need to use a tool? Yes
Action: Search
Action Input: 特斯拉CEO是谁?[0m
Observation: [36;1m[1;3m2010年马斯克察看特斯拉汽车的一个装配展示 2010年马斯克给加利福尼亚参议员Dianne Feinstein展示特斯拉汽车Model S 马斯克是特斯拉汽车的合伙投資者。 特斯拉汽车公司的第一款电动跑车Tesla Roadster,已在31多个国家销售超过2300辆。 特斯拉的联合创始人之一,担任首席执行官、产品架构师以及Technoking等职位。1971年6月28日出生于南非,拥有美国、南非、加拿大三重国籍 ,宾夕法尼亚大学经济学和物理学双学士 。2004年马斯克作为早期投资者进入特斯拉,2008年成为特斯拉CEO 。 特斯拉首席执行官(ceo)埃隆马斯克再次确认了今后至少5年内领导特斯拉的意志。 另外,特斯拉从6月开始在德克萨斯奥斯汀试运行无人驾驶汽车(机器人出租车)等利好因素层出不穷,但特斯拉的股价仅上涨了0.5%。 据分析,这是因为特朗普总统就任后暴跌后上升幅度很大。 1、特斯拉公司的ceo是埃隆马斯克。 埃隆·里夫·马斯克(ElonReeveMusk),1971年6月28日出生于南非的行政首都比勒陀利亚,企业家、工程师、慈善家、美国国家工程院院士,他同时兼具南非、加拿大和美国三重国籍。 特斯拉ceo埃隆·马斯克。 资料图. 当地时间6月13日,美国得克萨斯州奥斯丁迎来了可能是迄今为止最受瞩目的特斯拉股东大会。就在数天前,人们还在怀疑特斯拉ceo埃隆·马斯克能否如愿拿回560亿美元的天价绩效薪酬,不过现在这些疑虑都已被打散。[0m
Thought:[32;1m[1;3m Thought: Do I need to use a tool? No AI: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。他自2008年起担任特斯拉的首席执行官,并同时拥有产品架构师等多个职位。马斯克出生于南非,拥有美国、南非和加拿大三重国籍,是一位著名的企业家和工程师。
[0m
[1m> Finished chain.[0m
#### result: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。他自2008年起担任特斯拉的首席执行官,并同时拥有产品架构师等多个职位。马斯克出生于南非,拥有美国、南非和加拿大三重国籍,是一位著名的企业家和工程师。
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m```
Thought: Do I need to use a tool? No
AI: 埃隆·马斯克的领导风格如同一场星际探险中的船长——他既是火箭的推进器,用近乎疯狂的愿景点燃团队(比如“移民火星”),又是精密导航仪,以工程师般的执着校准每一处细节。他的决策像闪电般迅猛,有时甚至像飓风过境颠覆传统,但风暴中心始终指向北极星:让人类成为跨星球物种。若用自然比喻,他像野火与红杉的结合体,既肆意燃烧陈规,又在灰烬中培育出颠覆行业的参天巨木。
```[0m
[1m> Finished chain.[0m
#### result: 埃隆·马斯克的领导风格如同一场星际探险中的船长——他既是火箭的推进器,用近乎疯狂的愿景点燃团队(比如“移民火星”),又是精密导航仪,以工程师般的执着校准每一处细节。他的决策像闪电般迅猛,有时甚至像飓风过境颠覆传统,但风暴中心始终指向北极星:让人类成为跨星球物种。若用自然比喻,他像野火与红杉的结合体,既肆意燃烧陈规,又在灰烬中培育出颠覆行业的参天巨木。
```
```
CHAT_CONVERSATIONAL_REACT_DESCRIPTION
- 特点:
- 与 CONVERSATIONAL_REACT_DESCRIPTION 类似,也是为对话场景优化。
- 使用 Chat Model 作为 LLM,可能在对话能力上更强。
- 示例:
- 与 CONVERSATIONAL_REACT_DESCRIPTION 类似,第一轮搜索 CEO,第二轮描述领导风格。
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.memory import ConversationBufferMemory
search = DuckDuckGoSearchAPIWrapper()
tools = [Tool(
name="Search",
func=search.run,
description="仅用于事实查询,不可用于创作任务。"
)]
# 强化记忆
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True
)
# 代理配置
agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True,
handle_parsing_errors=True
)
# 第一轮(正常触发工具逻辑)
result = agent.run(input="特斯拉CEO是谁?")
print(f"#### result: {result}")
# 打印记忆状态(调试用)
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
# 第二轮(强制文本生成)
result = agent.run(input="用比喻的手法描述他的领导风格,注意:无需搜索。")
print(f"#### result: {result}")
# 打印记忆状态(调试用)
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
[1m> Entering new AgentExecutor chain…[0m
[32;1m[1;3mjson { "action": "Search", "action_input": "特斯拉CEO是谁?" }
[0m
Observation: [36;1m[1;3m2010年马斯克察看特斯拉汽车的一个装配展示 2010年马斯克给加利福尼亚参议员Dianne Feinstein展示特斯拉汽车Model S 马斯克是特斯拉汽车的合伙投資者。 特斯拉汽车公司的第一款电动跑车Tesla Roadster,已在31多个国家销售超过2300辆。 特斯拉的联合创始人之一,担任首席执行官、产品架构师以及Technoking等职位。1971年6月28日出生于南非,拥有美国、南非、加拿大三重国籍 ,宾夕法尼亚大学经济学和物理学双学士 。2004年马斯克作为早期投资者进入特斯拉,2008年成为特斯拉CEO 。 1、特斯拉公司的ceo是埃隆马斯克。 埃隆·里夫·马斯克(ElonReeveMusk),1971年6月28日出生于南非的行政首都比勒陀利亚,企业家、工程师、慈善家、美国国家工程院院士,他同时兼具南非、加拿大和美国三重国籍。 BlockBeats 消息,5 月 1 日,特斯拉 (TSLA.O) 董事长表示,有关董事会已联系猎头公司寻找新任 CEO 的媒体报道「完全不实」。特斯拉的首席执行官是埃隆 … 特斯拉ceo埃隆·马斯克。 资料图. 当地时间6月13日,美国得克萨斯州奥斯丁迎来了可能是迄今为止最受瞩目的特斯拉股东大会。就在数天前,人们还在怀疑特斯拉ceo埃隆·马斯克能否如愿拿回560亿美元的天价绩效薪酬,不过现在这些疑虑都已被打散。[0m
Thought:[32;1m[1;3mjson { "action": "Final Answer", "action_input": "特斯拉的CEO是埃隆·马斯克(Elon Reeve Musk)。他于2008年成为特斯拉的首席执行官,并同时担任产品架构师等职位。马斯克出生于南非,拥有美国、南非和加拿大三重国籍,是特斯拉的早期投资者和联合创始人之一。" }
[0m
[1m> Finished chain.[0m
#### result: 特斯拉的CEO是埃隆·马斯克(Elon Reeve Musk)。他于2008年成为特斯拉的首席执行官,并同时担任产品架构师等职位。马斯克出生于南非,拥有美国、南非和加拿大三重国籍,是特斯拉的早期投资者和联合创始人之一。
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='特斯拉的CEO是埃隆·马斯克(Elon Reeve Musk)。他于2008年成为特斯拉的首席执行官,并同时担任产品架构师等职位。马斯克出生于南非,拥有美国、南非和加拿大三重国籍,是特斯拉的早期投资者和联合创始人之一。', additional_kwargs={}, response_metadata={})]}
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m```json
{
"action": "Final Answer",
"action_input": "埃隆·马斯克的领导风格如同一台高速运转的火箭引擎——充满爆发力且目标明确。他像一位星际船长,既敢于设定看似不可能的航向(如移民火星),又以近乎苛刻的细节把控推动团队突破极限。这种风格混合了‘未来先知’的宏大愿景与‘工程师暴君’的偏执执行,如同用电弧焊接理想主义与现实主义。"
}
```[0m
[1m> Finished chain.[0m
#### result: 埃隆·马斯克的领导风格如同一台高速运转的火箭引擎——充满爆发力且目标明确。他像一位星际船长,既敢于设定看似不可能的航向(如移民火星),又以近乎苛刻的细节把控推动团队突破极限。这种风格混合了‘未来先知’的宏大愿景与‘工程师暴君’的偏执执行,如同用电弧焊接理想主义与现实主义。
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='特斯拉的CEO是埃隆·马斯克(Elon Reeve Musk)。他于2008年成为特斯拉的首席执行官,并同时担任产品架构师等职位。马斯克出生于南非,拥有美国、南非和加拿大三重国籍,是特斯拉的早期投资者和联合创始人之一。', additional_kwargs={}, response_metadata={}), HumanMessage(content='用比喻的手法描述他的领导风格,注意:无需搜索。', additional_kwargs={}, response_metadata={}), AIMessage(content='埃隆·马斯克的领导风格如同一台高速运转的火箭引擎——充满爆发力且目标明确。他像一位星际船长,既敢于设定看似不可能的航向(如移民火星),又以近乎苛刻的细节把控推动团队突破极限。这种风格混合了‘未来先知’的宏大愿景与‘工程师暴君’的偏执执行,如同用电弧焊接理想主义与现实主义。', additional_kwargs={}, response_metadata={})]}
CHAT_ZERO_SHOT_REACT_DESCRPTION
- 特点:
- 使用 Chat Model 作为 LLM。
- 基于 ReAct 框架,但可能不具备像 CONVERSATIONAL_REACT_DESCRIPTION 那样强的对话记忆能力。
- 工作流程:
- 根据工具的描述选择合适的工具来执行。
- 示例:
与 CONVERSATIONAL_REACT_DESCRIPTION 类似,第一轮搜索 CEO,第二轮尝试描述领导风格,但可能因为缺乏上下文而无法给出准确答案。
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.memory import ConversationBufferMemory
from langchain.tools import Tool
from langchain.docstore import InMemoryDocstore
from langchain.agents.react.base import DocstoreExplorer
from langchain_community.vectorstores import faiss
docstore = InMemoryDocstore({})
docstore_explorer = DocstoreExplorer(docstore)
# 2. 配置工具
tools = [
Tool(
name="Search",
func=DuckDuckGoSearchAPIWrapper().run,
description="用于搜索互联网上的实时信息"
),
Tool(
name="Lookup",
func=docstore_explorer.search,
description="用于在文档存储中查找已保存的信息"
)
]
# 3. 配置记忆和代理
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True
)
agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION
,
memory=memory,
verbose=True,
handle_parsing_errors=True,
max_iterations=3,
early_stopping_method="generate"
)
# 4. 测试代码
def test_docstore_agent():
try:
# 第一轮:使用搜索工具获取信息
result1 = agent.run(input="特斯拉CEO是谁?")
print(f"#### 第一轮结果: {result1}")
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
# 保存搜索结果到文档存储
docstore.add({
"tesla_ceo": result1
})
# 第二轮:从文档存储中查找信息
result2 = agent.run(input="请描述一下这位CEO的特点")
print(f"\n#### 第二轮结果: {result2}")
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
except Exception as e:
print(f"执行出错: {str(e)}")
if __name__ == "__main__":
test_docstore_agent()
[1m> Entering new AgentExecutor chain…[0m
[32;1m[1;3mThought: 我需要查找特斯拉的现任CEO是谁。特斯拉是一家知名的电动汽车公司,其CEO信息应该是公开的。
Action:
{ "action": "Search", "action_input": "特斯拉现任CEO" }
[0m
Observation: [36;1m[1;3m特斯拉股東已經要求特斯拉董事會準備失去马斯克接應計畫,特斯拉董事会亦有讨论是否应该准备和维护一份"关键人物风险"报告。 … 12月18日,马斯克在推特发起投票以决定自己是否辞去推特首席执行官(ceo)一职,最终有1750万人同意其辞职,占总数57.5% … 据《华尔街日报》报道, 特斯拉 董事会自3月起已联系多家猎头公司,并选定重点合作对象,寻求替代现任CEO马斯克。这个消息随机引起全球震动。虽然马斯克本人表示《华尔街日报》的文章蓄意造假,而 特斯拉 董事长罗宾・丹霍姆(Robyn Denholm)也在社交平台明确表示媒体报道"绝对错误"… 近日有报道称,特斯拉董事会正在物色新的首席执行官以取代现任ceo埃隆•马斯克。对此,特斯拉方面已明确予以否认。特斯拉董事长罗宾•丹霍姆 … 12月7日晚,据媒体报道,特斯拉ceo埃隆·马斯克已确认其职位的继任者——特斯拉现任全球副总裁、大中华区ceo朱晓彤。不过,朱晓彤的职责范围仅限于汽车业务,而不包括自动驾驶和机器人项目。 而特斯拉也同样危机重重,特别是在全球最大汽车市场的中国,比亚迪等中国车企也在创造汽车界的"DeepSeek时刻",从充电到智能驾驶技术,特斯拉既"卷不起价格",也"拼不起实力"。 "或许在他看来,凭借现有成就,自己完全有资格在政坛小试牛刀。[0m
Thought:[32;1m[1;3mFinal Answer: 特斯拉的现任CEO是埃隆·马斯克(Elon Musk)。[0m
[1m> Finished chain.[0m
#### 第一轮结果: 特斯拉的现任CEO是埃隆·马斯克(Elon Musk)。
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='特斯拉的现任CEO是埃隆·马斯克(Elon Musk)。', additional_kwargs={}, response_metadata={})]}
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3mCould not parse LLM output: 为了回答这个问题,我需要更多的具体信息,比如这位CEO的名字或所在的公司。如果您能提供这些信息,我可以帮助您更准确地描述这位CEO的特点。
如果您想了解某位知名CEO的特点,可以告诉我名字,比如埃隆·马斯克(Elon Musk)、杰夫·贝索斯(Jeff Bezos)、蒂姆·库克(Tim Cook)等,我可以为您提供详细的描述。
请提供更多细节,以便我能更好地回答您的问题。
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE [0m
Observation: Invalid or incomplete response
Thought:[32;1m[1;3mCould not parse LLM output: 为了准确描述一位CEO的特点,我需要知道具体的名字或公司信息。以下是一些知名CEO的通用特点分类,您可以根据需要参考或指定某一位:
### 常见CEO特点分类:
1. **创新驱动型**
- 例如埃隆·马斯克(特斯拉/SpaceX):突破性技术追求、高风险容忍度、长期愿景。
- 特点:颠覆行业、频繁公开表态、多任务并行。
2. **运营效率型**
- 例如蒂姆·库克(苹果):供应链管理大师、注重细节、低调务实。
- 特点:稳定增长、强调团队协作、数据驱动决策。
3. **用户至上型**
- 例如杰夫·贝索斯(亚马逊):客户体验为核心、长期投资、快速迭代。
- 特点:Day 1文化、规模化思维、容忍失败。
4. **变革领导者**
- 例如萨提亚·纳德拉(微软):文化转型、开放合作、云优先战略。
- 特点:同理心管理、技术赋能、收购整合能力。
**请提供具体名字或公司,我将给出针对性分析。**
(例如:您想了解阿里巴巴的马云,还是字节跳动的张一鸣?)
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE [0m
Observation: Invalid or incomplete response
Thought:[32;1m[1;3mFinal Answer: 由于您没有提供具体的CEO名字或公司信息,我无法针对某一位CEO进行详细描述。以下是几种常见CEO类型及其典型特点,供您参考:
1. **创新驱动型CEO**
- 代表:埃隆·马斯克(特斯拉/SpaceX)
- 特点:敢于冒险、颠覆传统行业、注重技术突破、擅长公众沟通。
2. **稳健运营型CEO**
- 代表:蒂姆·库克(苹果)
- 特点:精细化运营、注重供应链管理、追求稳定增长、低调务实。
3. **用户中心型CEO**
- 代表:杰夫·贝索斯(亚马逊)
- 特点:长期主义、极度关注客户需求、快速试错迭代。
4. **文化变革型CEO**
- 代表:萨提亚·纳德拉(微软)
- 特点:推动组织文化转型、开放合作、技术赋能。
如果您能提供具体的CEO姓名或公司名称(例如:马云、扎克伯格、谷歌CEO等),我可以给出更精准的分析。[0m
[1m> Finished chain.[0m
#### 第二轮结果: 由于您没有提供具体的CEO名字或公司信息,我无法针对某一位CEO进行详细描述。以下是几种常见CEO类型及其典型特点,供您参考:
1. **创新驱动型CEO**
- 代表:埃隆·马斯克(特斯拉/SpaceX)
- 特点:敢于冒险、颠覆传统行业、注重技术突破、擅长公众沟通。
2. **稳健运营型CEO**
- 代表:蒂姆·库克(苹果)
- 特点:精细化运营、注重供应链管理、追求稳定增长、低调务实。
3. **用户中心型CEO**
- 代表:杰夫·贝索斯(亚马逊)
- 特点:长期主义、极度关注客户需求、快速试错迭代。
4. **文化变革型CEO**
- 代表:萨提亚·纳德拉(微软)
- 特点:推动组织文化转型、开放合作、技术赋能。
如果您能提供具体的CEO姓名或公司名称(例如:马云、扎克伯格、谷歌CEO等),我可以给出更精准的分析。
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='特斯拉的现任CEO是埃隆·马斯克(Elon Musk)。', additional_kwargs={}, response_metadata={}), HumanMessage(content='请描述一下这位CEO的特点', additional_kwargs={}, response_metadata={}), AIMessage(content='由于您没有提供具体的CEO名字或公司信息,我无法针对某一位CEO进行详细描述。以下是几种常见CEO类型及其典型特点,供您参考:\n\n1. **创新驱动型CEO** \n - 代表:埃隆·马斯克(特斯拉/SpaceX) \n - 特点:敢于冒险、颠覆传统行业、注重技术突破、擅长公众沟通。\n\n2. **稳健运营型CEO** \n - 代表:蒂姆·库克(苹果) \n - 特点:精细化运营、注重供应链管理、追求稳定增长、低调务实。\n\n3. **用户中心型CEO** \n - 代表:杰夫·贝索斯(亚马逊) \n - 特点:长期主义、极度关注客户需求、快速试错迭代。\n\n4. **文化变革型CEO** \n - 代表:萨提亚·纳德拉(微软) \n - 特点:推动组织文化转型、开放合作、技术赋能。\n\n如果您能提供具体的CEO姓名或公司名称(例如:马云、扎克伯格、谷歌CEO等),我可以给出更精准的分析。', additional_kwargs={}, response_metadata={})]}
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
- 特点:
- 与 CHAT_ZERO_SHOT_REACT_DESCRIPTION 类似,但可能更适合处理结构化输入和输出。
-
工作流程:
使用结构化的方式调用工具并生成结果。示例:
与 CHAT_ZERO_SHOT_REACT_DESCRIPTION 类似,第一轮搜索 CEO,第二轮尝试描述领导风格,但可能因为缺乏上下文而无法给出准确答案。
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.memory import ConversationBufferMemory
from langchain.tools import Tool
from langchain.docstore import InMemoryDocstore
from langchain.agents.react.base import DocstoreExplorer
from langchain_community.vectorstores import faiss
docstore = InMemoryDocstore({})
docstore_explorer = DocstoreExplorer(docstore)
# 2. 配置工具
tools = [
Tool(
name="Search",
func=DuckDuckGoSearchAPIWrapper().run,
description="用于搜索互联网上的实时信息"
),
Tool(
name="Lookup",
func=docstore_explorer.search,
description="用于在文档存储中查找已保存的信息"
)
]
# 3. 配置记忆和代理
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True
)
agent = initialize_agent(
tools,
llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
memory=memory,
verbose=True,
handle_parsing_errors=True,
max_iterations=3,
early_stopping_method="generate"
)
# 4. 测试代码
def test_docstore_agent():
try:
# 第一轮:使用搜索工具获取信息
result1 = agent.run(input="特斯拉CEO是谁?")
print(f"#### 第一轮结果: {result1}")
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
# 保存搜索结果到文档存储
docstore.add({
"tesla_ceo": result1
})
# 第二轮:从文档存储中查找信息
result2 = agent.run(input="请描述一下这位CEO的特点")
print(f"\n#### 第二轮结果: {result2}")
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
except Exception as e:
print(f"执行出错: {str(e)}")
if __name__ == "__main__":
test_docstore_agent()
[1m> Entering new AgentExecutor chain…[0m
[32;1m[1;3mAction:
{ "action": "Search", "action_input": "特斯拉CEO是谁" }
[0m
Observation: [36;1m[1;3m2010年马斯克察看特斯拉汽车的一个装配展示 2010年马斯克给加利福尼亚参议员Dianne Feinstein展示特斯拉汽车Model S 马斯克是特斯拉汽车的合伙投資者。 特斯拉汽车公司的第一款电动跑车Tesla Roadster,已在31多个国家销售超过2300辆。 特斯拉的联合创始人之一,担任首席执行官、产品架构师以及Technoking等职位。1971年6月28日出生于南非,拥有美国、南非、加拿大三重国籍 ,宾夕法尼亚大学经济学和物理学双学士 。2004年马斯克作为早期投资者进入特斯拉,2008年成为特斯拉CEO 。 特斯拉首席执行官(ceo)埃隆马斯克再次确认了今后至少5年内领导特斯拉的意志。 另外,特斯拉从6月开始在德克萨斯奥斯汀试运行无人驾驶汽车(机器人出租车)等利好因素层出不穷,但特斯拉的股价仅上涨了0.5%。 据分析,这是因为特朗普总统就任后暴跌后上升幅度很大。 特斯拉ceo埃隆·马斯克。 资料图. 当地时间6月13日,美国得克萨斯州奥斯丁迎来了可能是迄今为止最受瞩目的特斯拉股东大会。就在数天前,人们还在怀疑特斯拉ceo埃隆·马斯克能否如愿拿回560亿美元的天价绩效薪酬,不过现在这些疑虑都已被打散。 在 特斯拉 ceo埃隆·马斯克离开政府效率部(doge)和特朗普政府后,韦德布什证券公司的董事总经理丹·艾夫斯重申了他对特斯拉股票的看涨观点 …[0m
Thought:[32;1m[1;3mAction:
{ "action": "Final Answer", "action_input": "特斯拉的CEO是埃隆·马斯克(Elon Musk)。" }
[0m
[1m> Finished chain.[0m
#### 第一轮结果: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='特斯拉的CEO是埃隆·马斯克(Elon Musk)。', additional_kwargs={}, response_metadata={})]}
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m为了回答您的问题,我需要了解您指的是哪位CEO。您能提供具体的CEO姓名或公司名称吗?这样我可以为您提供更准确的信息。[0m
[1m> Finished chain.[0m
#### 第二轮结果: 为了回答您的问题,我需要了解您指的是哪位CEO。您能提供具体的CEO姓名或公司名称吗?这样我可以为您提供更准确的信息。
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='特斯拉的CEO是埃隆·马斯克(Elon Musk)。', additional_kwargs={}, response_metadata={}), HumanMessage(content='请描述一下这位CEO的特点', additional_kwargs={}, response_metadata={}), AIMessage(content='为了回答您的问题,我需要了解您指的是哪位CEO。您能提供具体的CEO姓名或公司名称吗?这样我可以为您提供更准确的信息。', additional_kwargs={}, response_metadata={})]}
REACT_DOCSTORE
REACT_DOCSTORE 类型的 Agent 必须要有两个特定的工具:
- 特点:
- 需要两个特定的工具:Search 和 Lookup。
- Search 用于搜索互联网上的实时信息。
- Lookup 用于在文档存储中查找已保存的信息。
- 工作流程:
- 代理首先使用 Search 工具查找信息,然后将信息存储在文档存储中。
- 后续的查询可以使用 Lookup 工具从文档存储中检索信息。
- 示例:
- 第一轮询问“特斯拉CEO是谁?”,代理会搜索并给出答案,并将答案存储在文档存储中。
- 第二轮询问“请描述一下这位CEO的特点”,代理可能会尝试从文档存储中查找相关信息。
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.memory import ConversationBufferMemory
from langchain.tools import Tool
from langchain.docstore import InMemoryDocstore
from langchain.agents.react.base import DocstoreExplorer
from langchain_community.vectorstores import faiss
docstore = InMemoryDocstore({})
docstore_explorer = DocstoreExplorer(docstore)
# 2. 配置工具
tools = [
Tool(
name="Search",
func=DuckDuckGoSearchAPIWrapper().run,
description="用于搜索互联网上的实时信息"
),
Tool(
name="Lookup",
func=docstore_explorer.search,
description="用于在文档存储中查找已保存的信息"
)
]
# 3. 配置记忆和代理
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True
)
agent = initialize_agent(
tools,
llm,
agent=AgentType.REACT_DOCSTORE,
memory=memory,
verbose=True,
handle_parsing_errors=True,
max_iterations=3,
early_stopping_method="generate"
)
# 4. 测试代码
def test_docstore_agent():
try:
# 第一轮:使用搜索工具获取信息
result1 = agent.run(input="特斯拉CEO是谁?")
print(f"#### 第一轮结果: {result1}")
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
# 保存搜索结果到文档存储
docstore.add({
"tesla_ceo": result1
})
# 第二轮:从文档存储中查找信息
result2 = agent.run(input="请描述一下这位CEO的特点")
print(f"\n#### 第二轮结果: {result2}")
print("\n[记忆状态]")
print(memory.load_memory_variables({}))
except Exception as e:
print(f"执行出错: {str(e)}")
if __name__ == "__main__":
test_docstore_agent()
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3mAction: Search[特斯拉CEO][0m
Observation: [36;1m[1;3m特斯拉股東已經要求特斯拉董事會準備失去马斯克接應計畫,特斯拉董事会亦有讨论是否应该准备和维护一份"关键人物风险"报告。 ... 12月18日,马斯克在推特发起投票以决定自己是否辞去推特首席执行官(ceo)一职,最终有1750万人同意其辞职,占总数57.5% ... (纽约21日讯)美国电动车公司特斯拉(Tesla)首席执行员马斯克说,未来五年他将继续担任特斯拉CEO,缓解了一些投资者对他无法专注经营特斯拉的担忧。现年53岁的马斯克星期二(5月20日)以远程方式,出席在多哈举行的卡塔尔经济论坛。特拉华州衡平法院一名法官两次裁定2018年特斯拉授予马斯 ... 据华尔街日报周三报道,特斯拉董事会已开始寻找继任马斯克的首席执行官。报道援引知情人士消息称,自从马斯克将工作重心放在白宫事务开始,部分投资者的不满情绪日益增长,特斯拉内部紧张局势也逐渐加剧。约一个月前,在特斯拉股价不断下跌之际,特斯拉董事会开始认真寻找马斯克的继任 ... 特斯拉董事长:有关董事会已联系猎头公司寻找新任CEO的媒体报道"完全不实" 特斯拉首席执行官埃隆·马斯克接连发布多条内容,对《华尔街日报 ... 而特斯拉也同样危机重重,特别是在全球最大汽车市场的中国,比亚迪等中国车企也在创造汽车界的"DeepSeek时刻",从充电到智能驾驶技术,特斯拉既"卷不起价格",也"拼不起实力"。 "或许在他看来,凭借现有成就,自己完全有资格在政坛小试牛刀。[0m
Thought:[32;1m[1;3m根据搜索结果,特斯拉的CEO是埃隆·马斯克(Elon Musk)。尽管有报道提到特斯拉董事会讨论过寻找继任者的问题,但目前马斯克仍然是特斯拉的首席执行官。
Action: Finish[埃隆·马斯克][0m
[1m> Finished chain.[0m
#### 第一轮结果: 埃隆·马斯克
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='埃隆·马斯克', additional_kwargs={}, response_metadata={})]}
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3mCould not parse LLM Output: 要描述一位CEO的特点,通常需要了解其个人背景、管理风格、行业成就以及公众形象等信息。由于您未提供具体的CEO姓名或公司名称,以下是一个通用的框架,您可以根据实际情况补充细节:
---
### **CEO的典型特点描述**(以知名CEO为例):
1. **战略眼光**
- 擅长制定长期愿景,如亚马逊的贝索斯(Jeff Bezos)强调“长期主义”,推动公司跨越式发展。
- 对行业趋势敏锐,如特斯拉的马斯克(Elon Musk)押注新能源和太空技术。
2. **领导力风格**
- **变革型**:激励团队创新(如苹果的蒂姆·库克)。
- **务实型**:注重效率和执行力(如微软的萨提亚·纳德拉)。
3. **创新能力**
- 推动颠覆性产品或商业模式,如Netflix的里德·哈斯廷斯(Reed Hastings)转型流媒体。
4. **危机管理能力**
- 在逆境中稳定公司,如星巴克的霍华德·舒尔茨(Howard Schultz)多次带领公司度过低谷。
5. **公众形象**
- 高调 vs. 低调:马斯克活跃于社交媒体,而伯克希尔的巴菲特更低调务实。
- 社会责任感:如Patagonia的CEO将利润投入环保。
6. **个人特质**
- 坚韧、冒险精神(如马云早期创业经历)。
- 学习能力(如谷歌的桑达尔·皮查伊从工程师成长为CEO)。
---
### 如果需要具体分析某位CEO,请提供更多信息(如姓名、公司或行业),我可以为您定制回答!
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE [0m
Observation: Invalid or incomplete response
Thought:[32;1m[1;3mAction: Finish[请提供具体的CEO姓名或公司名称,以便更准确地描述其特点。][0m
[1m> Finished chain.[0m
#### 第二轮结果: 请提供具体的CEO姓名或公司名称,以便更准确地描述其特点。
[记忆状态]
{'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='埃隆·马斯克', additional_kwargs={}, response_metadata={}), HumanMessage(content='请描述一下这位CEO的特点', additional_kwargs={}, response_metadata={}), AIMessage(content='请提供具体的CEO姓名或公司名称,以便更准确地描述其特点。', additional_kwargs={}, response_metadata={})]}
SELF_ASK_WITH_SEARCH
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory
from langchain.utilities import DuckDuckGoSearchAPIWrapper
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
search_tool = DuckDuckGoSearchAPIWrapper()
docstore_explorer = DocstoreExplorer(docstore)
tools = [
Tool(
name="Intermediate Answer",
func=DuckDuckGoSearchAPIWrapper().run,
description="用于搜索互联网上的实时信息"
)]
agent = initialize_agent(tools=tools,
llm=llm,
agent=AgentType.SELF_ASK_WITH_SEARCH,
memory=memory,
verbose=True,
handle_parsing_errors=True,
max_iterations=5, # 限制最大迭代次数
early_stopping_method="generate"
)
response = agent.run(input="特斯拉CEO是谁?请描述一下这位CEO的特点?")
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3mYes.
Follow up: Who is the CEO of Tesla?[0m
Intermediate answer: [36;1m[1;3mMusk is the cofounder, CEO, and product architect at Tesla Motors, a company formed in 2003 that is dedicated to producing affordable, mass-market electric cars as well as battery products and ... Elon Musk cofounded seven companies, including electric car maker Tesla, rocket producer SpaceX and artificial intelligence startup xAI. He owns about 12% of Tesla excluding options, but has ... Elon Musk is the charismatic CEO of electric car maker Tesla and rocket manufacturer SpaceX. Following a contested process, Musk completed a deal to buy the company behind X in October 2022 ... Musk's recommitment to Tesla comes a few weeks after the Wall Street Journal reported that the electric vehicle company had taken steps to work on a formal process to find a new CEO following ... DOHA - Elon Musk said he plans to significantly cut political spending and is committed to staying on as Tesla's CEO for another five years, aiming to address concerns about balancing his role at ...[0m
[32;1m[1;3mCould not parse output: So the final answer is: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。他的特点包括:
1. **创新与冒险精神**:马斯克是多家高科技公司的创始人或领导者(如特斯拉、SpaceX、Neuralink等),致力于推动电动汽车、太空探索和人工智能等前沿领域。
2. **多任务管理能力**:同时管理多家企业,展现极强的跨领域领导力。
3. **争议性**:以直言不讳的个性和活跃的社交媒体行为闻名,常引发公众讨论。
4. **长期愿景**:如承诺未来五年继续领导特斯拉,专注于可持续能源和科技突破。
5. **政治立场**:近年减少政治支出,但个人言论常涉及政策议题。
(注:回答综合了公开报道中的关键信息,部分表述经过简化。)
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE [0m
Intermediate answer: Invalid or incomplete response
[32;1m[1;3mCould not parse output: So the final answer is: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。他的特点包括:
1. **创新与冒险精神**:马斯克是多家高科技公司的创始人或领导者(如特斯拉、SpaceX、Neuralink等),致力于推动电动汽车、太空探索和人工智能等前沿领域。
2. **多任务管理能力**:同时管理多家企业,展现极强的跨领域领导力。
3. **争议性**:以直言不讳的个性和活跃的社交媒体行为闻名,常引发公众讨论。
4. **长期愿景**:如承诺未来五年继续领导特斯拉,专注于可持续能源和科技突破。
5. **政治立场**:近年减少政治支出,但个人言论常涉及政策议题。
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE [0m
Intermediate answer: Invalid or incomplete response
[32;1m[1;3mCould not parse output: So the final answer is: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。他的特点包括:
1. **创新与冒险精神**:马斯克是多家高科技公司的创始人或领导者(如特斯拉、SpaceX、Neuralink等),致力于推动电动汽车、太空探索和人工智能等前沿领域。
2. **多任务管理能力**:同时管理多家企业,展现极强的跨领域领导力。
3. **争议性**:以直言不讳的个性和活跃的社交媒体行为闻名,常引发公众讨论。
4. **长期愿景**:如承诺未来五年继续领导特斯拉,专注于可持续能源和科技突破。
5. **政治立场**:近年减少政治支出,但个人言论常涉及政策议题。
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE [0m
Intermediate answer: Invalid or incomplete response
[32;1m[1;3mCould not parse output: So the final answer is: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。他的特点包括:
1. **创新与冒险精神**:马斯克是多家高科技公司的创始人或领导者(如特斯拉、SpaceX、Neuralink等),致力于推动电动汽车、太空探索和人工智能等前沿领域。
2. **多任务管理能力**:同时管理多家企业,展现极强的跨领域领导力。
3. **争议性**:以直言不讳的个性和活跃的社交媒体行为闻名,常引发公众讨论。
4. **长期愿景**:如承诺未来五年继续领导特斯拉,专注于可持续能源和科技突破。
5. **政治立场**:近年减少政治支出,但个人言论常涉及政策议题。
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE [0m
Intermediate answer: Invalid or incomplete response
OutputParserException: Could not parse output: So the final answer is: 特斯拉的CEO是埃隆·马斯克(Elon Musk)。他的特点包括:
1. **创新与冒险精神**:马斯克是多家高科技公司的创始人或领导者(如特斯拉、SpaceX、Neuralink等),致力于推动电动汽车、太空探索和人工智能等前沿领域。
2. **多任务管理能力**:同时管理多家企业,展现极强的跨领域领导力。
3. **争议性**:以直言不讳的个性和活跃的社交媒体行为闻名,常引发公众讨论。
4. **长期愿景**:如承诺未来五年继续领导特斯拉,专注于可持续能源和科技突破。
5. **政治立场**:近年减少政治支出,但个人言论常涉及政策议题。
For troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE
通过AgentExecutor自定义
ZeroShotAgent
from langchain.agents import AgentExecutor, ZeroShotAgent, Tool
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI # 或其他LLM
search = DuckDuckGoSearchAPIWrapper()
# 1. 定义工具
tools = [
Tool(
name="Search",
func=search.run,
description="仅用于事实查询,不可用于创作任务。"
)
]
# 2. 配置记忆模块
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True
)
# 3. 创建自定义提示模板(支持多轮对话)
prefix = """你是一个专业助手,请根据工具描述选择操作。已提供以下工具:"""
suffix = """开始!注意:若问题无需工具,请直接回答。\n\n历史对话:\n{chat_history}\n\n当前问题:{input}\n\n思考过程:{agent_scratchpad}"""
prompt = ZeroShotAgent.create_prompt(
tools,
prefix=prefix,
suffix=suffix,
input_variables=["input", "chat_history", "agent_scratchpad"]
)
print(f"#### Prompt Template:\n{prompt.template}\n")
# 4. 构建Agent与Executor
llm_chain = LLMChain(llm=llm, prompt=prompt)
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
verbose=True,
handle_parsing_errors=True,
max_iterations=3
)
result = agent_executor.run(input="特斯拉CEO是谁?")
print(f"#### result: {result}")
result = agent_executor.run(input="用比喻的手法描述他的领导风格,注意:无需搜索。")
print(f"#### result: {result}")
#### Prompt Template:
你是一个专业助手,请根据工具描述选择操作。已提供以下工具:
Search(query: str) -> str - 仅用于事实查询,不可用于创作任务。
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 [Search]
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 question
开始!注意:若问题无需工具,请直接回答。
历史对话:
{chat_history}
当前问题:{input}
思考过程:{agent_scratchpad}
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3mThought: The question is asking for a factual piece of information about who the CEO of Tesla is. Since this is a factual query, I should use the Search tool to find the current CEO of Tesla.
Action: Search
Action Input: "current CEO of Tesla"
[0m
Observation: [36;1m[1;3mElon Musk cofounded seven companies, including electric car maker Tesla, rocket producer SpaceX and artificial intelligence startup xAI. He owns about 12% of Tesla excluding options, but has ... Elon Musk, CEO. Musk's involvement with Tesla began in 2004, when he invested $6.35 million in the company during a Series A funding round. The entrepreneur, who had formerly co-founded PayPal ... Musk is the CEO of Tesla, a position he's held since 2008. Vaibhav Taneja is the company's chief financial officer. ... The current chair of the board at Tesla is Robyn Denholm. Denholm has held ... Musk is the cofounder, CEO, and product architect at Tesla Motors, a company formed in 2003 that is dedicated to producing affordable, mass-market electric cars as well as battery products and ... Musk is CEO of publicly traded Tesla, the world's most valuable carmaker, and closely held rocket business SpaceX. Musk owns about 13% of Tesla, according to the company's 2024 proxy statement.[0m
Thought:[32;1m[1;3mThought: Based on the search results, it is clear that Elon Musk is the current CEO of Tesla, a position he has held since 2008.
Final Answer: The CEO of Tesla is Elon Musk.[0m
[1m> Finished chain.[0m
#### result: The CEO of Tesla is Elon Musk.
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3mThought: The user is asking for a metaphorical description of Elon Musk's leadership style, which is a creative task that doesn't require factual search. I can draw upon common knowledge about Musk's public persona and leadership traits.
Final Answer: Elon Musk的领导风格就像一位星际飞船的船长——他目光紧盯火星(远大目标),不惧在未知宇宙中颠簸(高风险决策),用近乎偏执的完美主义校准每个零件(对细节的严苛),同时用推特喇叭(高调沟通)向全宇宙广播他的航行日志。时而像闪电般突然转向(颠覆性创新),却总能让船员们在抱怨中跟着他穿越引力场(挑战极限)。[0m
[1m> Finished chain.[0m
#### result: Elon Musk的领导风格就像一位星际飞船的船长——他目光紧盯火星(远大目标),不惧在未知宇宙中颠簸(高风险决策),用近乎偏执的完美主义校准每个零件(对细节的严苛),同时用推特喇叭(高调沟通)向全宇宙广播他的航行日志。时而像闪电般突然转向(颠覆性创新),却总能让船员们在抱怨中跟着他穿越引力场(挑战极限)。
ConversationalChatAgent
from langchain.agents import AgentExecutor, Tool
from langchain.memory import ConversationBufferMemory
from langchain.agents.conversational_chat.prompt import PREFIX, SUFFIX
from langchain.agents.conversational_chat.base import ConversationalChatAgent
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.chains.llm import LLMChain
from langchain.prompts import MessagesPlaceholder
# 1. 初始化组件
search = DuckDuckGoSearchAPIWrapper()
# 2. 定义工具(强化约束条件)
tools = [
Tool(
name="Search",
func=search.run,
description="严格限制:仅当问题涉及实时性事实(如人物、事件、数据)时使用,禁止用于主观创作。"
)
]
# 3. 配置记忆模块(带结构化控制)
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True,
human_prefix="用户",
ai_prefix="助手"
)
# 4. 自定义提示模板(显式声明工具禁用规则)
prompt = ConversationalChatAgent.create_prompt(
tools,
system_message=PREFIX + "\n特别规则:当用户明确要求'无需搜索'时,必须跳过工具调用。",
human_message=SUFFIX,
input_variables=["input", "chat_history", "agent_scratchpad"]
)
# 5. 构建代理链
llm_chain = LLMChain(llm=llm, prompt=prompt)
agent_obj = ConversationalChatAgent(
llm_chain=llm_chain,
tools=tools,
verbose=True
)
# 6. 创建执行器(带严格错误处理)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent_obj,
tools=tools,
memory=memory,
max_iterations=3,
handle_parsing_errors=True,
early_stopping_method="generate"
)
# 7. 执行任务
# 第一轮(触发搜索)
result1 = agent_executor.run(input="特斯拉CEO是谁?")
print(f"#### 第一轮结果: {result1}")
print("\n[记忆状态]", memory.load_memory_variables({}))
# 第二轮(强制文本生成)
result2 = agent_executor.run(input="用比喻的手法描述他的领导风格,注意:无需使用工具。")
print(f"#### 第二轮结果: {result2}")
print("\n[记忆状态]", memory.load_memory_variables({}))
#### 第一轮结果: 根据查询到的信息,特斯拉的CEO是埃隆·马斯克(Elon Musk)。他于2008年成为特斯拉CEO,并同时担任公司产品架构师等职位。马斯克出生于南非,拥有美国、南非、加拿大三重国籍,是宾夕法尼亚大学经济学和物理学双学士。
[记忆状态] {'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='根据查询到的信息,特斯拉的CEO是埃隆·马斯克(Elon Musk)。他于2008年成为特斯拉CEO,并同时担任公司产品架构师等职位。马斯克出生于南非,拥有美国、南非、加拿大三重国籍,是宾夕法尼亚大学经济学和物理学双学士。', additional_kwargs={}, response_metadata={})]}
#### 第二轮结果: 埃隆·马斯克的领导风格如同火箭引擎——既充满爆发力又精准可控。他像一位星际船长,以近乎偏执的愿景驱动团队突破重力束缚(行业常规),同时像电路板上的电流般亲力亲为,在细节与宏图之间高频切换。这种风格混合了闪电(决策速度)与熔岩(持久热忱)的特质,时而灼伤传统,却总能在灰烬中锻造出新大陆的轮廓。
[记忆状态] {'chat_history': [HumanMessage(content='特斯拉CEO是谁?', additional_kwargs={}, response_metadata={}), AIMessage(content='根据查询到的信息,特斯拉的CEO是埃隆·马斯克(Elon Musk)。他于2008年成为特斯拉CEO,并同时担任公司产品架构师等职位。马斯克出生于南非,拥有美国、南非、加拿大三重国籍,是宾夕法尼亚大学经济学和物理学双学士。', additional_kwargs={}, response_metadata={}), HumanMessage(content='用比喻的手法描述他的领导风格,注意:无需使用工具。', additional_kwargs={}, response_metadata={}), AIMessage(content='埃隆·马斯克的领导风格如同火箭引擎——既充满爆发力又精准可控。他像一位星际船长,以近乎偏执的愿景驱动团队突破重力束缚(行业常规),同时像电路板上的电流般亲力亲为,在细节与宏图之间高频切换。这种风格混合了闪电(决策速度)与熔岩(持久热忱)的特质,时而灼伤传统,却总能在灰烬中锻造出新大陆的轮廓。', additional_kwargs={}, response_metadata={})]}
StructuredChatAgent
from langchain.agents import AgentExecutor, Tool
from langchain.agents.structured_chat.base import StructuredChatAgent
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.utilities import DuckDuckGoSearchAPIWrapper
from langchain.docstore import InMemoryDocstore
from langchain.agents.react.base import DocstoreExplorer
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
docstore = InMemoryDocstore({})
docstore_explorer = DocstoreExplorer(docstore)
# 2. 定义工具(带JSON Schema约束)
tools = [
Tool(
name="Search",
func=DuckDuckGoSearchAPIWrapper().run,
description="用于搜索互联网上的实时信息", # 修改 description 字段
),
Tool(
name="Lookup",
func=docstore_explorer.search,
description="用于在文档存储中查找已保存的信息", # 修改 description 字段
)
]
# 3. 配置记忆模块(结构化存储)
memory = ConversationBufferMemory(
memory_key="chat_history",
input_key="input",
output_key="output",
return_messages=True,
human_prefix="用户",
ai_prefix="助手"
)
# 4. 自定义提示模板(性能优化关键)
prefix = """你是一个高效助手,请严格遵守以下规则:
1. 实时数据必须使用Search工具
2. 已存储信息使用Lookup工具
3. 当用户要求'无需工具'时直接生成答案
4. 错误处理:工具调用失败时自动转为生成模式"""
suffix = """当前对话历史:{chat_history}
问题:{input}
思考过程:{agent_scratchpad}"""
prompt = StructuredChatAgent.create_prompt(
tools,
prefix=prefix,
suffix=suffix,
input_variables=["input", "chat_history", "agent_scratchpad"]
)
# 5. 构建代理链(带缓存优化)
llm_chain = LLMChain(llm=llm, prompt=prompt)
agent = StructuredChatAgent(
llm_chain=llm_chain,
tools=tools,
verbose=True
)
# 6. 创建执行器(性能关键配置)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
max_iterations=3,
handle_parsing_errors=True,
early_stopping_method="generate",
return_intermediate_steps=True
)
# 7. 测试函数
def test_agent():
try:
# 第一轮:搜索并存储
result1 = agent_executor.invoke({"input": '{"action":"Search","input":"特斯拉CEO"}'})
print(f"#### 第一轮结果: {result1['output']}")
docstore.add({"tesla_ceo": result1['output']})
# 第二轮:检索记忆
result2 = agent_executor.invoke({"input": "描述这位CEO的特点(无需工具)"})
print(f"#### 第二轮结果: {result2['output']}")
# 性能监控
print("\n[性能指标]")
print(f"工具调用次数: {len(agent_executor.intermediate_steps)}")
print(f"记忆使用量: {len(memory.buffer)}条对话")
except Exception as e:
print(f"执行出错: {str(e)}")
if __name__ == "__main__":
test_agent()
#### 第一轮结果: {
"action": "Final Answer",
"action_input": "特斯拉现任CEO是埃隆·马斯克(Elon Musk)。根据最新消息,马斯克表示未来五年内他将继续担任特斯拉CEO,除非发生不可预见的情况。不过特斯拉董事会已开始考虑继任计划,以应对可能的'关键人物风险'。"
}
#### 第二轮结果: 埃隆·马斯克(Elon Musk)作为特斯拉CEO的主要特点包括:
1. 颠覆性创新者
- 以"第一性原理"思维方式打破行业常规
- 推动电动汽车、可再生能源和太空探索的跨界创新
2. 高风险承受力
- 多次将个人全部资产投入公司
- 敢于挑战传统汽车和航天行业巨头
3. 高强度工作模式
- 以每周工作80-100小时著称
- 经常在工厂车间解决具体问题
4. 争议性领导风格
- 直言不讳的沟通方式常引发舆论风波
- 通过社交媒体(特别是Twitter/X)直接管理公司形象
5. 长远愿景驱动
- 以"加速世界向可持续能源转变"为使命
- 同时布局多个十年尺度的技术领域(如Neuralink、SpaceX)
6. 技术深度参与
- 作为"技术型CEO"亲自参与工程细节
- 拥有多项电动汽车和火箭技术专利
这些特质使他成为当代最具标志性也最具争议的企业领袖之一。