写在前面
从 Transformer 到 LLM 的技术原理。你已经知道,大语言模型本质上是一个"预测下一个词"的概率机器。
但你每天用的 ChatGPT、Claude、Gemini,早已不只是"聊天"了——它们能帮你搜索信息、写代码并运行、操作浏览器下单购物、甚至直接控制你的电脑完成工作。
从"能聊天"到"能做事",这中间发生了什么?
这篇文章会带你理解这个进化过程中的每一个关键技术节点:思维链、工具调用、RAG、Agent 架构、UI Agent,以及它们如何组合成今天你看到的 AI 智能体。
第一章:LLM 的原始困境——聪明但无能
1.1 一个只会说话的大脑
2022 年底 ChatGPT 发布时,它震惊了世界。但冷静下来你会发现,它有几个致命的短板:
| 短板 | 表现 |
|---|---|
| 没有记忆 | 不知道今天是几号,不记得上次聊了什么 |
| 没有知识更新 | 训练数据有截止日期,不知道最新发生的事 |
| 不会计算 | 问它 1234 × 5678,大概率算错 |
| 不能行动 | 不能发邮件、不能查数据库、不能操作任何外部系统 |
| 会编造事实 | 自信地胡说八道(幻觉问题) |
用一个比喻:LLM 是一个博学但被关在隔音房里的天才——它知道很多,但看不见外面的世界,也伸不出手去做任何事。
1.2 从 Chatbot 到 Agent 的核心问题
要让 LLM 从"聊天机器人"变成"能做事的智能体",需要解决三个问题:
- 怎么让它更好地推理? → 思维链(Chain of Thought)
- 怎么让它获取外部信息? → RAG(检索增强生成)
- 怎么让它采取行动? → 工具调用(Tool Use / Function Calling)
这三个能力叠加在一起,就构成了 Agent 的基础。
第二章:思维链——教 LLM "一步一步想"
2.1 问题:LLM 不擅长复杂推理
直接问 LLM 一个需要多步推理的问题,它经常出错:
问:Roger 有 5 个网球,他又买了 2 罐网球,每罐 3 个。他现在有几个网球?
答:11 个。 ← 错误!正确答案是 5 + 2×3 = 11... 等等,这个恰好对了
问:一个餐厅有 23 个苹果,用掉 20 个做午餐,又买了 6 个,现在有几个?
答:27 个。 ← 错误!正确答案是 23 - 20 + 6 = 9
LLM 倾向于直接"跳"到答案,跳过中间推理步骤,导致复杂问题频繁出错。
2.2 解决方案:Chain of Thought(CoT)
2022 年,Google 的 Jason Wei 等人发表了开创性论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models,提出了一个极其简单但效果惊人的方法:
在提示中加入推理步骤的示例,让模型学会"一步一步想"。
标准提示:
问:一个餐厅有 23 个苹果,用掉 20 个做午餐,又买了 6 个,现在有几个?
答:27 个。 ← 错误
思维链提示:
问:一个餐厅有 23 个苹果,用掉 20 个做午餐,又买了 6 个,现在有几个?
答:餐厅最初有 23 个苹果。
用掉 20 个后剩下 23 - 20 = 3 个。
又买了 6 个,所以现在有 3 + 6 = 9 个。
答案是 9 个。 ← 正确!
更神奇的是,后来研究者发现只需要在提示末尾加一句 "Let's think step by step"(让我们一步一步想),就能显著提升推理准确率。这就是 Zero-shot Chain of Thought(Kojima et al., 2022)。
2.3 为什么思维链有效?
思维链的本质是:把一个复杂问题分解成多个简单的子步骤,每个子步骤都在 LLM 的能力范围内。
LLM 不擅长一步到位地解决复杂问题,但它擅长做简单的单步推理。思维链就是利用了这一点——让模型自己生成中间步骤,每一步都降低了难度。
2.4 从 CoT 到 Agent 的推理能力
思维链是 Agent 推理能力的基石。后来的所有 Agent 框架,都依赖模型"先想清楚再行动"的能力:
- ReAct(Reasoning + Acting):交替进行推理和行动
- Tree of Thoughts:探索多条推理路径
- Reflection:对自己的推理结果进行反思和修正
第三章:工具调用——给 LLM 一双手
3.1 关键突破:让模型自己决定调用什么工具
2023 年 2 月,Meta 发表了 Toolformer: Language Models Can Teach Themselves to Use Tools,证明 LLM 可以自主学会在生成文本的过程中调用外部工具(计算器、搜索引擎、翻译 API 等)。
2023 年 6 月,OpenAI 正式发布了 Function Calling 功能,这是工具调用走向产品化的标志性事件。开发者可以向模型描述可用的函数,模型会智能地决定是否调用、调用哪个、传什么参数。
3.2 工具调用的工作原理
用户:"北京今天天气怎么样?"
┌─────────────────────────────────────────────────┐
│ LLM 内部推理: │
│ "用户问天气,我自己不知道实时天气, │
│ 但我有一个 get_weather 工具可以用。" │
│ │
│ LLM 输出(不是文字,而是一个工具调用请求): │
│ { │
│ "tool": "get_weather", │
│ "arguments": {"city": "北京"} │
│ } │
└─────────────────────────────────────────────────┘
↓
系统执行工具,获取结果:
{"temperature": "22°C", "condition": "晴"}
↓
结果返回给 LLM
↓
┌─────────────────────────────────────────────────┐
│ LLM 基于工具结果生成最终回答: │
│ "北京今天天气晴朗,气温 22°C,适合出行。" │
└─────────────────────────────────────────────────┘
关键点:模型自己决定要不要调用工具、调用哪个工具、传什么参数。 这不是硬编码的 if-else 逻辑,而是模型基于语义理解做出的判断。
3.3 工具调用 = LLM 的"手"
有了工具调用,LLM 的能力边界被彻底打开:
| 工具 | 能力 |
|---|---|
| 搜索引擎 | 获取实时信息,解决知识截止问题 |
| 计算器/代码解释器 | 精确计算,解决数学不可靠问题 |
| 数据库查询 | 访问企业内部数据 |
| 文件读写 | 操作本地文件系统 |
| Shell 命令 | 执行系统操作 |
| API 调用 | 与任何外部服务交互 |
| 浏览器 | 访问和操作网页 |
第四章:RAG——给 LLM 一个外部大脑
4.1 问题:LLM 的知识是"冻结"的
LLM 的知识来自训练数据,训练完成后就"冻结"了。它不知道:
- 今天的新闻
- 你公司内部的文档
- 最新发布的技术文档
- 任何训练数据截止日期之后的信息
而且即使是训练数据中包含的知识,模型也可能记错或编造(幻觉问题)。
4.2 RAG 的核心思想
2020 年,Meta(当时的 Facebook AI Research)的 Patrick Lewis 等人发表了开创性论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,提出了 RAG(检索增强生成)的概念。
RAG 的核心思想极其简单:先搜索,再回答。
传统 LLM:
用户提问 → LLM 凭记忆回答 → 可能出错或过时
RAG:
用户提问 → 先从知识库中检索相关文档 → 把文档和问题一起交给 LLM → 基于真实文档回答
4.3 RAG 的工作流程
┌──────────────┐
│ 知识库 │
│ (文档、网页、 │
│ 数据库等) │
└──────┬───────┘
│
① 离线索引
(把文档切块,
转成向量存储)
│
▼
用户提问 ──→ ② 检索 ──→ 向量数据库 ──→ 返回最相关的文档片段
│
▼
③ 把问题 + 检索到的文档
一起发给 LLM
│
▼
④ LLM 基于文档内容
生成有据可查的回答
四个步骤详解:
① 离线索引(Indexing)
把知识库中的文档切成小块(通常几百字一块),用 Embedding 模型把每块文本转成向量,存入向量数据库。
② 检索(Retrieval)
用户提问时,把问题也转成向量,在向量数据库中找到最相似的文档块(通常取 Top-K,比如最相关的 5 个片段)。
③ 增强(Augmentation)
把检索到的文档片段和用户的原始问题拼接在一起,作为 LLM 的输入上下文。
④ 生成(Generation)
LLM 基于提供的文档内容生成回答,而不是凭"记忆"回答。
4.4 RAG 解决了什么问题?
| 问题 | RAG 如何解决 |
|---|---|
| 知识过时 | 知识库可以随时更新,不需要重新训练模型 |
| 幻觉 | 回答基于检索到的真实文档,可以引用来源 |
| 领域知识缺失 | 可以接入企业内部文档、专业数据库 |
| 成本 | 比重新训练或微调模型便宜得多 |
4.5 RAG 的局限与演进
RAG 并非万能。检索质量直接决定回答质量——如果检索到的文档不相关,LLM 的回答也会跑偏。
近年来 RAG 技术持续演进:
- Advanced RAG:查询改写、重排序、多轮检索
- Graph RAG:微软提出的基于知识图谱的 RAG(From Local to Global: A Graph RAG Approach, 2024)
- Agentic RAG:让 Agent 自主决定何时检索、检索什么、是否需要多次检索
NVIDIA 对 RAG 有一篇很好的科普文章:What Is Retrieval-Augmented Generation aka RAG。
第五章:Agent 架构——把推理、工具、知识组合起来
5.1 什么是 Agent?
Agent(智能体)的定义很简单:一个能够感知环境、自主推理、并采取行动来完成目标的系统。
在 LLM 的语境下:
Agent = LLM(大脑)
+ 工具(手)
+ 知识/记忆(外部大脑)
+ 规划能力(思考策略)
+ 行动循环(感知-思考-行动的循环)
5.2 ReAct:Agent 的奠基性框架
2022 年,Shunyu Yao 等人发表了 ReAct: Synergizing Reasoning and Acting in Language Models,提出了 ReAct 框架。这篇论文是 LLM Agent 领域最重要的奠基性工作之一。
ReAct 的核心思想:让模型交替进行"推理"(Reasoning)和"行动"(Acting)。
用户问题:"2024 年奥斯卡最佳影片的导演还导过什么电影?"
Thought 1: 我需要先查 2024 年奥斯卡最佳影片是什么。
Action 1: search("2024 Oscar Best Picture")
Observation 1: 2024 年奥斯卡最佳影片是《奥本海默》(Oppenheimer)
Thought 2: 《奥本海默》的导演是克里斯托弗·诺兰。我需要查他的其他作品。
Action 2: search("Christopher Nolan filmography")
Observation 2: 诺兰的作品包括《盗梦空间》《星际穿越》《蝙蝠侠》三部曲……
Thought 3: 我现在有足够的信息来回答了。
Answer: 2024 年奥斯卡最佳影片《奥本海默》的导演是克里斯托弗·诺兰,
他还导演了《盗梦空间》《星际穿越》《蝙蝠侠》三部曲等作品。
这个 Thought → Action → Observation 的循环,就是几乎所有现代 Agent 的基本模式。Google Research 也发表了一篇博客详细介绍了这个范式:ReAct: Synergizing Reasoning and Acting in Language Models。
5.3 Agent Loop:万变不离其宗的核心循环
无论 Agent 框架多复杂,核心都是同一个循环:
用户输入
↓
┌──────────────┐
│ │
│ LLM 推理 │ ← 系统提示 + 工具描述 + 历史消息
│ │
└──────┬───────┘
│
模型返回的是什么?
/ \
工具调用请求 纯文本回答
│ │
执行工具, 返回给用户
把结果加入消息 (循环结束)
│
回到 LLM 继续推理
(循环继续)
这个循环用 Python 表达只需要十几行代码:
def agent_loop(messages, tools):
while True:
response = llm.chat(messages, tools=tools)
messages.append(response)
if response.stop_reason != "tool_use":
return response.text # 纯文本,结束
# 执行工具调用
for tool_call in response.tool_calls:
result = execute_tool(tool_call)
messages.append(tool_result(result))
# 继续循环
模型决定何时调用工具、何时停止。代码只负责执行模型的决定。 这就是 Agent 的本质——智能来自模型,代码只是提供执行环境。
5.4 主流 Agent 框架一览
| 框架 | 开发者 | 特点 | 链接 |
|---|---|---|---|
| LangChain | LangChain Inc. | 最早的 LLM 应用框架,生态丰富 | langchain.com |
| LlamaIndex | LlamaIndex | 专注 RAG 和数据连接 | llamaindex.ai |
| smolagents | Hugging Face | 极简 Agent 框架,用代码作为行动 | huggingface.co/blog/smolag… |
| AutoGen | Microsoft | 多 Agent 对话框架 | github.com/microsoft/a… |
| CrewAI | CrewAI | 多 Agent 协作,角色扮演模式 | crewai.com |
5.5 MCP:Agent 工具调用的"USB-C"标准
2024 年 11 月,Anthropic 发布了 Model Context Protocol(MCP),一个开源的标准协议,用于标准化 AI 模型与外部工具和数据源之间的连接方式。
MCP 的意义在于:在 MCP 之前,每个 Agent 框架都有自己的工具接口格式,互不兼容。MCP 提供了一个统一标准,就像 USB-C 统一了设备接口一样。
MCP 之前:
Agent A ──自定义格式──→ 工具 1
Agent B ──另一种格式──→ 工具 1(需要重新适配)
Agent C ──又一种格式──→ 工具 1(又要重新适配)
MCP 之后:
Agent A ─┐
Agent B ─┼── MCP 协议 ──→ MCP Server(工具 1)
Agent C ─┘
开发者只需要把工具封装成 MCP Server,任何支持 MCP 的 Agent 都能直接使用。
第六章:UI Agent——让 AI 像人一样操作电脑
6.1 什么是 UI Agent?
前面讲的工具调用,本质上是通过 API(应用程序接口)与外部系统交互。但世界上绝大多数软件并没有 API——它们只有图形用户界面(GUI)。
UI Agent(也叫 Computer Use Agent / CUA)的思路完全不同:不通过 API,而是像人一样,通过"看屏幕"和"操作鼠标键盘"来使用软件。
传统工具调用(API 方式):
Agent → 调用 send_email(to="xxx", body="xxx") → 邮件发送成功
UI Agent(GUI 方式):
Agent → 看到屏幕上的 Gmail 界面
→ 点击"撰写"按钮
→ 在收件人框输入地址
→ 在正文框输入内容
→ 点击"发送"
→ 确认邮件已发送
6.2 UI Agent 的技术原理
UI Agent 的核心是视觉语言模型(VLM)——既能理解文字,又能理解图像的模型。
工作循环:
① 截取当前屏幕截图
↓
② 把截图 + 任务描述发给 VLM
↓
③ VLM 分析屏幕内容,决定下一步操作
输出:{"action": "click", "x": 450, "y": 320}
或: {"action": "type", "text": "Hello World"}
或: {"action": "scroll", "direction": "down"}
↓
④ 执行操作
↓
⑤ 截取新的屏幕截图 → 回到 ①
6.3 里程碑产品
Anthropic Claude Computer Use(2024 年 10 月)
Anthropic 是第一个将 Computer Use 作为产品级功能发布的公司。2024 年 10 月 22 日,他们发布了 Claude 3.5 Sonnet 的 Computer Use 功能,让 Claude 能够控制鼠标、键盘,像人一样操作电脑。详见 Anthropic 的技术博客:Developing a computer use model。
OpenAI Operator / CUA(2025 年 1 月)
2025 年 1 月 23 日,OpenAI 发布了 Operator,一个基于 Computer-Using Agent(CUA)模型的浏览器 Agent。CUA 结合了 GPT-4o 的视觉能力和强化学习训练,能够自主浏览网页、填写表单、下单购物。技术细节见:Computer-Using Agent。
Google Project Mariner(2024 年 12 月)
Google 在 2024 年 12 月 11 日发布了 Project Mariner,一个基于 Gemini 2.0 的浏览器 Agent,作为 Chrome 扩展运行,能够自主导航网页、搜索信息、完成在线任务。
6.4 UI Agent vs API Agent:对比
| 维度 | API Agent | UI Agent |
|---|---|---|
| 交互方式 | 调用程序接口 | 看屏幕 + 操作鼠标键盘 |
| 速度 | 快(毫秒级) | 慢(需要截图、分析、操作) |
| 可靠性 | 高(结构化输入输出) | 较低(UI 可能变化) |
| 覆盖范围 | 仅限有 API 的系统 | 理论上能操作任何软件 |
| 成本 | 低 | 高(每步都需要视觉推理) |
| 适用场景 | 有 API 的系统优先用 API | 没有 API 的遗留系统、复杂 GUI 操作 |
最佳实践:能用 API 就用 API,API 覆盖不到的地方用 UI Agent 补充。 这也是为什么 Anthropic 的 Claude 同时支持 Tool Use(API 方式)和 Computer Use(GUI 方式)。
6.5 UI Agent 的评测基准
UI Agent 的能力如何衡量?学术界建立了多个基准测试:
- OSWorld(NeurIPS 2024):369 个真实桌面操作系统任务,涵盖 Web、桌面应用、文件操作等,是目前最全面的桌面 Agent 基准
- WebVoyager(ACL 2024):643 个真实网站上的端到端 Web 任务
- SWE-bench(arXiv 2023):2294 个真实 GitHub Issue,测试 AI 能否自主修复代码
第七章:编码 Agent——最成熟的 Agent 应用
7.1 为什么编码是 Agent 的最佳落地场景?
编码任务天然适合 Agent:
- 环境完全数字化:文件系统、终端、编辑器,全部可以通过工具访问
- 反馈即时明确:代码能不能运行、测试过不过,有客观标准
- LLM 天然擅长代码:训练数据中有海量开源代码
- 工具链成熟:编译器、测试框架、Linter 都是现成的
7.2 编码 Agent 的典型工作流
用户:"帮我给这个项目添加用户登录功能"
Agent 的工作流程:
① 读取项目结构和现有代码(感知)
② 制定实现计划(推理)
- 创建用户模型
- 实现注册/登录 API
- 添加认证中间件
- 编写测试
③ 逐步实现每个子任务(行动)
- 读取相关文件
- 编写新代码
- 运行测试
- 修复错误
- 重复直到测试通过
④ 提交代码(完成)
7.3 代表性产品
| 产品 | 类型 | 特点 |
|---|---|---|
| Claude Code (Anthropic) | CLI Agent | 终端中运行,直接操作文件系统和 Shell |
| GitHub Copilot Agent | IDE 集成 | 在 VS Code 中自主完成编码任务 |
| Cursor | AI IDE | 整个 IDE 围绕 AI Agent 设计 |
| Devin (Cognition) | 全栈 Agent | 号称"AI 软件工程师",有自己的开发环境 |
| SWE-agent (Princeton) | 研究框架 | 专为 SWE-bench 设计的开源 Agent |
Claude Code 是编码 Agent 中 harness 工程的典范——它不试图替代模型的智能,而是为模型提供最好的工具、知识和执行环境。这也是 learn-claude-code 项目详细拆解其架构的原因。
第八章:多 Agent 系统——从单兵作战到团队协作
8.1 为什么需要多个 Agent?
单个 Agent 的上下文窗口有限,处理复杂任务时容易"迷失"。解决方案是:把大任务拆分给多个专门的 Agent,各自负责一部分。
Lead Agent(主 Agent)
├── Coder Agent(写代码)
├── Reviewer Agent(审查代码)
├── Tester Agent(编写和运行测试)
└── Docs Agent(写文档)
8.2 多 Agent 协作的关键挑战
| 挑战 | 解决方案 |
|---|---|
| Agent 之间怎么通信? | 消息队列、共享文件、异步邮箱 |
| 怎么分配任务? | 主 Agent 分配 或 Agent 自主认领 |
| 怎么避免冲突? | 每个 Agent 在独立的工作目录(worktree)中操作 |
| 怎么保证一致性? | 任务依赖图、状态同步 |
8.3 从单 Agent 到多 Agent 的演进路径
这正是 learn-claude-code 项目 s01-s12 的教学路径:
s01-s02: 单 Agent + 工具 (一个人干活)
s03-s06: 规划 + 知识 + 上下文管理 (一个人更聪明地干活)
s07-s08: 任务系统 + 后台执行 (一个人同时干多件事)
s09-s12: 多 Agent 协作 + 隔离执行 (一个团队协作干活)
第九章:全景图——从 LLM 到 Agent 的完整进化链
2020 RAG 论文发表(Lewis et al.)
│ └── LLM 可以基于外部知识回答问题
│
2022 Chain of Thought(Wei et al.)
│ └── LLM 学会"一步一步想"
│
2022 ReAct(Yao et al.)
│ └── 推理和行动交替进行,Agent 范式诞生
│
2023 Toolformer(Schick et al., Meta)
│ └── LLM 自主学会使用工具
│
2023 OpenAI Function Calling
│ └── 工具调用产品化,开发者可以给 GPT 接工具
│
2023 GPT-4V / Gemini(多模态)
│ └── LLM 能"看"图片,为 UI Agent 奠基
│
2024 Anthropic Claude Computer Use
│ └── 第一个产品级 UI Agent,AI 能操作电脑
│
2024 Anthropic MCP 协议
│ └── 工具调用标准化,Agent 生态互通
│
2024 Google Project Mariner
│ └── 浏览器 Agent,AI 能自主上网
│
2025 OpenAI Operator / CUA
│ └── 浏览器 Agent 产品化
│
2025 编码 Agent 爆发(Claude Code, Copilot Agent, Cursor...)
│ └── Agent 在软件工程领域率先落地
│
▼
未来:Agent 进入更多领域
(医疗、法律、教育、制造、农业……)
第十章:Agent 的未来与挑战
10.1 当前的核心挑战
| 挑战 | 现状 |
|---|---|
| 可靠性 | Agent 在复杂任务上仍会犯错,需要人类监督 |
| 安全性 | Agent 能执行操作意味着能造成破坏,权限控制至关重要 |
| 成本 | 每次推理都消耗 Token,复杂任务可能需要数百次 LLM 调用 |
| 延迟 | 多步推理 + 工具调用,完成一个任务可能需要几分钟 |
| 评测 | 缺乏统一的 Agent 能力评测标准 |
10.2 发展趋势
- 从对话式到主动式:Agent 不再等你提问,而是主动发现问题并解决(心跳机制、定时任务)
- 从单模态到多模态:同时理解文字、图像、视频、音频
- 从单 Agent 到 Agent 社会:多个 Agent 组成团队,分工协作
- 从云端到端侧:Agent 运行在手机、电脑本地,保护隐私
- 从通用到垂直:针对特定行业(医疗、法律、金融)深度优化
10.3 一句话总结
LLM 是大脑,工具是手,RAG 是外部记忆,思维链是思考方式,Agent Loop 是行为模式。把这些组合在一起,聊天机器人就变成了能帮你做事的智能体。
参考文献
- Wei, J. et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS 2022. arxiv.org/abs/2201.11…
- Kojima, T. et al. (2022). Large Language Models are Zero-Shot Reasoners. NeurIPS 2022. arxiv.org/abs/2205.11…
- Yao, S. et al. (2022). ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023. arxiv.org/abs/2210.03…
- Schick, T. et al. (2023). Toolformer: Language Models Can Teach Themselves to Use Tools. NeurIPS 2023. arxiv.org/abs/2302.04…
- Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020. arxiv.org/abs/2005.11…
- Edge, D. et al. (2024). From Local to Global: A Graph RAG Approach. arxiv.org/abs/2404.16…
- OpenAI. (2023). Function calling and other API updates. openai.com/blog/functi…
- Anthropic. (2024). Developing a computer use model. anthropic.com/research/de…
- Anthropic. (2024). Introducing the Model Context Protocol. anthropic.com/news/model-…
- OpenAI. (2025). Introducing Operator. openai.com/index/intro…
- OpenAI. (2025). Computer-Using Agent. openai.com/index/compu…
- Google. (2024). A new AI model for the agentic era (Gemini 2.0 / Project Mariner). blog.google
- Xie, T. et al. (2024). OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments. NeurIPS 2024. arxiv.org/abs/2404.07…
- He, Z. et al. (2024). WebVoyager: Building an End-to-End Web Agent with Large Multimodal Models. ACL 2024. arxiv.org/abs/2401.13…
- Jimenez, C.E. et al. (2023). SWE-bench: Can Language Models Resolve Real-World GitHub Issues? arxiv.org/abs/2310.06…
- NVIDIA. What Is Retrieval-Augmented Generation aka RAG. blogs.nvidia.com
- Hugging Face. (2024). smolagents: simple agents that write actions in code. huggingface.co/blog/smolag…
- Google AI Blog. (2022). ReAct: Synergizing Reasoning and Acting in Language Models. ai.googleblog.com