理解AI 智能体:工作流 vs 智能体

在快速发展的人工智能(AI)领域,理解 AI 工作流和 AI 智能体之间的区别对于有效利用这些技术至关重要。本文将深入探讨 AI 工作流的类型,阐述 AI 智能体的概念,并重点强调它们之间的关键区别。

1. 智能体 vs 工作流

“智能体”可以有多种定义方式。有些人将智能体定义为完全自主的系统,能够长时间独立运行,使用各种工具完成复杂任务。另一些人则用这个术语来描述更按部就班、遵循预定义工作流的实现方式。

在 Anthropic,他们将所有这些都归入“智能体系统”这一大类,但在工作流和智能体之间做了一个关键区分:

  • 工作流: 是指通过预定义的代码路径来编排(协调)大语言模型(LLM)和工具的系统。
  • 智能体: 是指 LLM 动态地指导自身流程和工具使用,保持对如何完成任务的控制权的系统。

想象一下烹饪:

  • 工作流就像严格按照食谱一步步操作。
  • 智能体则像一位厨师,根据手头的食材和最佳口味现场决定如何准备一道菜。

下面是一个简单的可视化方式来理解这些区别:

1.1 何时(以及何时不)使用智能体

在使用 LLM 开发应用程序时,最好从最简单的解决方案开始,只在必要时引入复杂性。在某些情况下,这可能意味着完全避免使用智能体系统。这些系统通常伴随着更高的延迟和成本,以换取任务性能的提升,因此评估这种权衡是否值得非常重要。

当需要增加复杂性时:

  • 工作流为结构良好的任务提供可预测性和一致性。
  • 智能体则更适合需要灵活性和大规模模型驱动决策的场景。

然而,对于许多应用来说,通过检索(Retrieval)和上下文示例(In-context Examples)来优化单个 LLM 调用通常就足够了。

1.2 何时以及如何使用框架

有许多框架可以简化智能体系统的实现,包括:

  • LangChain 的 LangGraph
  • Amazon Bedrock 的 AI Agent 框架
  • Rivet
  • Vellum

这些框架简化了标准的基础任务,如调用 LLM、定义和解析工具、链接调用等,使得上手智能体系统更容易。然而,它们通常会引入额外的抽象层,这可能会掩盖底层的提示(Prompts)和响应(Responses),使调试更具挑战性。它们也可能在更简单的设置就足够的情况下,诱使开发者增加不必要的复杂性。

建议开发者从直接使用 LLM API 开始,因为许多模式只需几行代码即可实现。如果你选择使用框架,请确保你透彻理解其底层代码,因为对其内部运作的错误假设是常见的错误来源。

2. 基础构建模块

在本节中,我们将探讨在生产环境中观察到的智能体系统的常见模式。我们将从基础构建模块——增强型 LLM——开始,逐步增加复杂性,从简单的组合工作流到自主智能体。

2.1 设置

你可以使用任何支持结构化输出(Structured Outputs)和工具调用(Tool Calling)的聊天模型。下面展示了为 Anthropic 模型安装包、设置 API 密钥以及测试结构化输出/工具调用的过程。

import os
import getpass

from langchain_anthropic import ChatAnthropic

def _set_env(var: str):
    if not os.environ.get(var):
        os.environ[var] = getpass.getpass(f"{var}: ")

_set_env("ANTHROPIC_API_KEY")

llm = ChatAnthropic(model="claude-3-5-sonnet-latest")

2.2 增强型 LLM

智能体系统的基本构建模块是一个通过检索(Retrieval)、工具(Tools)和记忆(Memory)等功能增强的 LLM。我们当前的模型可以主动使用这些能力——生成自己的搜索查询、选择合适的工具、并决定保留哪些信息。

我们建议重点关注实现的两个关键方面:

  1. 根据你的具体用例定制这些功能。
  2. 确保它们为你的 LLM 提供简单、文档完善的接口。

虽然实现这些增强功能的方法有很多,但一种方式是通过“模型上下文协议”(Model Context Protocol),它允许开发者通过简单的客户端实现与日益增长的第三方工具生态系统集成。

在本文的剩余部分,我们将假设每个 LLM 调用都能访问这些增强能力。

# Schema for structured output
from pydantic import BaseModel, Field

class SearchQuery(BaseModel):
    search_query: str = Field(None, description="Query that is optimized web search.")
    justification: str = Field(
        None, description="Why this query is relevant to the user's request."
    )

# Augment the LLM with schema for structured output
structured_llm = llm.with_structured_output(SearchQuery)

# Invoke the augmented LLM
output = structured_llm.invoke("How does Calcium CT score relate to high cholesterol?")

# Define a tool
def multiply(a: int, b: int) -> int:
    return a * b

# Augment the LLM with tools
llm_with_tools = llm.bind_tools([multiply])

# Invoke the LLM with input that triggers the tool call
msg = llm_with_tools.invoke("What is 2 times 3?")

# Get the tool call
msg.tool_calls

3. 工作流模式

3.1 提示链式处理(Prompt Chaining)

在提示链式处理中,每个 LLM 调用处理前一个调用的输出。

正如 Anthropic 博客所述:

提示链式处理将任务分解为一系列步骤,其中每个 LLM 调用处理前一个调用的输出。你可以在任何中间步骤添加程序化检查(见下图中的“Gate”),以确保流程仍在正轨上。

何时使用此工作流: 当任务可以轻松、清晰地分解为固定的子任务时,此工作流是理想的选择。其主要目标是通过让每个 LLM 调用处理更简单的任务,以牺牲一定延迟为代价换取更高的准确性。

提示链式处理有用的示例:

  • 先生成营销文案,然后将其翻译成另一种语言。
  • 先撰写文档大纲,检查大纲是否符合特定标准,然后根据大纲撰写文档。

from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from IPython.display import Image, display

# Graph state
class State(TypedDict):
    topic: str
    joke: str
    improved_joke: str
    final_joke: str

# Nodes
def generate_jo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dylan55_you

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值