用 LangChain 零微调构建 AI Agent:从 Self Ask 到 ReAct
前面聊过思维链(Chain of Thought)的用法和原理,现在该进正题了——把思维链和工具结合起来,让模型不只是动嘴,还能动手。这就是 AI Agent。
AI Agent 能干吗?换个角度看:
- 把 LLM 当成大脑,Agent 就是它的手脚和感官。感官,用来获取真实世界信息:实时数据(天气、股价)、私有数据(用户资料)、多模态输入(图像、声音);手脚,用来和外部交互:跑段 Python、调搜索引擎、订个机票。
- 反过来,有了 Agent,大模型成了更高效的中介,帮我们处理各种非结构化数据。以前重度依赖结构化查询,现在很多场景可以靠模型自己消化了。
OpenAI 的 Lilian Weng 把 AI Agent 拆成三块:规划、工具、记忆。规划负责拆解问题形成执行路径;工具决定能调什么、怎么调;记忆分短期(工具返回值、已完成的推理)和长期(外部知识库)。
接下来,我结合 LangChain 聊聊两种零微调方案:Self Ask 和 ReAct。不涉及模型训练,仅靠 few-shot 或 zero-shot prompt 驱动推理和工具调用。
Self Ask
Self Ask 的思路很直接:让模型自己问自己。每次把问题拆成更小的子问题,调用搜索工具拿到中间答案,然后继续追问,直到得到最终结果。重点不在'提问'本身,而是引导模型拆分问题——也就是规划能力。
原理
论文里提到了 Compositionality Gap:模型能正确回答'贾斯汀·比伯哪年出生?'也能回答'94 年大师赛冠军是谁?',但被问到'比伯出生那年的大师赛冠军是谁?'就歇菜。通过引入拆解式推理,这个问题就解决了。
应用
LangChain 的 Self Ask 实现,我用了 Google 搜索和 GPT-3.5。关键代码片段:
import os
from langchain.agents.loading import AGENT_TO_CLASS
from langchain.agents.agent import AgentExecutor
from langchain.agents import AgentType, Tool
from langchain import OpenAI, SerpAPIWrapper
# 定义大模型和搜索工具
llm = OpenAI(temperature=0, openai_api_key="你的 Key")
search = SerpAPIWrapper(params={
"engine": "google",
"gl": "us",
"hl": "zh-cn",
}, serpapi_api_key="你的 Key")
tools = [
Tool(
name="Intermediate Answer",
func=search.run,
description="useful for when you need to ask with search"
)
]
agent_cls = AGENT_TO_CLASS[AgentType.SELF_ask_with_search]
agent = agent_cls.from_llm_and_tools(llm, tools)
chain = AgentExecutor.from_agent_and_tools(agent, tools, return_intermediate_steps=True)

