Loading...
正在加载...
请稍候

12-Factor Agents - 构建可靠LLM应用的设计原则

✨步子哥 (steper) 2025年09月16日 12:48
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>12-Factor Agents - 构建可靠LLM应用的设计原则</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .intro { background-color: var(--card-bg); border-radius: 12px; padding: 20px; margin-bottom: 30px; box-shadow: var(--shadow); position: relative; z-index: 1; } .intro p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .principles-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; } .principle-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; display: flex; align-items: flex-start; } .principle-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .principle-number { font-size: 24px; font-weight: 700; color: var(--primary); margin-right: 15px; min-width: 30px; text-align: center; } .principle-content { flex: 1; } .principle-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 8px; } .principle-desc { font-size: 14px; color: var(--text-secondary); margin-bottom: 0; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .accent-text { color: var(--accent); font-weight: 500; } .icon-container { display: flex; justify-content: center; margin-bottom: 20px; } .icon-circle { width: 80px; height: 80px; border-radius: 50%; background-color: var(--primary-light); display: flex; justify-content: center; align-items: center; margin: 0 10px; } .material-icons { font-size: 40px; color: var(--primary); } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">12-Factor Agents</h1> <p class="subtitle">构建可靠LLM应用的设计原则</p> </div> <div class="intro"> <p>12-Factor Agents是一套<span class="accent-text">方法论</span>,就像软件开发领域的"12-Factor App"原则一样,它把传统软件工程里经过验证的最佳实践,创造性地用到了大模型驱动的Agent开发里。其核心目标是弥补Agent从原型开发到生产级应用的鸿沟,让Agent在<span class="accent-text">可靠性、可伸缩性、可维护性、可调试性和安全性</span>上,达到企业级应用的标准。</p> </div> <div class="icon-container"> <div class="icon-circle"> <i class="material-icons">psychology</i> </div> <div class="icon-circle"> <i class="material-icons">settings</i> </div> <div class="icon-circle"> <i class="material-icons">integration_instructions</i> </div> </div> <div class="principles-grid"> <div class="principle-card"> <div class="principle-number">1</div> <div class="principle-content"> <h3 class="principle-title">自然语言到工具调用</h3> <p class="principle-desc">将用户自然语言指令结构化转换为API调用,利用LLM的意图识别能力</p> </div> </div> <div class="principle-card"> <div class="principle-number">2</div> <div class="principle-content"> <h3 class="principle-title">掌控你的提示词</h3> <p class="principle-desc">开发者应完全控制LLM的提示词,提示词应像代码一样被设计、版本控制和测试</p> </div> </div> <div class="principle-card"> <div class="principle-number">3</div> <div class="principle-content"> <h3 class="principle-title">掌控你的上下文窗口</h3> <p class="principle-desc">主动管理和构建传递给LLM的上下文信息,包含LLM决策所需的一切信息</p> </div> </div> <div class="principle-card"> <div class="principle-number">4</div> <div class="principle-content"> <h3 class="principle-title">工具只是结构化输出</h3> <p class="principle-desc">Agent中工具调用的本质是LLM生成的结构化数据,触发确定性代码执行</p> </div> </div> <div class="principle-card"> <div class="principle-number">5</div> <div class="principle-content"> <h3 class="principle-title">统一执行状态和业务状态</h3> <p class="principle-desc">简化并统一执行状态和业务状态,Agent执行状态可从上下文窗口推断</p> </div> </div> <div class="principle-card"> <div class="principle-number">6</div> <div class="principle-content"> <h3 class="principle-title">通过简单API启动/暂停/恢复</h3> <p class="principle-desc">为Agent提供简单、直观的API接口,方便各种系统轻松交互</p> </div> </div> <div class="principle-card"> <div class="principle-number">7</div> <div class="principle-content"> <h3 class="principle-title">通过工具调用联系人工</h3> <p class="principle-desc">LLM通过工具调用明确与人工交互,而不是直接输出自然语言请求</p> </div> </div> <div class="principle-card"> <div class="principle-number">8</div> <div class="principle-content"> <h3 class="principle-title">掌控你的控制流</h3> <p class="principle-desc">开发者应完全控制Agent的控制流,而不是依赖框架的预设流程</p> </div> </div> <div class="principle-card"> <div class="principle-number">9</div> <div class="principle-content"> <h3 class="principle-title">将错误压缩到上下文窗口</h3> <p class="principle-desc">将错误信息压缩并整合到上下文窗口中,以便LLM能够理解和处理错误</p> </div> </div> <div class="principle-card"> <div class="principle-number">10</div> <div class="principle-content"> <h3 class="principle-title">小而专注的Agent</h3> <p class="principle-desc">构建小型、专注的Agent,每个Agent负责特定任务,而不是大型多功能Agent</p> </div> </div> <div class="principle-card"> <div class="principle-number">11</div> <div class="principle-content"> <h3 class="principle-title">从任何地方触发,在用户所在的地方与他们见面</h3> <p class="principle-desc">Agent应能从各种渠道触发,并在用户所在的地方交互</p> </div> </div> <div class="principle-card"> <div class="principle-number">12</div> <div class="principle-content"> <h3 class="principle-title">使你的Agent成为一个无状态的reducer</h3> <p class="principle-desc">Agent应设计为无状态的reducer,接收输入状态并返回新状态</p> </div> </div> </div> <div class="footer"> <p>这套原则不是一个像LangChain这样可以直接拿来用的"工具箱",而是一套<span class="accent-text">"方法论"</span>,帮助开发者构建生产级的LLM应用。</p> </div> </div> </body> </html>

讨论回复

13 条回复
✨步子哥 (steper) #1
09-16 12:55
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>12-Factor Agents - 背景与发展历史</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .timeline-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .era-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; display: flex; align-items: flex-start; } .era-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .era-icon { font-size: 36px; color: var(--primary); margin-right: 15px; min-width: 36px; } .era-content { flex: 1; } .era-title { font-size: 22px; font-weight: 700; color: var(--primary); margin-bottom: 8px; display: flex; align-items: center; } .era-time { font-size: 16px; color: var(--secondary); margin-left: 10px; font-weight: 500; } .era-desc { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .key-point { background-color: var(--primary-light); border-radius: 8px; padding: 15px; margin-top: 15px; border-left: 4px solid var(--primary); } .key-point p { font-size: 16px; color: var(--text-primary); margin-bottom: 0; font-weight: 500; } .accent-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .highlight-box { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .highlight-box p { font-size: 16px; margin-bottom: 0; font-weight: 500; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">12-Factor Agents - 背景与发展历史</h1> <p class="subtitle">从软件工程到智能代理的演变历程</p> </div> <div class="timeline-container"> <div class="era-card"> <i class="material-icons era-icon">account_tree</i> <div class="era-content"> <h3 class="era-title">软件工程的历史演变<span class="era-time">60年前</span></h3> <p class="era-desc">软件本质上是有向图(DG),早期我们用流程图表示程序。20年前,DAG编排器如Airflow、Prefect等开始流行,增加了可观察性、模块化、重试机制等功能。</p> </div> </div> <div class="era-card"> <i class="material-icons era-icon">psychology</i> <div class="era-content"> <h3 class="era-title">机器学习与DAG的结合<span class="era-time">10-15年前</span></h3> <p class="era-desc">当ML模型开始变得足够有用时,我们开始在DAG中加入ML模型,如文本摘要、分类等任务。但本质上仍是确定性软件。</p> </div> </div> <div class="era-card"> <i class="material-icons era-icon">auto_awesome</i> <div class="era-content"> <h3 class="era-title">Agent的承诺<span class="era-time">现在</span></h3> <p class="era-desc">Agent让我们可以抛弃DAG,不再需要软件工程师编写每个步骤和边缘情况。只需给Agent一个目标和一组转换,让LLM实时决策路径。</p> <div class="key-point"> <p>Agent的核心循环:LLM决定下一步 → 执行工具调用 → 结果添加到上下文窗口 → 重复直到完成</p> </div> </div> </div> <div class="era-card"> <i class="material-icons era-icon">warning</i> <div class="era-content"> <h3 class="era-title">Agent循环模式的挑战</h3> <p class="era-desc">最大问题:当上下文窗口过长时,Agent会迷失方向,反复尝试相同但无效的方法。即使模型支持更长的上下文窗口,<span class="accent-text">小而专注的提示词和上下文总能带来更好的结果</span>。</p> <div class="highlight-box"> <p>即使Agent正确率达到90%,也远未达到"可以交给客户使用"的标准</p> </div> </div> </div> <div class="era-card"> <i class="material-icons era-icon">lightbulb</i> <div class="era-content"> <h3 class="era-title">实际有效的解决方案:微代理(Micro Agents)</h3> <p class="era-desc">将Agent模式融入更广泛的确定性DAG中。语言模型管理范围明确的任务集,便于整合实时人工反馈,将其转化为工作流步骤,而不会陷入上下文错误循环。</p> <div class="key-point"> <p>真实案例:部署机器人(Deploybot)处理部署流程,通过LLM解析人类反馈并提出更新方案,隔离任务和上下文以保持LLM专注</p> </div> </div> </div> <div class="era-card"> <i class="material-icons era-icon">architecture</i> <div class="era-content"> <h3 class="era-title">Agent的本质</h3> <p class="era-desc">一个Agent由四个核心组件构成:</p> <ul style="margin-left: 20px; color: var(--text-secondary);"> <li><span class="accent-text">提示词</span> - 告诉LLM如何行为,有哪些可用工具</li> <li><span class="accent-text">Switch语句</span> - 根据LLM返回的JSON决定下一步行动</li> <li><span class="accent-text">累积上下文</span> - 存储已发生步骤及其结果</li> <li><span class="accent-text">For循环</span> - 直到LLM发出某种"终止"工具调用</li> </ul> </div> </div> </div> <div class="footer"> <p>12-Factor Agents将这些模式<span class="accent-text">形式化</span>,使其可应用于任何软件项目,添加令人印象深刻的AI功能,无需完全采用"AI Agent"的传统实现/定义。</p> </div> </div> </body> </html>
✨步子哥 (steper) #2
09-16 13:05
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则1:自然语言到工具调用</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .example-container { display: flex; gap: 20px; margin-top: 20px; } .example-box { flex: 1; background-color: var(--primary-light); border-radius: 8px; padding: 15px; border-left: 4px solid var(--primary); } .example-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; } .example-content { font-size: 14px; color: var(--text-primary); font-family: 'JetBrains Mono', monospace; white-space: pre-wrap; word-break: break-all; } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .highlight-text { color: var(--accent); font-weight: 500; } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则1:自然语言到工具调用</h1> <p class="subtitle">将用户自然语言指令结构化转换为API调用</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">translate</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>这是Agent构建中最常见的模式之一,将自然语言转换为结构化的工具调用。这种模式允许构建能够推理任务并执行它们的Agent,利用LLM的意图识别能力。</p> <div class="key-point"> <p>从自然语言请求到结构化API调用,LLM作为翻译桥梁,连接人类意图与机器执行</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare_arrows</i> <h3 class="card-title">工作原理</h3> </div> <div class="card-content"> <p>LLM接收自然语言输入,理解用户意图,然后返回一个结构化对象,描述需要执行的工具调用。确定性代码随后接收这个结构化对象并执行相应的操作。</p> <div class="code-block"><span class="code-comment"># LLM接收自然语言并返回结构化对象</span> <span class="code-keyword">nextStep</span> = <span class="code-keyword">await</span> llm.determineNextStep( <span class="code-string">""" create a payment link for $750 to Jeff for sponsoring the february AI tinkerers meetup """</span> ) <span class="code-comment"># 根据函数名称处理结构化输出</span> <span class="code-keyword">if</span> nextStep.function == <span class="code-string">'create_payment_link'</span>: stripe.<span class="code-function">paymentlinks</span>.<span class="code-function">create</span>(nextStep.parameters) <span class="code-keyword">return</span> <span class="code-keyword">elif</span> nextStep.function == <span class="code-string">'something_else'</span>: <span class="code-comment"># ... 其他情况</span> <span class="code-keyword">pass</span> <span class="code-keyword">else</span>: <span class="code-comment"># 模型调用了我们不知道的工具</span> <span class="code-comment"># 执行其他操作</span> <span class="code-keyword">pass</span></div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">code</i> <h3 class="card-title">实际应用示例</h3> </div> <div class="card-content"> <p>以下是将自然语言请求转换为Stripe API调用的示例:</p> <div class="example-container"> <div class="example-box"> <h4 class="example-title">自然语言请求</h4> <div class="example-content">can you create a payment link for $750 to Terri for sponsoring the february AI tinkerers meetup?</div> </div> <div class="example-box"> <h4 class="example-title">结构化API调用</h4> <div class="example-content">{ "function": { "name": "create_payment_link", "parameters": { "amount": 750, "customer": "cust_128934ddasf9", "product": "prod_8675309", "price": "prc_09874329fds", "quantity": 1, "memo": "Hey Jeff - see below for the payment link for the february ai tinkerers meetup" } } }</div> </div> </div> <p style="margin-top: 15px;">实际应用中,Agent可能需要先列出客户、产品和价格,以构建包含正确ID的有效载荷,或将这些ID包含在提示词/上下文窗口中。</p> </div> </div> </div> <div class="footer"> <p>自然语言到工具调用是Agent构建的基础模式,它将人类意图转换为机器可执行的结构化操作,是连接用户与系统的<span class="highlight-text">关键桥梁</span>。</p> </div> </div> </body> </html>
✨步子哥 (steper) #3
09-16 13:09
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则2:掌控你的提示词</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 960px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .comparison-container { display: flex; gap: 20px; margin-top: 15px; } .comparison-box { flex: 1; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .comparison-box.negative { border-left: 4px solid #f44336; } .comparison-box.positive { border-left: 4px solid var(--primary); } .comparison-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .comparison-title .material-icons { margin-right: 8px; } .comparison-title.negative { color: #f44336; } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则2:掌控你的提示词</h1> <p class="subtitle">不要将提示词工程外包给框架</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">code</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>开发者应该完全控制LLM的提示词,提示词应像代码一样被设计、版本控制和测试。不要依赖框架提供的"黑盒"方法,而是将提示词作为一等代码来管理。</p> <div class="key-point"> <p>提示词是应用逻辑和LLM之间的主要接口,拥有完全控制权对于生产级Agent至关重要</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare</i> <h3 class="card-title">框架方法 vs 直接掌控</h3> </div> <div class="card-content"> <div class="comparison-container"> <div class="comparison-box negative"> <h4 class="comparison-title negative"> <i class="material-icons">block</i>框架的"黑盒"方法 </h4> <div class="code-block"><span class="code-keyword">agent</span> = Agent( role=<span class="code-string">"..."</span>, goal=<span class="code-string">"..."</span>, personality=<span class="code-string">"..."</span>, tools=[tool1, tool2, tool3] ) <span class="code-keyword">task</span> = Task( instructions=<span class="code-string">"..."</span>, expected_output=OutputModel ) <span class="code-keyword">result</span> = agent.run(task)</div> <p style="margin-top: 10px; font-size: 14px;">这种方法虽然可以快速上手,但难以调整和逆向工程,无法精确控制模型接收的指令。</p> </div> <div class="comparison-box positive"> <h4 class="comparison-title"> <i class="material-icons">check_circle</i>直接掌控提示词 </h4> <div class="code-block"><span class="code-keyword">function</span> DetermineNextStep(thread: string) -> DoneForNow | ListGitTags | DeployBackend | DeployFrontend | RequestMoreInformation { prompt <span class="code-string">#" {{ _.role("system") }} You are a helpful assistant that manages deployments for frontend and backend systems. You work diligently to ensure safe and successful deployments by following best practices... {{ _.role("user") }} {{ thread }} What should the next step be? "#</span> }</div> <p style="margin-top: 10px; font-size: 14px;">直接掌控提示词,可以精确控制指令,便于测试和迭代,提高透明度。</p> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">掌控提示词的好处</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">control_camera</i> <div class="benefit-content"> <h4 class="benefit-title">完全控制</h4> <p class="benefit-desc">编写Agent所需的确切指令,无需黑盒抽象</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">checklist</i> <div class="benefit-content"> <h4 class="benefit-title">测试和评估</h4> <p class="benefit-desc">像对待其他代码一样为提示词构建测试和评估</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">loop</i> <div class="benefit-content"> <h4 class="benefit-title">快速迭代</h4> <p class="benefit-desc">根据实际性能快速修改提示词</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">visibility</i> <div class="benefit-content"> <h4 class="benefit-title">透明度</h4> <p class="benefit-desc">清楚了解Agent正在使用的指令</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">psychology</i> <div class="benefit-content"> <h4 class="benefit-title">角色利用</h4> <p class="benefit-desc">利用支持非标准用户/助手角色使用的API</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>我不知道什么是<span class="highlight-text">最佳提示词</span>,但我知道你希望拥有能够<span class="highlight-text">尝试一切</span>的灵活性。掌控你的提示词,为生产级Agent提供所需的灵活性和精确控制。</p> </div> </div> </body> </html>
✨步子哥 (steper) #4
09-16 13:29
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则3:掌控你的上下文窗口</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 1060px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .comparison-container { display: flex; gap: 20px; margin-top: 15px; } .comparison-box { flex: 1; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .comparison-box.standard { border-left: 4px solid var(--secondary); } .comparison-box.custom { border-left: 4px solid var(--primary); } .comparison-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .comparison-title .material-icons { margin-right: 8px; } .comparison-title.standard { color: var(--secondary); } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .context-example { background-color: #f5f7fa; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; color: var(--text-primary); border: 1px solid #e0e0e0; } .tag { color: var(--secondary); font-weight: 500; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则3:掌控你的上下文窗口</h1> <p class="subtitle">主动管理和构建传递给LLM的上下文信息</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">layers</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>不一定需要使用标准的基于消息的格式向LLM传递上下文。上下文工程是关键——LLM是无状态函数,将输入转换为输出,要获得最佳输出,需要提供最佳输入。</p> <div class="key-point"> <p>在任何给定的时刻,Agent对LLM的输入都是"这是到目前为止发生的事情,下一步是什么"</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare</i> <h3 class="card-title">标准与自定义上下文格式</h3> </div> <div class="card-content"> <div class="comparison-container"> <div class="comparison-box standard"> <h4 class="comparison-title standard"> <i class="material-icons">format_list_bulleted</i>标准消息格式 </h4> <div class="code-block">[ { <span class="code-string">"role"</span>: <span class="code-string">"system"</span>, <span class="code-string">"content"</span>: <span class="code-string">"You are a helpful assistant..."</span> }, { <span class="code-string">"role"</span>: <span class="code-string">"user"</span>, <span class="code-string">"content"</span>: <span class="code-string">"Can you deploy the backend?"</span> }, { <span class="code-string">"role"</span>: <span class="code-string">"assistant"</span>, <span class="code-string">"content"</span>: <span class="code-keyword">null</span>, <span class="code-string">"tool_calls"</span>: [ { <span class="code-string">"id"</span>: <span class="code-string">"1"</span>, <span class="code-string">"name"</span>: <span class="code-string">"list_git_tags"</span>, <span class="code-string">"arguments"</span>: <span class="code-string">"{}"</span> } ] } ]</div> <p style="margin-top: 10px; font-size: 14px;">标准格式适用于大多数用例,但可能不是最高效的上下文传递方式。</p> </div> <div class="comparison-box custom"> <h4 class="comparison-title"> <i class="material-icons">code</i>自定义上下文格式 </h4> <div class="code-block">[ { <span class="code-string">"role"</span>: <span class="code-string">"system"</span>, <span class="code-string">"content"</span>: <span class="code-string">"You are a helpful assistant..."</span> }, { <span class="code-string">"role"</span>: <span class="code-string">"user"</span>, <span class="code-string">"content"</span>: <span class="code-string">| Here's everything that happened so far: &lt;slack_message&gt; From: @alex Channel: #deployments Text: Can you deploy the backend? &lt;/slack_message&gt; &lt;list_git_tags&gt; intent: "list_git_tags" &lt;/list_git_tags&gt; &lt;list_git_tags_result&gt; tags: [...] &lt;/list_git_tags_result&gt; what's the next step? </span> } ]</div> <p style="margin-top: 10px; font-size: 14px;">自定义格式可以根据用例优化,提高令牌效率和LLM理解能力。</p> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">code</i> <h3 class="card-title">上下文示例</h3> </div> <div class="card-content"> <p>以下是使用XML风格格式的上下文窗口示例:</p> <div class="context-example"><span class="tag">&lt;slack_message&gt;</span> From: @alex Channel: #deployments Text: Can you deploy the latest backend to production? <span class="tag">&lt;/slack_message&gt;</span> <span class="tag">&lt;list_git_tags&gt;</span> intent: "list_git_tags" <span class="tag">&lt;/list_git_tags&gt;</span> <span class="tag">&lt;list_git_tags_result&gt;</span> tags: - name: "v1.2.3" commit: "abc123" date: "2024-03-15T10:00:00Z" - name: "v1.2.2" commit: "def456" date: "2024-03-14T15:30:00Z" <span class="tag">&lt;/list_git_tags_result&gt;</span></div> <p style="margin-top: 15px;">XML风格格式只是其中一种示例——关键是你可以构建适合自己应用的格式。拥有尝试不同上下文结构的灵活性将获得更好的质量。</p> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">掌控上下文窗口的好处</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">data_object</i> <div class="benefit-content"> <h4 class="benefit-title">信息密度</h4> <p class="benefit-desc">以最大化LLM理解的方式构建信息</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">healing</i> <div class="benefit-content"> <h4 class="benefit-title">错误处理</h4> <p class="benefit-desc">以帮助LLM恢复的格式包含错误信息</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">security</i> <div class="benefit-content"> <h4 class="benefit-title">安全性</h4> <p class="benefit-desc">控制传递给LLM的信息,过滤敏感数据</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">autorenew</i> <div class="benefit-content"> <h4 class="benefit-title">灵活性</h4> <p class="benefit-desc">根据学习到的最佳实践调整格式</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">speed</i> <div class="benefit-content"> <h4 class="benefit-title">令牌效率</h4> <p class="benefit-desc">优化上下文格式以提高令牌效率</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>上下文窗口是与LLM的<span class="highlight-text">主要接口</span>。控制如何构建和呈现信息可以<span class="highlight-text">显著提高</span>Agent的性能。我不知道什么是最佳方法,但我知道你希望拥有能够<span class="highlight-text">尝试一切</span>的灵活性。</p> </div> </div> </body> </html>
✨步子哥 (steper) #5
09-16 13:33
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则4:工具只是结构化输出</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .flow-diagram { display: flex; align-items: center; justify-content: space-between; margin: 20px 0; padding: 0 20px; } .flow-step { display: flex; flex-direction: column; align-items: center; width: 180px; text-align: center; } .flow-icon { width: 60px; height: 60px; border-radius: 50%; background-color: var(--primary-light); display: flex; justify-content: center; align-items: center; margin-bottom: 10px; } .flow-icon .material-icons { font-size: 30px; color: var(--primary); } .flow-text { font-size: 14px; color: var(--text-secondary); } .flow-arrow { color: var(--primary); font-size: 30px; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则4:工具只是结构化输出</h1> <p class="subtitle">Agent中工具调用的本质是LLM生成的结构化数据,触发确定性代码执行</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">data_object</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>工具调用本质上只是LLM生成的结构化输出,而不是特殊的API调用。LLM生成描述要执行的操作的结构化数据,然后确定性代码执行该操作。</p> <div class="key-point"> <p>工具调用是LLM决策与实际执行之间的桥梁,通过结构化数据实现清晰分离</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">sync_alt</i> <h3 class="card-title">工作流程</h3> </div> <div class="card-content"> <div class="flow-diagram"> <div class="flow-step"> <div class="flow-icon"> <i class="material-icons">psychology</i> </div> <p class="flow-text">LLM接收上下文<br>生成结构化输出</p> </div> <i class="material-icons flow-arrow">arrow_forward</i> <div class="flow-step"> <div class="flow-icon"> <i class="material-icons">code</i> </div> <p class="flow-text">确定性代码<br>解析结构化数据</p> </div> <i class="material-icons flow-arrow">arrow_forward</i> <div class="flow-step"> <div class="flow-icon"> <i class="material-icons">play_arrow</i> </div> <p class="flow-text">执行相应操作<br>返回结果</p> </div> </div> <div class="code-block"><span class="code-comment">// LLM生成的结构化输出示例</span> { <span class="code-string">"function"</span>: { <span class="code-string">"name"</span>: <span class="code-string">"deploy_backend"</span>, <span class="code-string">"parameters"</span>: { <span class="code-string">"tag"</span>: <span class="code-string">"v1.2.3"</span>, <span class="code-string">"environment"</span>: <span class="code-string">"production"</span> } } } <span class="code-comment">// 确定性代码处理</span> <span class="code-keyword">if</span> (output.function.name === <span class="code-string">"deploy_backend"</span>) { <span class="code-keyword">const</span> { tag, environment } = output.function.parameters; deployBackend(tag, environment); }</div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">优势与应用</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">architecture</i> <div class="benefit-content"> <h4 class="benefit-title">清晰分离</h4> <p class="benefit-desc">LLM决策与实际执行操作之间有明确界限</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">bug_report</i> <div class="benefit-content"> <h4 class="benefit-title">易于调试</h4> <p class="benefit-desc">可以检查结构化输出,更容易定位问题</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">settings_suggest</i> <div class="benefit-content"> <h4 class="benefit-title">灵活交互</h4> <p class="benefit-desc">支持更复杂的交互和工作流程</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">integration_instructions</i> <div class="benefit-content"> <h4 class="benefit-title">测试友好</h4> <p class="benefit-desc">可以模拟结构化输出进行单元测试</p> </div> </div> </div> <div class="key-point" style="margin-top: 20px;"> <p>这种模式比传统函数调用更灵活,允许更复杂的交互和工作流,同时保持代码的可测试性和可维护性</p> </div> </div> </div> </div> <div class="footer"> <p>将工具调用视为<span class="highlight-text">结构化输出</span>而非特殊API调用,可以带来更好的<span class="highlight-text">灵活性</span>和<span class="highlight-text">可维护性</span>。这种思维方式帮助构建更可靠、更易于调试的Agent系统。</p> </div> </div> </body> </html>
✨步子哥 (steper) #6
09-16 13:33
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则5:统一执行状态和业务状态</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .state-diagram { display: flex; flex-direction: column; align-items: center; margin: 20px 0; } .state-container { display: flex; width: 100%; justify-content: space-between; margin-bottom: 20px; } .state-box { width: 45%; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .state-box.execution { border-left: 4px solid var(--primary); } .state-box.business { border-left: 4px solid var(--secondary); } .state-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .state-title .material-icons { margin-right: 8px; } .state-title.business { color: var(--secondary); } .state-content { font-size: 14px; color: var(--text-secondary); } .unified-box { width: 90%; background-color: var(--primary-light); border-radius: 8px; padding: 15px; border-left: 4px solid var(--accent); margin-top: 20px; } .unified-title { font-size: 18px; font-weight: 700; color: var(--accent); margin-bottom: 10px; display: flex; align-items: center; } .unified-title .material-icons { margin-right: 8px; } .unified-content { font-size: 14px; color: var(--text-secondary); } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则5:统一执行状态和业务状态</h1> <p class="subtitle">简化并统一执行状态和业务状态,Agent执行状态可从上下文窗口推断</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">merge_type</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>简化并统一执行状态和业务状态,使Agent执行状态可以从上下文窗口中推断。这种方法减少了复杂性,使理解和调试代理更容易。</p> <div class="key-point"> <p>上下文窗口成为代理状态的单一真实来源,减少状态不一致的风险</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare_arrows</i> <h3 class="card-title">状态统一</h3> </div> <div class="card-content"> <div class="state-diagram"> <div class="state-container"> <div class="state-box execution"> <h4 class="state-title"> <i class="material-icons">play_circle</i>执行状态 </h4> <div class="state-content"> <p>Agent当前执行的位置、已完成的步骤、待处理的任务等执行流程相关信息。</p> </div> </div> <div class="state-box business"> <h4 class="state-title business"> <i class="material-icons">business</i>业务状态 </h4> <div class="state-content"> <p>业务数据、用户信息、配置参数等与业务逻辑相关的状态信息。</p> </div> </div> </div> <div class="unified-box"> <h4 class="unified-title"> <i class="material-icons">all_inclusive</i>统一状态 </h4> <div class="unified-content"> <p>将执行状态和业务状态统一存储在上下文窗口中,使Agent可以从上下文推断出完整状态。这种方式使状态管理更加简单,便于暂停、恢复和测试。</p> </div> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">code</i> <h3 class="card-title">实现示例</h3> </div> <div class="card-content"> <div class="code-block"><span class="code-comment">// 从上下文窗口推断执行状态</span> <span class="code-keyword">function</span> <span class="code-function">inferExecutionState</span>(context) { <span class="code-keyword">const</span> lastEvent = context[context.length - 1]; <span class="code-keyword">if</span> (lastEvent.type === <span class="code-string">'deploy_backend_result'</span>) { <span class="code-keyword">return</span> { status: <span class="code-string">'BACKEND_DEPLOYED'</span>, nextStep: <span class="code-string">'deploy_frontend'</span>, data: lastEvent.data }; } <span class="code-keyword">if</span> (lastEvent.type === <span class="code-string">'error'</span>) { <span class="code-keyword">return</span> { status: <span class="code-string">'ERROR_OCCURRED'</span>, nextStep: <span class="code-string">'handle_error'</span>, error: lastEvent.data }; } <span class="code-comment">// 默认状态</span> <span class="code-keyword">return</span> { status: <span class="code-string">'INITIAL'</span>, nextStep: <span class="code-string">'determine_next_action'</span> }; } <span class="code-comment">// 暂停和恢复Agent</span> <span class="code-keyword">async function</span> <span class="code-function">pauseAgent</span>(context) { <span class="code-comment">// 序列化上下文以供稍后恢复</span> <span class="code-keyword">await</span> saveToDatabase(context); <span class="code-keyword">return</span> <span class="code-string">"Agent paused successfully"</span>; } <span class="code-keyword">async function</span> <span class="code-function">resumeAgent</span>(agentId) { <span class="code-comment">// 从数据库恢复上下文</span> <span class="code-keyword">const</span> context = <span class="code-keyword">await</span> loadFromDatabase(agentId); <span class="code-comment">// 从上下文推断执行状态</span> <span class="code-keyword">const</span> state = inferExecutionState(context); <span class="code-comment">// 继续执行</span> <span class="code-keyword">return</span> <span class="code-keyword">await</span> continueExecution(state, context); }</div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">优势</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">psychology</i> <div class="benefit-content"> <h4 class="benefit-title">简化复杂性</h4> <p class="benefit-desc">减少状态管理的复杂性,使系统更易理解</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">pause_circle</i> <div class="benefit-content"> <h4 class="benefit-title">易于暂停/恢复</h4> <p class="benefit-desc">通过保存上下文轻松暂停和恢复Agent执行</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">bug_report</i> <div class="benefit-content"> <h4 class="benefit-title">便于调试</h4> <p class="benefit-desc">通过检查上下文更容易定位和解决问题</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">verified</i> <div class="benefit-content"> <h4 class="benefit-title">状态一致性</h4> <p class="benefit-desc">减少状态不一致的风险,提高系统健壮性</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>通过统一执行状态和业务状态,我们可以构建更<span class="highlight-text">可靠</span>、更<span class="highlight-text">易于维护</span>的Agent系统。上下文窗口成为状态的<span class="highlight-text">单一真实来源</span>,简化了状态管理并提高了系统的健壮性。</p> </div> </div> </body> </html>
✨步子哥 (steper) #7
09-16 13:37
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则6:通过简单API启动/暂停/恢复</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .api-diagram { display: flex; justify-content: space-between; margin: 20px 0; } .api-card { width: 30%; background-color: var(--primary-light); border-radius: 8px; padding: 15px; display: flex; flex-direction: column; align-items: center; text-align: center; transition: transform 0.3s ease; } .api-card:hover { transform: translateY(-5px); } .api-icon { width: 60px; height: 60px; border-radius: 50%; background-color: var(--primary); display: flex; justify-content: center; align-items: center; margin-bottom: 10px; } .api-icon .material-icons { font-size: 30px; color: white; } .api-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 8px; } .api-desc { font-size: 14px; color: var(--text-secondary); } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则6:通过简单API启动/暂停/恢复</h1> <p class="subtitle">为Agent提供简单、直观的API接口,方便各种系统轻松交互</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">api</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>为Agent提供简单、直观的API接口,使各种系统能够轻松与Agent交互。这些API应该易于使用、一致且直观,特别对于长时间运行的任务,暂停和恢复能力尤为重要。</p> <div class="key-point"> <p>简单API使Agent能够无缝集成到现有系统和工作流中,提高生产环境的可用性</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">touch_app</i> <h3 class="card-title">核心API操作</h3> </div> <div class="card-content"> <div class="api-diagram"> <div class="api-card"> <div class="api-icon"> <i class="material-icons">play_arrow</i> </div> <h4 class="api-title">启动</h4> <p class="api-desc">初始化Agent并开始执行任务,可传入初始上下文和配置</p> </div> <div class="api-card"> <div class="api-icon"> <i class="material-icons">pause</i> </div> <h4 class="api-title">暂停</h4> <p class="api-desc">临时停止Agent执行,保存当前状态以便后续恢复</p> </div> <div class="api-card"> <div class="api-icon"> <i class="material-icons">resume</i> </div> <h4 class="api-title">恢复</h4> <p class="api-desc">从暂停点继续执行Agent,恢复之前保存的状态</p> </div> </div> <div class="code-block"><span class="code-comment">// 简单的Agent API示例</span> <span class="code-keyword">class</span> <span class="code-function">AgentAPI</span> { <span class="code-comment">// 启动Agent</span> <span class="code-keyword">async</span> <span class="code-function">launch</span>(initialContext, config) { <span class="code-keyword">const</span> agentId = generateUniqueId(); <span class="code-keyword">await</span> initializeAgent(agentId, initialContext, config); <span class="code-keyword">return</span> { agentId, status: <span class="code-string">'running'</span> }; } <span class="code-comment">// 暂停Agent</span> <span class="code-keyword">async</span> <span class="code-function">pause</span>(agentId) { <span class="code-keyword">const</span> context = <span class="code-keyword">await</span> getCurrentContext(agentId); <span class="code-keyword">await</span> saveContext(agentId, context); <span class="code-keyword">await</span> stopExecution(agentId); <span class="code-keyword">return</span> { agentId, status: <span class="code-string">'paused'</span> }; } <span class="code-comment">// 恢复Agent</span> <span class="code-keyword">async</span> <span class="code-function">resume</span>(agentId) { <span class="code-keyword">const</span> context = <span class="code-keyword">await</span> loadContext(agentId); <span class="code-keyword">await</span> restoreExecution(agentId, context); <span class="code-keyword">return</span> { agentId, status: <span class="code-string">'running'</span> }; } }</div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">优势与应用</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">integration_instructions</i> <div class="benefit-content"> <h4 class="benefit-title">易于集成</h4> <p class="benefit-desc">简单API使Agent能够轻松集成到现有系统和工作流中</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">update</i> <div class="benefit-content"> <h4 class="benefit-title">状态管理</h4> <p class="benefit-desc">暂停/恢复功能使长时间运行任务的状态管理更加简单</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">settings</i> <div class="benefit-content"> <h4 class="benefit-title">可配置性</h4> <p class="benefit-desc">通过API参数轻松配置Agent行为,适应不同场景</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">monitor_heart</i> <div class="benefit-content"> <h4 class="benefit-title">监控与调试</h4> <p class="benefit-desc">通过API获取Agent状态,便于监控和调试</p> </div> </div> </div> <div class="key-point" style="margin-top: 20px;"> <p>简单、一致的API接口是Agent在生产环境中可靠运行的关键,它们使开发者能够轻松控制Agent生命周期,并将其无缝集成到更广泛的系统中</p> </div> </div> </div> </div> <div class="footer"> <p>通过提供<span class="highlight-text">简单直观</span>的API接口,我们可以使Agent更加<span class="highlight-text">易于使用</span>和<span class="highlight-text">集成</span>。这种设计理念使开发者能够专注于业务逻辑,而不是复杂的Agent控制机制。</p> </div> </div> </body> </html>
✨步子哥 (steper) #8
09-16 13:38
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则7:通过工具调用联系人工</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 960px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .comparison-container { display: flex; gap: 20px; margin-top: 15px; } .comparison-box { flex: 1; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .comparison-box.negative { border-left: 4px solid #f44336; } .comparison-box.positive { border-left: 4px solid var(--primary); } .comparison-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .comparison-title .material-icons { margin-right: 8px; } .comparison-title.negative { color: #f44336; } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .interaction-flow { display: flex; justify-content: space-between; align-items: center; margin: 20px 0; padding: 0 20px; } .flow-step { display: flex; flex-direction: column; align-items: center; width: 150px; text-align: center; } .flow-icon { width: 60px; height: 60px; border-radius: 50%; background-color: var(--primary-light); display: flex; justify-content: center; align-items: center; margin-bottom: 10px; } .flow-icon .material-icons { font-size: 30px; color: var(--primary); } .flow-text { font-size: 14px; color: var(--text-secondary); } .flow-arrow { color: var(--primary); font-size: 30px; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则7:通过工具调用联系人工</h1> <p class="subtitle">LLM通过工具调用明确与人工交互,而不是直接输出自然语言请求</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">contact_support</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>LLM应该使用工具调用来明确与人类交互,而不是直接输出自然语言请求。这种方法使交互更加结构化和可预测,便于将人类反馈集成到代理的工作流中。</p> <div class="key-point"> <p>通过工具调用明确请求人类输入或批准,比依赖自然语言解析人类响应更加健壮和可靠</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare</i> <h3 class="card-title">交互方式对比</h3> </div> <div class="card-content"> <div class="comparison-container"> <div class="comparison-box negative"> <h4 class="comparison-title negative"> <i class="material-icons">text_format</i>自然语言请求 </h4> <p style="font-size: 14px;">LLM直接输出自然语言请求人类帮助,这种方式难以解析和处理,可能导致误解或不一致的响应。</p> <div class="code-block"><span class="code-comment">// LLM直接输出自然语言请求</span> <span class="code-string">"我需要您的帮助才能继续。请告诉我是否应该部署到生产环境?"</span></div> </div> <div class="comparison-box positive"> <h4 class="comparison-title"> <i class="material-icons">build</i>工具调用请求 </h4> <p style="font-size: 14px;">LLM使用结构化工具调用请求人类输入,这种方式更加明确,便于系统处理和跟踪。</p> <div class="code-block"><span class="code-comment">// LLM使用工具调用请求人类输入</span> { <span class="code-string">"function"</span>: { <span class="code-string">"name"</span>: <span class="code-string">"request_human_approval"</span>, <span class="code-string">"parameters"</span>: { <span class="code-string">"action"</span>: <span class="code-string">"deploy_to_production"</span>, <span class="code-string">"details"</span>: <span class="code-string">"部署后端v1.2.3到生产环境"</span> } } }</div> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">sync_alt</i> <h3 class="card-title">交互流程</h3> </div> <div class="card-content"> <div class="interaction-flow"> <div class="flow-step"> <div class="flow-icon"> <i class="material-icons">psychology</i> </div> <p class="flow-text">LLM识别需要人类干预</p> </div> <i class="material-icons flow-arrow">arrow_forward</i> <div class="flow-step"> <div class="flow-icon"> <i class="material-icons">build</i> </div> <p class="flow-text">生成结构化工具调用</p> </div> <i class="material-icons flow-arrow">arrow_forward</i> <div class="flow-step"> <div class="flow-icon"> <i class="material-icons">person</i> </div> <p class="flow-text">人类接收并响应请求</p> </div> <i class="material-icons flow-arrow">arrow_forward</i> <div class="flow-step"> <div class="flow-icon"> <i class="material-icons">play_arrow</i> </div> <p class="flow-text">LLM继续执行任务</p> </div> </div> <div class="code-block"><span class="code-comment">// 工具调用示例 - 请求部署批准</span> { <span class="code-string">"function"</span>: { <span class="code-string">"name"</span>: <span class="code-string">"request_approval"</span>, <span class="code-string">"parameters"</span>: { <span class="code-string">"action"</span>: <span class="code-string">"deploy_backend"</span>, <span class="code-string">"version"</span>: <span class="code-string">"v1.2.3"</span>, <span class="code-string">"environment"</span>: <span class="code-string">"production"</span>, <span class="code-string">"reason"</span>: <span class="code-string">"修复了关键安全漏洞"</span> } } } <span class="code-comment">// 人类响应后的处理</span> <span class="code-keyword">if</span> (humanResponse.approved) { <span class="code-comment">// 继续执行部署</span> deployBackend(version, environment); } <span class="code-keyword">else</span> { <span class="code-comment">// 处理拒绝情况</span> handleRejection(humanResponse.reason); }</div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">优势</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">architecture</i> <div class="benefit-content"> <h4 class="benefit-title">结构化交互</h4> <p class="benefit-desc">明确的工具调用使交互更加结构化和可预测</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">integration_instructions</i> <div class="benefit-content"> <h4 class="benefit-title">易于集成</h4> <p class="benefit-desc">便于将人类反馈集成到代理的工作流中</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">security</i> <div class="benefit-content"> <h4 class="benefit-title">健壮性</h4> <p class="benefit-desc">比依赖自然语言解析人类响应更加健壮</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">fact_check</i> <div class="benefit-content"> <h4 class="benefit-title">可审计性</h4> <p class="benefit-desc">便于跟踪和审计与代理的人类交互</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>通过工具调用明确与人类交互,可以使Agent系统更加<span class="highlight-text">可靠</span>和<span class="highlight-text">可预测</span>。这种方法不仅提高了交互质量,还使人类反馈能够更有效地集成到AI工作流中。</p> </div> </div> </body> </html>
✨步子哥 (steper) #9
09-16 13:39
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则8:掌控你的控制流</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 1060px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .comparison-container { display: flex; gap: 20px; margin-top: 15px; } .comparison-box { flex: 1; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .comparison-box.framework { border-left: 4px solid var(--secondary); } .comparison-box.custom { border-left: 4px solid var(--primary); } .comparison-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .comparison-title .material-icons { margin-right: 8px; } .comparison-title.framework { color: var(--secondary); } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .control-flow-diagram { display: flex; flex-direction: column; align-items: center; margin: 20px 0; } .flow-container { display: flex; width: 100%; justify-content: space-between; margin-bottom: 20px; } .flow-box { width: 45%; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .flow-box.framework { border-left: 4px solid var(--secondary); } .flow-box.custom { border-left: 4px solid var(--primary); } .flow-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .flow-title .material-icons { margin-right: 8px; } .flow-title.framework { color: var(--secondary); } .flow-content { font-size: 14px; color: var(--text-secondary); } .flow-steps { display: flex; flex-direction: column; gap: 10px; margin-top: 10px; } .flow-step { display: flex; align-items: center; padding: 8px; background-color: rgba(255, 255, 255, 0.5); border-radius: 6px; } .step-number { width: 24px; height: 24px; border-radius: 50%; background-color: var(--primary); color: white; display: flex; justify-content: center; align-items: center; font-size: 14px; font-weight: 700; margin-right: 10px; } .step-number.framework { background-color: var(--secondary); } .step-text { font-size: 14px; color: var(--text-primary); } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则8:掌控你的控制流</h1> <p class="subtitle">开发者应完全控制Agent的控制流,而不是依赖框架的预设流程</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">account_tree</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>开发者应该完全控制Agent的控制流,而不是依赖框架的预设流程。这种方法为开发者提供了更多的灵活性和对Agent行为的控制,使为特定用例定制代理变得更加容易。</p> <div class="key-point"> <p>通过拥有控制流,开发者可以实现自定义逻辑和决策过程,使Agent更加适应特定需求</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare</i> <h3 class="card-title">控制流对比</h3> </div> <div class="card-content"> <div class="control-flow-diagram"> <div class="flow-container"> <div class="flow-box framework"> <h4 class="flow-title framework"> <i class="material-icons">settings_applications</i>框架控制流 </h4> <div class="flow-content"> <p>框架提供预设的控制流程,开发者只需配置参数和规则,难以实现自定义逻辑。</p> <div class="flow-steps"> <div class="flow-step"> <div class="step-number framework">1</div> <div class="step-text">初始化Agent</div> </div> <div class="flow-step"> <div class="step-number framework">2</div> <div class="step-text">框架处理输入</div> </div> <div class="flow-step"> <div class="step-number framework">3</div> <div class="step-text">执行预设流程</div> </div> <div class="flow-step"> <div class="step-number framework">4</div> <div class="step-text">返回结果</div> </div> </div> </div> </div> <div class="flow-box custom"> <h4 class="flow-title"> <i class="material-icons">code</i>自定义控制流 </h4> <div class="flow-content"> <p>开发者完全控制控制流,可以实现自定义逻辑和决策过程,更加灵活和适应性强。</p> <div class="flow-steps"> <div class="flow-step"> <div class="step-number">1</div> <div class="step-text">接收输入</div> </div> <div class="flow-step"> <div class="step-number">2</div> <div class="step-text">自定义预处理</div> </div> <div class="flow-step"> <div class="step-number">3</div> <div class="step-text">条件判断与分支</div> </div> <div class="flow-step"> <div class="step-number">4</div> <div class="step-text">自定义后处理</div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">code</i> <h3 class="card-title">实现示例</h3> </div> <div class="card-content"> <div class="comparison-container"> <div class="comparison-box framework"> <h4 class="comparison-title framework"> <i class="material-icons">settings</i>框架方式 </h4> <div class="code-block"><span class="code-comment">// 使用框架的预设控制流</span> <span class="code-keyword">from</span> some_framework <span class="code-keyword">import</span> Agent <span class="code-comment">// 创建Agent,配置预设参数</span> agent = Agent( name=<span class="code-string">"deployment_agent"</span>, goal=<span class="code-string">"Deploy applications to production"</span>, tools=[deploy_tool, check_status_tool] ) <span class="code-comment">// 运行Agent,框架控制整个流程</span> result = agent.run(<span class="code-string">"Deploy backend to production"</span>)</div> <p style="margin-top: 10px; font-size: 14px;">框架控制整个流程,开发者难以干预或自定义特定步骤。</p> </div> <div class="comparison-box custom"> <h4 class="comparison-title"> <i class="material-icons">developer_mode</i>自定义方式 </h4> <div class="code-block"><span class="code-comment">// 自定义控制流</span> <span class="code-keyword">async function</span> <span class="code-function">deployWithCustomFlow</span>(request) { <span class="code-comment">// 自定义预处理</span> <span class="code-keyword">const</span> context = <span class="code-keyword">await</span> preprocessRequest(request); <span class="code-comment">// 自定义条件判断</span> <span class="code-keyword">if</span> (context.environment === <span class="code-string">"production"</span>) { <span class="code-comment">// 生产环境特殊处理</span> <span class="code-keyword">const</span> approval = <span class="code-keyword">await</span> requestApproval(context); <span class="code-keyword">if</span> (!approval.approved) { <span class="code-keyword">return</span> handleRejection(approval.reason); } } <span class="code-comment">// 自定义部署逻辑</span> <span class="code-keyword">const</span> result = <span class="code-keyword">await</span> customDeployLogic(context); <span class="code-comment">// 自定义后处理</span> <span class="code-keyword">return</span> <span class="code-keyword">await</span> postProcessResult(result); }</div> <p style="margin-top: 10px; font-size: 14px;">开发者完全控制控制流,可以实现自定义逻辑和决策过程。</p> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">优势</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">tune</i> <div class="benefit-content"> <h4 class="benefit-title">完全控制</h4> <p class="benefit-desc">开发者可以完全控制Agent的行为和决策过程</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">settings_suggest</i> <div class="benefit-content"> <h4 class="benefit-title">自定义逻辑</h4> <p class="benefit-desc">可以实现特定业务逻辑和决策规则</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">autorenew</i> <div class="benefit-content"> <h4 class="benefit-title">灵活性</h4> <p class="benefit-desc">根据不同场景和需求灵活调整控制流</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">bug_report</i> <div class="benefit-content"> <h4 class="benefit-title">易于调试</h4> <p class="benefit-desc">自定义控制流使调试和优化更加容易</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>掌控你的控制流使开发者能够构建更加<span class="highlight-text">灵活</span>和<span class="highlight-text">适应性强</span>的Agent系统。通过自定义控制流,开发者可以实现特定业务逻辑,使Agent更好地满足实际需求。</p> </div> </div> </body> </html>
✨步子哥 (steper) #10
09-16 13:39
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则9:将错误压缩到上下文窗口</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 960px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .comparison-container { display: flex; gap: 20px; margin-top: 15px; } .comparison-box { flex: 1; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .comparison-box.inefficient { border-left: 4px solid #f44336; } .comparison-box.efficient { border-left: 4px solid var(--primary); } .comparison-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .comparison-title .material-icons { margin-right: 8px; } .comparison-title.inefficient { color: #f44336; } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .error-example { background-color: #f5f7fa; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; color: var(--text-primary); border: 1px solid #e0e0e0; } .tag { color: var(--secondary); font-weight: 500; } .error-text { color: #f44336; } .success-text { color: #4caf50; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则9:将错误压缩到上下文窗口</h1> <p class="subtitle">将错误信息压缩并整合到上下文窗口中,以便LLM能够理解和处理错误</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compress</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>将错误信息压缩并整合到上下文窗口中,以便LLM能够理解和处理错误。这种方法使LLM能够更有效地理解和处理错误,防止上下文窗口变得过大,并使LLM更容易从错误中恢复。</p> <div class="key-point"> <p>关键是在不占用过多上下文空间的情况下,提供足够的错误信息,使LLM能够理解出了什么问题以及如何恢复</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare</i> <h3 class="card-title">错误处理对比</h3> </div> <div class="card-content"> <div class="comparison-container"> <div class="comparison-box inefficient"> <h4 class="comparison-title inefficient"> <i class="material-icons">error_outline</i>完整错误详情 </h4> <p style="font-size: 14px;">将完整错误堆栈和详细信息包含在上下文中,占用大量空间,可能导致上下文窗口溢出。</p> <div class="error-example"><span class="tag">&lt;deploy_backend_result&gt;</span> <span class="error-text">error: ConnectionError: Failed to connect to deployment service at https://api.deploy.example.com/v1/deploy at Object.deploy (/app/src/deploy.js:45:13) at processTicksAndRejections (node:internal/process/task_queues.js:95:5) at async DeploymentService.execute (/app/src/services/deployment.js:23:19) at async Agent.handleToolCall (/app/src/agent.js:67:8) Request details: { method: 'POST', url: 'https://api.deploy.example.com/v1/deploy', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' }, body: '{"tag":"v1.2.3","environment":"production"}' } Response status: 503 Service Unavailable Response headers: { 'content-type': 'application/json', 'retry-after': '30' } Response body: '{"error":"Service temporarily unavailable","retry_after":30}'</span> <span class="tag">&lt;/deploy_backend_result&gt;</span></div> </div> <div class="comparison-box efficient"> <h4 class="comparison-title"> <i class="material-icons">data_object</i>压缩错误信息 </h4> <p style="font-size: 14px;">将错误信息压缩为关键要点,保留足够信息供LLM理解和恢复,同时节省上下文空间。</p> <div class="error-example"><span class="tag">&lt;deploy_backend_result&gt;</span> <span class="error-text">error: ConnectionError</span> message: Failed to connect to deployment service service: https://api.deploy.example.com/v1/deploy status: 503 Service Unavailable retry_after: 30 seconds attempted_action: deploy backend v1.2.3 to production <span class="tag">&lt;/deploy_backend_result&gt;</span></div> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">code</i> <h3 class="card-title">实现示例</h3> </div> <div class="card-content"> <div class="code-block"><span class="code-comment">// 错误压缩函数</span> <span class="code-keyword">function</span> <span class="code-function">compressError</span>(error, action) { <span class="code-keyword">return</span> { type: <span class="code-string">"error"</span>, error_type: error.name, message: error.message, service: error.config?.url || <span class="code-string">"unknown"</span>, status: error.response?.status, retry_after: error.response?.headers?.[<span class="code-string">'retry-after'</span>], attempted_action: action }; } <span class="code-comment">// 在Agent中使用压缩错误</span> <span class="code-keyword">async function</span> <span class="code-function">handleToolCall</span>(toolCall) { <span class="code-keyword">try</span> { <span class="code-keyword">const</span> result = <span class="code-keyword">await</span> executeTool(toolCall); <span class="code-keyword">return</span> { type: <span class="code-string">"success"</span>, data: result }; } <span class="code-keyword">catch</span> (error) { <span class="code-comment">// 压缩错误信息</span> <span class="code-keyword">const</span> compressedError = compressError(error, toolCall); <span class="code-keyword">return</span> compressedError; } } <span class="code-comment">// 将压缩错误添加到上下文</span> <span class="code-keyword">async function</span> <span class="code-function">addToContext</span>(context, event) { <span class="code-keyword">if</span> (event.type === <span class="code-string">"error"</span>) { <span class="code-comment">// 对于已解决的错误,可以选择隐藏或简化</span> <span class="code-keyword">if</span> (event.resolved) { context.push({ type: <span class="code-string">"error_resolved"</span>, original_error: event.error_type, resolution: event.resolution }); } <span class="code-keyword">else</span> { context.push(event); } } <span class="code-keyword">else</span> { context.push(event); } }</div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">优势</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">memory</i> <div class="benefit-content"> <h4 class="benefit-title">上下文效率</h4> <p class="benefit-desc">压缩错误信息节省上下文空间,防止窗口溢出</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">healing</i> <div class="benefit-content"> <h4 class="benefit-title">错误恢复</h4> <p class="benefit-desc">LLM更容易理解错误并采取恢复措施</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">auto_fix_high</i> <div class="benefit-content"> <h4 class="benefit-title">智能处理</h4> <p class="benefit-desc">可以隐藏已解决的错误,避免重复处理</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">track_changes</i> <div class="benefit-content"> <h4 class="benefit-title">错误跟踪</h4> <p class="benefit-desc">便于跟踪和管理Agent工作流中的错误</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>通过将错误信息<span class="highlight-text">压缩</span>到上下文窗口,我们可以构建更加<span class="highlight-text">高效</span>和<span class="highlight-text">可靠</span>的Agent系统。这种方法不仅节省了宝贵的上下文空间,还使LLM能够更好地理解和处理错误情况。</p> </div> </div> </body> </html>
✨步子哥 (steper) #11
09-16 13:40
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则10:小而专注的Agent</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 1060px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .comparison-container { display: flex; gap: 20px; margin-top: 15px; } .comparison-box { flex: 1; background-color: var(--primary-light); border-radius: 8px; padding: 15px; position: relative; } .comparison-box.monolithic { border-left: 4px solid #f44336; } .comparison-box.focused { border-left: 4px solid var(--primary); } .comparison-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 10px; display: flex; align-items: center; } .comparison-title .material-icons { margin-right: 8px; } .comparison-title.monolithic { color: #f44336; } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .agent-diagram { display: flex; justify-content: space-between; margin: 20px 0; } .agent-box { width: 30%; background-color: var(--primary-light); border-radius: 8px; padding: 15px; display: flex; flex-direction: column; align-items: center; text-align: center; transition: transform 0.3s ease; } .agent-box:hover { transform: translateY(-5px); } .agent-icon { width: 60px; height: 60px; border-radius: 50%; background-color: var(--primary); display: flex; justify-content: center; align-items: center; margin-bottom: 10px; } .agent-icon .material-icons { font-size: 30px; color: white; } .agent-title { font-size: 18px; font-weight: 700; color: var(--primary); margin-bottom: 8px; } .agent-desc { font-size: 14px; color: var(--text-secondary); } .agent-arrow { color: var(--primary); font-size: 30px; align-self: center; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则10:小而专注的Agent</h1> <p class="subtitle">创建小而专注的Agent,专注于做好一件事,而不是试图做所有事情的大型通用Agent</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">center_focus_strong</i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>创建小而专注的Agent,每个Agent专注于做好一件事,而不是构建试图做所有事情的大型通用Agent。这种方法使代理更加可靠且易于维护,也使测试和调试代理变得更加容易。</p> <div class="key-point"> <p>通过专注于特定任务,Agent可以针对该任务进行优化,比构建大型、单体Agent更具可扩展性</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">compare</i> <h3 class="card-title">Agent设计对比</h3> </div> <div class="card-content"> <div class="comparison-container"> <div class="comparison-box monolithic"> <h4 class="comparison-title monolithic"> <i class="material-icons">all_inclusive</i>单体通用Agent </h4> <p style="font-size: 14px;">一个大型Agent试图处理所有任务,包含复杂的逻辑和决策过程,难以维护和优化。</p> <div class="code-block"><span class="code-comment">// 单体通用Agent示例</span> <span class="code-keyword">class</span> <span class="code-function">MonolithicAgent</span> { <span class="code-keyword">async</span> <span class="code-function">handleRequest</span>(request) { <span class="code-comment">// 处理各种类型的请求</span> <span class="code-keyword">if</span> (request.type === <span class="code-string">"deploy"</span>) { <span class="code-comment">// 复杂的部署逻辑</span> <span class="code-keyword">return</span> <span class="code-keyword">await</span> this.handleDeploy(request); } <span class="code-keyword">else if</span> (request.type === <span class="code-string">"monitor"</span>) { <span class="code-comment">// 复杂的监控逻辑</span> <span class="code-keyword">return</span> <span class="code-keyword">await</span> this.handleMonitor(request); } <span class="code-keyword">else if</span> (request.type === <span class="code-string">"report"</span>) { <span class="code-comment">// 复杂的报告逻辑</span> <span class="code-keyword">return</span> <span class="code-keyword">await</span> this.handleReport(request); } <span class="code-comment">// ... 更多复杂的处理逻辑</span> } }</div> </div> <div class="comparison-box focused"> <h4 class="comparison-title"> <i class="material-icons">widgets</i>小而专注的Agent </h4> <p style="font-size: 14px;">多个小型Agent,每个专注于特定任务,逻辑简单清晰,易于维护和优化。</p> <div class="code-block"><span class="code-comment">// 专注的部署Agent</span> <span class="code-keyword">class</span> <span class="code-function">DeploymentAgent</span> { <span class="code-keyword">async</span> <span class="code-function">handleDeploy</span>(request) { <span class="code-comment">// 专注于部署逻辑</span> <span class="code-keyword">const</span> deployment = <span class="code-keyword">await</span> this.prepareDeployment(request); <span class="code-keyword">return</span> <span class="code-keyword">await</span> this.executeDeployment(deployment); } } <span class="code-comment">// 专注的监控Agent</span> <span class="code-keyword">class</span> <span class="code-function">MonitoringAgent</span> { <span class="code-keyword">async</span> <span class="code-function">handleMonitor</span>(request) { <span class="code-comment">// 专注于监控逻辑</span> <span class="code-keyword">const</span> metrics = <span class="code-keyword">await</span> this.collectMetrics(request); <span class="code-keyword">return</span> <span class="code-keyword">await</span> this.analyzeMetrics(metrics); } }</div> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">view_module</i> <h3 class="card-title">专注Agent示例</h3> </div> <div class="card-content"> <div class="agent-diagram"> <div class="agent-box"> <div class="agent-icon"> <i class="material-icons">rocket_launch</i> </div> <h4 class="agent-title">部署Agent</h4> <p class="agent-desc">专注于应用程序部署流程,处理版本控制、环境配置和部署验证</p> </div> <i class="material-icons agent-arrow">add</i> <div class="agent-box"> <div class="agent-icon"> <i class="material-icons">monitor_heart</i> </div> <h4 class="agent-title">监控Agent</h4> <p class="agent-desc">专注于系统监控和性能分析,收集指标并生成警报</p> </div> <i class="material-icons agent-arrow">add</i> <div class="agent-box"> <div class="agent-icon"> <i class="material-icons">assessment</i> </div> <h4 class="agent-title">报告Agent</h4> <p class="agent-desc">专注于数据分析和报告生成,创建可视化图表和摘要</p> </div> </div> <div class="code-block"><span class="code-comment">// 组合专注Agent的工作流</span> <span class="code-keyword">async function</span> <span class="code-function">deployAndMonitor</span>(appConfig) { <span class="code-comment">// 1. 使用部署Agent</span> <span class="code-keyword">const</span> deployAgent = <span class="code-keyword">new</span> DeploymentAgent(); <span class="code-keyword">const</span> deploymentResult = <span class="code-keyword">await</span> deployAgent.handleDeploy(appConfig); <span class="code-comment">// 2. 使用监控Agent</span> <span class="code-keyword">const</span> monitorAgent = <span class="code-keyword">new</span> MonitoringAgent(); <span class="code-keyword">const</span> monitoringResult = <span class="code-keyword">await</span> monitorAgent.handleMonitor({ appId: deploymentResult.appId, duration: <span class="code-string">"1h"</span> }); <span class="code-comment">// 3. 使用报告Agent</span> <span class="code-keyword">const</span> reportAgent = <span class="code-keyword">new</span> ReportAgent(); <span class="code-keyword">const</span> reportResult = <span class="code-keyword">await</span> reportAgent.generateReport({ deployment: deploymentResult, monitoring: monitoringResult }); <span class="code-keyword">return</span> reportResult; }</div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="material-icons card-icon">stars</i> <h3 class="card-title">优势</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="material-icons benefit-icon">verified</i> <div class="benefit-content"> <h4 class="benefit-title">可靠性</h4> <p class="benefit-desc">专注的Agent更可靠,错误隔离,不会影响整个系统</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">build</i> <div class="benefit-content"> <h4 class="benefit-title">易于维护</h4> <p class="benefit-desc">小型Agent代码简单,逻辑清晰,易于理解和修改</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">speed</i> <div class="benefit-content"> <h4 class="benefit-title">性能优化</h4> <p class="benefit-desc">可以针对特定任务进行优化,提高执行效率</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">extension</i> <div class="benefit-content"> <h4 class="benefit-title">可扩展性</h4> <p class="benefit-desc">易于添加新功能,只需创建新的专注Agent</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">bug_report</i> <div class="benefit-content"> <h4 class="benefit-title">易于调试</h4> <p class="benefit-desc">问题定位更容易,每个Agent职责明确</p> </div> </div> <div class="benefit-item"> <i class="material-icons benefit-icon">repeat</i> <div class="benefit-content"> <h4 class="benefit-title">可重用性</h4> <p class="benefit-desc">专注的Agent可以在不同工作流中重复使用</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>通过创建<span class="highlight-text">小而专注</span>的Agent,我们可以构建更加<span class="highlight-text">可靠</span>、<span class="highlight-text">可维护</span>和<span class="highlight-text">可扩展</span>的系统。每个Agent专注于做好一件事,然后通过组合这些专注的Agent来构建复杂的工作流。</p> </div> </div> </body> </html>
✨步子哥 (steper) #12
09-16 13:55
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则11:从任何地方触发,在用户所在的地方与他们互动</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/css/all.min.css"> <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .channel-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 15px; margin-top: 20px; } .channel-item { background-color: var(--primary-light); border-radius: 8px; padding: 15px; display: flex; flex-direction: column; align-items: center; text-align: center; transition: transform 0.3s ease; } .channel-item:hover { transform: translateY(-5px); } .channel-icon { font-size: 28px; color: var(--primary); margin-bottom: 10px; } .channel-name { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefits-container { display: flex; flex-direction: column; gap: 15px; margin-top: 20px; } .benefit-card { background-color: var(--primary-light); border-radius: 12px; padding: 20px; border-left: 4px solid var(--primary); transition: transform 0.3s ease; } .benefit-card:hover { transform: translateY(-5px); } .benefit-header { display: flex; align-items: center; margin-bottom: 10px; } .benefit-icon { font-size: 24px; color: var(--primary); margin-right: 10px; } .benefit-title { font-size: 18px; font-weight: 700; color: var(--primary); } .benefit-content { font-size: 14px; color: var(--text-secondary); } .flow-diagram { display: flex; justify-content: space-between; align-items: center; margin: 30px 0; position: relative; } .flow-node { width: 120px; height: 120px; border-radius: 50%; background-color: var(--primary-light); display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; z-index: 2; transition: transform 0.3s ease; } .flow-node:hover { transform: scale(1.1); } .flow-icon { font-size: 32px; color: var(--primary); margin-bottom: 5px; } .flow-text { font-size: 14px; font-weight: 700; color: var(--primary); } .flow-line { position: absolute; top: 50%; left: 0; right: 0; height: 4px; background-color: var(--primary-light); z-index: 1; } </style> </head> <body> <div class="poster-container"> <div class="header"> <h1 class="title">原则11:从任何地方触发,在用户所在的地方与他们互动</h1> <p class="subtitle">使用户能够从任何渠道触发Agent,并通过相同渠道获得响应</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="fas fa-broadcast-tower card-icon"></i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>使用户能够从Slack、电子邮件、短信或任何其他他们想要的渠道触发Agent,并使Agent能够通过相同的渠道进行响应。这种方法打破了传统应用的界限,让AI能够无缝融入用户现有的工作流程和沟通渠道。</p> <div class="key-point"> <p>让Agent能够从任何地方被触发,并在用户所在的地方与他们互动,创造更自然、更高效的人机协作体验</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="fas fa-plug card-icon"></i> <h3 class="card-title">多渠道集成</h3> </div> <div class="card-content"> <p>Agent应该能够无缝集成到用户现有的沟通渠道和工作流中,而不是要求用户适应新的界面或工具。</p> <div class="channel-grid"> <div class="channel-item"> <i class="fab fa-slack channel-icon"></i> <h4 class="channel-name">Slack</h4> </div> <div class="channel-item"> <i class="fas fa-envelope channel-icon"></i> <h4 class="channel-name">电子邮件</h4> </div> <div class="channel-item"> <i class="fas fa-sms channel-icon"></i> <h4 class="channel-name">短信</h4> </div> <div class="channel-item"> <i class="fas fa-calendar-alt channel-icon"></i> <h4 class="channel-name">日历</h4> </div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="fas fa-random card-icon"></i> <h3 class="card-title">交互流程</h3> </div> <div class="card-content"> <div class="flow-diagram"> <div class="flow-line"></div> <div class="flow-node"> <i class="fas fa-user flow-icon"></i> <p class="flow-text">用户触发</p> </div> <div class="flow-node"> <i class="fas fa-robot flow-icon"></i> <p class="flow-text">Agent处理</p> </div> <div class="flow-node"> <i class="fas fa-reply flow-icon"></i> <p class="flow-text">原渠道响应</p> </div> </div> <p>无论用户从哪个渠道发起请求,Agent都应该能够理解并处理,然后通过相同的渠道返回响应,创造无缝的交互体验。</p> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="fas fa-star card-icon"></i> <h3 class="card-title">核心优势</h3> </div> <div class="card-content"> <div class="benefits-container"> <div class="benefit-card"> <div class="benefit-header"> <i class="fas fa-users benefit-icon"></i> <h4 class="benefit-title">在用户所在的地方与他们互动</h4> </div> <div class="benefit-content"> <p>这有助于构建感觉像真实人类或至少是数字同事的AI应用程序。用户无需学习新工具或改变工作流程,可以在他们熟悉的渠道中与AI交互。</p> </div> </div> <div class="benefit-card"> <div class="benefit-header"> <i class="fas fa-sync-alt benefit-icon"></i> <h4 class="benefit-title">外循环Agent</h4> </div> <div class="benefit-content"> <p>使Agent能够被非人类触发(例如事件、定时任务、故障等),它们可能工作5、20或90分钟,但当到达关键点时,可以联系人类寻求帮助、反馈或批准。</p> </div> </div> <div class="benefit-card"> <div class="benefit-header"> <i class="fas fa-shield-alt benefit-icon"></i> <h4 class="benefit-title">高风险工具</h4> </div> <div class="benefit-content"> <p>如果您能够快速引入各种人类,您可以让Agent访问更高风险的操作,如发送外部电子邮件、更新生产数据等。保持清晰的标准使您能够审计并对执行更大更好事情的Agent充满信心。</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>通过使Agent能够<span class="highlight-text">从任何地方触发</span>并在<span class="highlight-text">用户所在的地方互动</span>,我们可以创造更加自然、高效的人机协作体验,打破传统应用的界限,让AI无缝融入现有工作流程。</p> </div> </div> </body> </html>
✨步子哥 (steper) #13
09-16 14:07
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>原则12:使你的Agent成为一个无状态的reducer</title> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.0/css/all.min.css"> <style> :root { --primary: #1565c0; --primary-light: #e3f2fd; --secondary: #5c6bc0; --accent: #03a9f4; --text-primary: #263238; --text-secondary: #455a64; --background: #f5f7fa; --card-bg: #ffffff; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: var(--background); color: var(--text-primary); line-height: 1.6; } .poster-container { width: 720px; min-height: 960px; margin: 0 auto; padding: 40px 20px; background: linear-gradient(135deg, #f5f7fa 0%, #e4ecf7 100%); position: relative; overflow: hidden; display: flex; flex-direction: column; } .poster-container::before { content: ""; position: absolute; top: -150px; right: -150px; width: 400px; height: 400px; border-radius: 50%; background: linear-gradient(135deg, rgba(21, 101, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .poster-container::after { content: ""; position: absolute; bottom: -100px; left: -100px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, rgba(92, 107, 192, 0.1) 0%, rgba(3, 169, 244, 0.1) 100%); z-index: 0; } .header { text-align: center; margin-bottom: 30px; position: relative; z-index: 1; } .title { font-size: 42px; font-weight: 700; color: var(--primary); margin-bottom: 10px; letter-spacing: -0.5px; } .subtitle { font-size: 18px; color: var(--text-secondary); max-width: 600px; margin: 0 auto; } .content-container { display: flex; flex-direction: column; gap: 20px; margin-bottom: 30px; position: relative; z-index: 1; flex-grow: 1; } .concept-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; } .concept-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .card-icon { font-size: 36px; color: var(--primary); margin-right: 15px; } .card-title { font-size: 24px; font-weight: 700; color: var(--primary); } .card-content { font-size: 16px; color: var(--text-secondary); } .key-point { background-color: var(--primary); color: white; border-radius: 8px; padding: 15px; margin-top: 15px; } .key-point p { font-size: 16px; margin-bottom: 0; font-weight: 500; } .highlight-text { color: var(--accent); font-weight: 500; } .footer { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow); text-align: center; position: relative; z-index: 1; margin-top: auto; } .footer p { font-size: 16px; color: var(--text-secondary); margin-bottom: 0; } .reducer-diagram { display: flex; justify-content: space-between; align-items: center; margin: 30px 0; position: relative; } .reducer-node { width: 140px; height: 140px; border-radius: 50%; background-color: var(--primary-light); display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; z-index: 2; transition: transform 0.3s ease; } .reducer-node:hover { transform: scale(1.1); } .reducer-icon { font-size: 36px; color: var(--primary); margin-bottom: 8px; } .reducer-text { font-size: 14px; font-weight: 700; color: var(--primary); } .reducer-arrow { color: var(--primary); font-size: 32px; } .code-block { background-color: #263238; color: #e3f2fd; border-radius: 8px; padding: 15px; margin-top: 15px; font-family: 'JetBrains Mono', monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre; } .code-comment { color: #78909c; } .code-keyword { color: #82aaff; } .code-string { color: #c3e88d; } .code-function { color: #ffcb6b; } .benefits-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 15px; } .benefit-item { display: flex; align-items: flex-start; background-color: var(--primary-light); border-radius: 8px; padding: 12px; } .benefit-icon { color: var(--primary); margin-right: 10px; font-size: 24px; } .benefit-content { flex: 1; } .benefit-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .benefit-desc { font-size: 14px; color: var(--text-secondary); margin: 0; } .state-example { background-color: var(--primary-light); border-radius: 8px; padding: 15px; margin-top: 15px; border-left: 4px solid var(--primary); } .state-title { font-size: 16px; font-weight: 700; color: var(--primary); margin-bottom: 10px; } .state-content { font-size: 14px; color: var(--text-secondary); font-family: 'JetBrains Mono', monospace; } .fun-badge { position: absolute; top: 20px; right: 20px; background-color: var(--accent); color: white; font-weight: 700; padding: 8px 16px; border-radius: 20px; font-size: 14px; transform: rotate(10deg); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); z-index: 10; } </style> </head> <body> <div class="poster-container"> <div class="fun-badge">Just for fun!</div> <div class="header"> <h1 class="title">原则12:使你的Agent成为一个无状态的reducer</h1> <p class="subtitle">Agent应设计为无状态的reducer,接收输入状态并返回新状态</p> </div> <div class="content-container"> <div class="concept-card"> <div class="card-header"> <i class="fas fa-sync-alt card-icon"></i> <h3 class="card-title">核心概念</h3> </div> <div class="card-content"> <p>Agent应设计为无状态的reducer,接收输入状态并返回新状态。这种方法使Agent更加可预测、可测试和可扩展,同时简化了状态管理和恢复。</p> <div class="key-point"> <p>将Agent设计为纯函数,给定相同的输入总是产生相同的输出,不依赖于外部状态或副作用</p> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="fas fa-code-branch card-icon"></i> <h3 class="card-title">Reducer模式</h3> </div> <div class="card-content"> <div class="reducer-diagram"> <div class="reducer-node"> <i class="fas fa-sign-in-alt reducer-icon"></i> <p class="reducer-text">输入状态</p> </div> <i class="fas fa-long-arrow-alt-right reducer-arrow"></i> <div class="reducer-node"> <i class="fas fa-robot reducer-icon"></i> <p class="reducer-text">Agent处理</p> </div> <i class="fas fa-long-arrow-alt-right reducer-arrow"></i> <div class="reducer-node"> <i class="fas fa-sign-out-alt reducer-icon"></i> <p class="reducer-text">输出状态</p> </div> </div> <div class="code-block"><span class="code-comment">// Agent作为reducer的示例</span> <span class="code-keyword">function</span> <span class="code-function">agentReducer</span>(currentState, action) { <span class="code-comment">// 根据当前状态和动作计算新状态</span> <span class="code-keyword">switch</span> (action.type) { <span class="code-keyword">case</span> <span class="code-string">'DEPLOY_REQUEST'</span>: <span class="code-keyword">return</span> { ...currentState, status: <span class="code-string">'deploying'</span>, deployment: action.payload }; <span class="code-keyword">case</span> <span class="code-string">'DEPLOY_SUCCESS'</span>: <span class="code-keyword">return</span> { ...currentState, status: <span class="code-string">'deployed'</span>, lastDeployment: action.payload }; <span class="code-keyword">case</span> <span class="code-string">'DEPLOY_ERROR'</span>: <span class="code-keyword">return</span> { ...currentState, status: <span class="code-string">'error'</span>, error: action.payload }; <span class="code-keyword">default</span>: <span class="code-keyword">return</span> currentState; } }</div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="fas fa-database card-icon"></i> <h3 class="card-title">状态管理</h3> </div> <div class="card-content"> <p>在无状态reducer模式中,Agent不维护内部状态,而是接收完整的状态作为输入,并返回新的状态。状态由外部系统管理,使Agent更加可预测和可测试。</p> <div class="state-example"> <h4 class="state-title">状态转换示例</h4> <div class="state-content">// 初始状态 { status: 'idle', deployments: [], error: null } // 部署请求后 { status: 'deploying', deployments: [], error: null, currentDeployment: { app: 'myapp', version: 'v1.2.3' } } // 部署成功后 { status: 'deployed', deployments: [{ app: 'myapp', version: 'v1.2.3', time: '2023-06-15T10:30:00Z' }], error: null }</div> </div> </div> </div> <div class="concept-card"> <div class="card-header"> <i class="fas fa-star card-icon"></i> <h3 class="card-title">优势</h3> </div> <div class="card-content"> <div class="benefits-list"> <div class="benefit-item"> <i class="fas fa-vial benefit-icon"></i> <div class="benefit-content"> <h4 class="benefit-title">易于测试</h4> <p class="benefit-desc">纯函数易于单元测试,可以轻松模拟各种输入和状态</p> </div> </div> <div class="benefit-item"> <i class="fas fa-redo benefit-icon"></i> <div class="benefit-content"> <h4 class="benefit-title">可重现性</h4> <p class="benefit-desc">给定相同的输入总是产生相同的输出,便于调试和问题重现</p> </div> </div> <div class="benefit-item"> <i class="fas fa-expand-arrows-alt benefit-icon"></i> <div class="benefit-content"> <h4 class="benefit-title">可扩展性</h4> <p class="benefit-desc">无状态设计使Agent更容易水平扩展和并行处理</p> </div> </div> <div class="benefit-item"> <i class="fas fa-history benefit-icon"></i> <div class="benefit-content"> <h4 class="benefit-title">时间旅行调试</h4> <p class="benefit-desc">可以轻松回放状态序列,便于调试和分析Agent行为</p> </div> </div> <div class="benefit-item"> <i class="fas fa-pause benefit-icon"></i> <div class="benefit-content"> <h4 class="benefit-title">暂停/恢复</h4> <p class="benefit-desc">通过保存和恢复状态,可以轻松暂停和恢复Agent执行</p> </div> </div> <div class="benefit-item"> <i class="fas fa-shield-alt benefit-icon"></i> <div class="benefit-content"> <h4 class="benefit-title">容错性</h4> <p class="benefit-desc">状态与处理逻辑分离,使系统更加健壮和容错</p> </div> </div> </div> </div> </div> </div> <div class="footer"> <p>通过将Agent设计为<span class="highlight-text">无状态的reducer</span>,我们可以构建更加<span class="highlight-text">可预测</span>、<span class="highlight-text">可测试</span>和<span class="highlight-text">可扩展</span>的系统。这种模式简化了状态管理,提高了系统的可靠性和可维护性。</p> </div> </div> </body> </html>