跳到主要内容

GenAI 工作流

并非所有的 AI 应用程序都是智能体!用工程术语来说,智能体是具有高度自由和自主性的系统,但人为控制程度较低。在深入研究智能体之前,让我们先来了解一下更可控的 LLM 应用,因为在未来,你的智能体将会把它们用作子系统。

问题

  • 在我们的工程世界中,什么不是智能体?
  • 什么是有向无环图 (DAG)?
  • 工作流有哪些子类型?

步骤

工程定义

根据目前社区(X、Anthropic、OpenAI)的观点,智能体是循环运行的系统,直到它们自己决定停止。借助 LLM,智能体可以自行评估任务的完成情况,并暂停执行(例如,通过调用 ToolCall: ReturnFinalAnswer)。

目前大多数高级智能体,除了评估任务完成情况外,还会自主规划实现目标的子步骤,并在每个步骤上循环,直到完成该步骤,然后才进入后续步骤。

因此,所有 DAG - directed acyclic graph - 有向无环图 - 都不是智能体。

DAG 简介

or

例外情况

如果循环是由严格的逻辑触发的,通常认为这是一个工作流,而不是智能体。

在下面你将看到一个“无限文本摘要”工作流,它递归地总结文本,直到达到特定长度的短文本。这不是智能体,而是一个工作流,即使它有循环。

1. 阅读这篇 Anthropic 文章

2. LLM 工作流的真实示例

提示

研究下面的例子。这对架构视野很重要。

尝试在脑海中“编译”一些管道。

我们尽量编写请求/提示词的示例 - 如果有不清楚的地方,请阅读它们。

沟通与支持
邮件分类器
输入请求示例
邮件 1:
发件人: client@example.com
主题: 付款问题
消息: "您好,我几天前支付了订单,但状态没有改变。请帮忙。"

邮件 2:
发件人: user2@example.com
主题: 产品问题
消息: "您好,请告诉我你们应用程序的功能。"
系统提示词:邮件分类器
你是一个将收到的邮件分类为“spam”或“not_spam”的模型。
输入是邮件的标题和正文。
输出是一个词:“spam”或“not_spam”。
系统提示词:验证器(LLM可以回复吗?)
你是一个检查 LLM 是否可以自主回复请求的模型。
输入是邮件正文。
如果答案很简单 - 输出“simple_answer”,否则输出“complex_answer”。
系统提示词:生成回复
你是一名支持服务助理。根据邮件内容为客户撰写礼貌而简洁的回复:
\"\"\"{email_body}\"\"\"
支持服务请求分诊
输入请求示例
请求 1: "如何重置我的帐户密码?"
请求 2: "我在支付订阅费用时遇到错误,订单号 #12345。"
系统提示词:意图分类
你是一个根据客户消息确定意图的模型:“FAQ”或“technical_support”。
输出是“FAQ”或“technical_support”。
系统提示词:LLM根据FAQ生成答案
你是一个根据找到的FAQ生成答案的助手。
输入:客户请求和FAQ内容:
\"\"\"问题:{faq_question}
答案:{faq_answer}\"\"\"
输出 - 给客户的完整答案。
文档摘要
文档摘要流程
输入文档示例
文档 1:关于 JavaScript 的文章(≈ 5 000 个令牌)
文档 2:季度销售报告(≈ 8 000 个令牌)
系统提示词:LLM - 部分摘要
你是一个用于总结文本片段的模型。
你的任务是根据输入片段(≤ 6000 个令牌)形成一个简短而内容丰富的摘要(≤ 500 个令牌)。
输入:文档的文本片段。
输出:片段摘要。
无限文本摘要

假设你只能使用 LLM,它最多可以在其 Attention 层中容纳 8000 个令牌。LLM 最多可以生成 2000 个令牌。(总计:6000 个令牌输入,2000 个输出)

例如,对于 18 兆令牌的文本,该算法将在 2 个摘要周期中运行:

  1. 1 周期:18 000 个令牌 -> 6 000 个令牌 1.1. 18 000 个令牌 -> 3 个块,每个块 6 000 个令牌 1.2. 3 个块,每个块 6 000 个令牌 -> 3 个摘要,每个摘要 2 000 个令牌 1.3. 3 个摘要,每个摘要 2 000 个令牌 -> 连接成 1 个摘要,共 6 000 个令牌
  2. 2 周期:6 000 个令牌 -> 2 000 个令牌 2.1. 6 000 个令牌 -> 1 个块,共 6 000 个令牌 2.2. 1 个块,共 6 000 个令牌 -> 1 个摘要,共 2 000 个令牌 2.3. 1 个摘要,共 2 000 个令牌 -> 最终摘要
输入文档示例
文档:产品技术规范(≈ 400 000 个令牌)
系统提示词:LLM - 将每个部分总结为 2000 个令牌
将文本总结为 2000 个令牌。
使用管理器逻辑分析和处理大型文本
输入数据示例
处理逻辑:“查找所有提及单词‘错误’和‘异常’的地方,计算它们的频率。”
文本:应用程序日志(≈ 100 000 个令牌)
系统提示词:LLM - 处理文本块
你是一个分析模型。你的任务是根据给定的用户逻辑和输入的文本块形成一个部分报告。
输入:
- 处理逻辑:{逻辑}
- 文本块:{文本}
输出:
- 部分报告。
社交监控和推荐
社交媒体监控
输入请求示例
请求 1:“收集带有标签 #我们的产品 的最近 100 条推文”
请求 2:“获取过去 24 小时内 Instagram 上提及该品牌的帖子”
“情感分析”步骤的系统提示词示例
你是一个社交媒体情感分析模型。你的任务是将每个帖子分类为“负面”、“中性”或“正面”。
输入数据:
- 帖子文本:{文本}
输出数据:
- 情感:{负面|中性|正面}
- 分类的简要理由。
推荐系统
输入数据示例
用户资料:
- ID:12345
- 浏览历史:["电话", "耳机", "手机壳"]
- 年龄:29
- 兴趣:技术、音乐
“生成推荐”步骤的系统提示词示例
你是一个基于 LLM 的推荐系统。你的任务是根据用户嵌入和相似商品列表生成五个相关的推荐。
输入数据:
- 用户嵌入:{vector}
- 相似商品列表:[{id, 名称, 嵌入}, ...]
输出数据:
- 带有推荐的 JSON 数组:
[
{id: ..., 名称: ..., 原因: ...},
...
]
代码审查和发布
自动化代码审查
输入请求示例
请求 1:Pull Request,其中包含 app.js 文件中的更改:
```diff
- function add(a, b) { return a + b; }
+ function add(a, b) { return Number(a) + Number(b); }

请求 2:Pull Request,删除 utils.js 中未使用的变量:

- const unused = 42;
+ // 已删除
</details>

<details>
<summary>系统提示词:LLM - 生成评论</summary>

```text
你是一个自动化代码审查助手。
你的任务是基于 Pull Request 的 diff:
- 检测语法或逻辑错误,
- 标记样式指南违规行为,
- 提供改进代码的建议。
输入数据:
- diff Pull Request:{diff}
输出格式(结构化输出):
[
{file: "app.js", line: 1, comment: "建议显式地将参数转换为 Number,以确保字符串相加的安全。"},
{file: "utils.js", line: 3, comment: "变量 'unused' 未使用 - 应该删除它。"}
]
博客发布
输入请求示例
文章草稿:
"OpenAI 推出了新的 GPT-4 模型。它为文本生成、代码支持和数据分析提供了改进的功能。可以使文本的某些部分更流畅和更具表现力..."
系统提示词:LLM - 拼写检查
你是一个用于文本拼写检查的模型。
你的任务是查找并更正拼写错误和印刷错误。
输入:
- 草稿文本:{draft_text}
输出:
- 没有错误的更正文本。
系统提示词:LLM - 改进风格
你是一个用于文本风格编辑的模型。
你的任务是使文本更流畅、更清晰和更具吸引力,同时保留原始含义。
输入:
- 拼写检查后的文本:{corrected_text}
输出 - 编辑后的文本。
营销和销售
营销活动个性化
输入请求示例
CRM 数据 1:{id: 101, 姓名: "安娜", 年龄: 28, 最近_购买: ["运动鞋","T恤"], 兴趣: ["运动","旅行"]}
CRM 数据 2:{id: 102, 姓名: "鲍里斯", 年龄: 35, 最近_购买: ["智能手表"], 兴趣: ["技术","健身"]}
系统提示词
LLM:受众细分
你是一个根据 CRM 数据列表按类别(年龄、兴趣、购买历史)细分客户的模型。
输入:客户列表 [{id, 姓名, 年龄, 最近_购买, 兴趣}, ...]
输出 - JSON 细分数组:
[
{segment_id: 1, 标准: "25-35 岁的运动员", 客户: [101, ...]},
...
]
LLM:生成消息
你是一个文案助手,为每个细分市场创建个性化的电子邮件。
输入:细分市场 {segment_id, 标准, 客户} 和消息模板。
输出 - JSON 消息数组:
[
{segment_id: 1, 主题: "运动员特别优惠", 正文: "..."},
...
]
潜在客户资格认证和追加销售(销售)
输入请求示例
潜在客户 1:{id: "LID123", 公司: "Acme Corp", 预算: 50000, 需求: "CRM 系统"}
潜在客户 2:{id: "LID124", 公司: "Beta LLC", 预算: 150000, 需求: "销售分析"}
系统提示词
LLM:资格认证
你是一个评估潜在客户购买准备情况的模型。
输入:潜在客户 {id, 公司, 预算, 需求}
输出 - {lead_id, status: "准备好"/"未准备好", score: 数字}
LLM:商业提案
你是一个销售助手,生成商业提案。
输入:潜在客户 {lead_id, 公司, 需求, 预算} 和商业提案模板。
输出 - {lead_id, proposal: "商业提案文本"}
LLM:分析回复
你是一个用于分析客户反馈的模型。
输入:通信 {lead_id, 消息: [...]}
输出 - {lead_id, sentiment: "积极"/"消极"/"中性"}
LLM:生成追加销售
你是一个追加销售助手,形成其他提案。
输入:潜在客户 {lead_id} 和交互历史记录。
输出 - {lead_id, upsell_offer: "其他提案文本"}
运营流程
自动补货
输入数据示例
{
"sales_data": [
{"product_id": "A1", "date": "2024-06-01", "quantity": 120},
{"product_id": "B2", "date": "2024-06-01", "quantity": 75}
],
"safety_stock": 50
}
系统提示词
LLM:需求预测
你是一个需求预测模型。
输入:带有字段 {product_id, date, quantity} 的销售记录数组。
任务:根据历史数据预测下一时期每种产品的需求。
输出:对象数组 [{product_id, forecast_quantity}, ...]。
LLM:生成订单
你是一个向供应商生成订单的助手。
输入:需求预测 [{product_id, forecast_quantity}, ...] 和安全参数 (safety_stock)。
任务:计算订单数量以满足预测需求加上库存。
输出:对象数组 [{product_id, order_quantity}, ...]。
文档合规性检查
输入数据示例
文档类型:租赁协议
文档文本:
“本协议由出租人和承租人签订...
第 1 条。协议的主题...
第 2 条。有效期...”
系统提示词
LLM:提取关键点
你是一个从法律文本中提取关键点的模型。
输入:文档的全文。
任务:突出显示条款编号及其摘要。
输出:对象数组 [{article: 编号, summary: 文本}, ...]。
LLM:评估合规性
你是一个检查文档是否符合给定标准的模型。
输入:关键点数组和规则列表。
任务:确定每个点是否符合规则。
输出:[{article, compliance: "符合"/"不符合", comments}, ...]。
LLM:生成报告
你是一个报告准备助手。
输入:合规性评估结果。
任务:生成一个结构化的 markdown 报告,其中包含“符合的点”和“违规行为”部分。
输出:markdown 报告文本。
HR流程
简历筛选 (招聘)
输入数据示例
[
{
"name": "伊万·伊万诺夫",
"skills": ["Python", "SQL", "Docker容器"],
"experience_years": 3,
"education": "计算机科学硕士"
},
{
"name": "安娜·彼得罗娃",
"skills": ["Java", "Spring", "Microservices"],
"experience_years": 5,
"education": "IT学士"
}
]
系统提示词
LLM: 解析简历
你是一个用于结构化简历的模型。
输入:简历文本。
任务:提取 {name, skills, experience_years, education}。
输出:包含候选人字段的 JSON 对象。
LLM: 评估候选人
你是一个用于根据给定标准评估简历的模型。
输入:对象 {name, skills, experience_years}。
标准:技能的相关性和工作经验。
输出:{name, score: 0 到 100 之间的数字}。
LLM: 安排面试
你是一个面试安排助手。
输入:通过阈值的候选人列表和可用的面试时间段。
任务:将候选人分配到时间段。
输出:[{name, interview_time}, ...]。
入职自动化 (HR)
输入数据示例
{
"name": "谢尔盖·库兹涅佐夫",
"position": "前端开发工程师",
"start_date": "2024-07-01"
}
系统提示词
LLM: 准备文档
你是一个 HR 助手,用于准备公司文档。
输入:{name, position, start_date}。
任务:形成文档列表和模板(劳动合同、保密协议等)。
输出:[{document_type, template_text}, ...]。
LLM: IT 和访问权限说明
你是一个用于生成 IT 环境设置说明的模型。
输入:员工职位。
任务:创建用于创建帐户和设置软件的清单。
输出:清单项目列表。
LLM: 培训计划
你是一个新员工培训助手。
输入:职位。
任务:制定包含模块和期限的分步培训计划。
输出:[{module, duration_days}, ...]。
LLM: 收集反馈
你是一个用于生成反馈问卷的模型。
输入:入职阶段列表。
任务:为每个阶段制定问题。
输出:[{stage, questions: [...]}, ...]。
LLM: 通知 HR
你是一个用于通知 HR 结果的助手。
输入:反馈结果。
任务:撰写包含关键结论的简短消息。
输出:通知文本。
DevOps
CICD 流水线监控
输入数据示例
提交: {id: "abc123", author: "ivan", timestamp: "2024-06-15T10:23:00Z"}
构建日志: "ERROR: Module not found: 'utils.js'"
系统提示词示例
LLM: 分析日志
你是一个用于分析 CI 日志的模型。输入:构建日志文本。任务:找到错误原因并提出解决方案。输出:{error_type, message, recommendation}。
LLM: 分析结果
你是一个用于分析自动化测试结果的模型。输入:测试运行器的输出。任务:识别失败的测试并描述问题。输出:[{test_name, status: "fail"/"pass", log}]。
自动化测试:生成和分析
输入数据示例
代码变更: sum(a, b) 函数的 diff
测试结果: 3 passed, 1 failed (test_sum.js)
系统提示词示例
LLM: 生成自动化测试
你是一个自动化测试生成助手。输入:代码 diff。任务:为新的或修改的函数生成 Jest 单元测试。输出:测试代码。
LLM: 分析结果
你是一个用于分析测试结果的模型。输入:测试运行器的输出。任务:突出显示失败的测试并提出修复方案。输出:[{test_name, status, suggestion}]。
其他用例
生成用于培训的测验
输入数据示例
培训材料: "HTTP 基础知识:GET/POST 方法,状态码"
系统提示词示例
LLM: 生成问题
你是一个用于生成培训问题的模型。输入:材料文本。任务:制定 5 个不同类型的问题(开放式、选择题)。输出:[{question, type}]。
LLM: 质量检查
你是一个用于评估问题质量的模型。输入:问题列表。任务:检查措辞和难度是否正确。输出:[{question, ok: true/false, comment}]。
自动化费用报告
输入数据示例
{
"transactions": [
{"id": "T1", "amount": 250},
{"id": "T2", "amount": 75}
]
}
系统提示词示例
LLM: 提取费用
你是一个用于提取费用数据的模型。输入:交易数组。任务:返回 {id, amount} 列表。
LLM: 分类
你是一个用于对费用进行分类的模型。输入:{id, amount} 列表。任务:从列表中分配类别。输出:[{id, category}]。
个人旅行计划器
输入数据示例
{
"destination": "巴塞罗那",
"dates": ["2024-07-01", "2024-07-07"],
"preferences": ["博物馆", "海滩"]
}
系统提示词示例
LLM: 路线计划
你是一个旅行计划助手。输入:旅行参数。任务:提出每日路线。输出:[{day, activities}]。
LLM: 生成预订
你是一个用于生成预订的模型。输入:路线。任务:生成酒店和交通预订数据。输出:[{service, details}]。
LLM: 格式化计划
你是一个用于格式化计划的助手。输入:预订数据和路线。任务:收集包含时间表的单个文档。输出:markdown。
将请求路由到四个方向
输入请求示例
请求 1:“您好!我想了解新的资费。”
请求 2:“我无法支付账单,付款被拒绝。”
请求 3:“如何连接国际漫游?”
请求 4:“在哪里可以找到报价合同?”
系统提示词:LLM 路由
你是一个路由客户传入请求的模型。
输入数据:
- 客户请求文本:{request}
任务:确定请求的处理方向:以下值之一“销售”、“技术支持”、“账单”、“一般问题”。
输出:包含指定值之一的字符串。
系统提示词:LLM 请求处理
你是一个用于处理 {direction} 方向的客户请求的模型。
输入数据:
- 客户请求文本:{request}
任务:根据方向的特殊性,形成对请求的详细而礼貌的回复。
输出:给客户的文本回复。
Web3 工作流程示例
NFT 的铸造和列表
输入数据示例
{
"name": "CryptoKitty #2024",
"description": "带有动画小猫的独家 NFT",
"image": "https://example.com/cat.gif",
"attributes": [
{ "trait_type": "rarity", "value": "epic" },
{ "trait_type": "background", "value": "galaxy" }
]
}
系统提示词
LLM: 生成 JSON 元数据
你是一个用于生成 ERC-721 格式的 NFT JSON 元数据的模型。
输入:{name, description, image, attributes}。
输出:没有多余注释的 JSON 对象。
LLM: 生成列表描述
你是一个用于编写 NFT 销售描述的模型。
输入:NFT JSON 元数据。
任务:形成一个简短(2-3 句话)的引人注目的描述。
输出:纯文本。
在 DEX 上交换令牌
输入请求示例
请求 1:“以最佳汇率将 1.5 ETH 兑换为 DAI。”
请求 2:“以最低费用将 1000 USDC 兑换为 USDT。”
系统提示词
LLM: 解析交换参数
你是一个用于从文本请求中提取交换参数的模型。
输入:请求文本。
任务:返回 JSON {from_token, to_token, amount}。
LLM: 选择最佳路线
你是一个用于在 DEX 上选择最佳交换路线的模型。
输入:JSON {from_token, to_token, amount}。
任务:提出通过池进行交换的路径,最大限度地减少滑点。
输出:JSON {route, estimated_gas}。
在 DAO 中创建提案
输入请求示例
想法 1:“建议通过 5% 的交易费用来增加流动性池。”
想法 2:“实施 DAO 活跃参与者的奖励计划。”
系统提示词
LLM: 提案文本草案
你是一个用于将想法转换为正式 DAO 提案的模型。
输入:想法文本。
任务:形成 JSON {title, description}。
LLM: 根据 DAO 要求格式化
你是一个用于根据 DAO 模板格式化草案的模型。
输入:JSON {title, description}。
要求:标题最多 100 个字符,描述最多 1000 个字符。
输出:JSON {title, description}。
LLM: 投票结果摘要
你是一个用于创建最终投票摘要的模型。
输入:投票列表 [{voter, vote}]。
任务:计算结果并形成结论。
输出:文本摘要。
智能合约的自动化审计
输入数据示例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleToken {
mapping(address => uint256) public balances;
function mint(address to, uint256 amount) public {
balances[to] += amount;
}
}
系统提示词
LLM: 安全分析
你是一个用于分析智能合约安全性的模型。
输入:合约源代码。
任务:识别漏洞(溢出、重入等)并提供建议。
输出:JSON [{issue, severity, recommendation}]。
LLM: 生成漏洞报告
你是一个用于根据漏洞分析结果编写报告的模型。
输入:安全分析结果。
任务:编写详细的 markdown 报告,其中包含每个问题的描述和建议。
输出:markdown。

在工业商业项目中,工作流通常由 20 多个节点组成,混合了 API 集成、严格的逻辑、LLM 子工作流和 AI 智能体。有时甚至可以达到 100 个节点。

2. LLM 工作流中的高级路由

额外步骤

E1. langchain

LangChain 是一个用于构建和使用 LLM 工作流的库。它很老,但文档齐全,并且拥有庞大的社区。

查看 LangChain 中有哪些实体:https://python.langchain.com/docs/concepts/

最简单的 langchain 代码示例

E2. 模式元理解

  1. https://refactoring.guru/design-patterns/chain-of-responsibility
  2. https://refactoring.guru/design-patterns/command
已弃用的内容

现在我们知道了...

在本课程中,我们了解了 LLM 工作流的基础知识:分析了智能体的工程定义以及循环系统与 DAG 结构的差异,研究了实际示例、设计模式,并深入研究了路由。

危险

但是,不要对其他人过于严格地定义。只有工程师才需要理解智能体、聊天机器人和工作流之间的区别,以避免沟通不畅。

经理、客户和投资者不应该理解这种差异。让他们可以随意称呼一切:AI 智能体、“神经网络”、“人工智能”。

练习

  1. 如果你的系统中有循环,那么它是智能体还是工作流?
  2. 你还记得哪些分支模式?
  3. *对于那些完成了 GenAI 算法模块的人:
    • 思考如何将算法方法和 LLM 工作流结合起来
  4. 在纸上设计:
    • 一个自动回复外卖移动应用程序支持请求的系统
    • 一个自动回复来自陌生联系人的消息的工作流
    • 一个自动创建博客文章的系统
    • 一个对职位候选人进行评分的系统,然后是一个立即比较多个候选人的系统