NOTE
AI工程架构与用户反馈
将网关、上下文工程、安全防护、缓存、Agent 与可观测性纳入统一架构,并讨论用户反馈闭环。
AI工程架构与用户反馈
1. 是什么
- AI工程架构(AI Engineering Architecture)
- 是什么
- 将基础模型与上下文构建、安全防护、路由、缓存、Agent和可观测性等能力组合起来,形成完整的AI应用系统
- 核心思想
- 渐进式架构演进
- 从最简单的Model API调用开始
- 根据实际问题逐步增加组件
- 避免过早引入不必要的复杂性
- 渐进式架构演进
- 是什么
- 用户反馈(User Feedback)
- 是什么
- 收集用户对AI应用的评价、行为和交互信息,用于评估应用表现和指导系统优化
- 主要用途
- 应用评估
- 判断系统是否满足用户需求
- 产品优化
- 发现实际问题和改进方向
- 个性化
- 根据用户偏好调整应用表现
- 模型优化
- 为后续模型训练提供数据
- 应用评估
- 是什么
- 核心思想
- 渐进式架构演进 + 反馈驱动开发
- 构建应用 → 评估与监控 → 收集反馈 → 分析问题 → 优化系统 → 重新评估
2. 为什么需要
- 简单的模型调用无法满足复杂的生产需求
- 缺少外部知识
- 需要RAG和Context Construction
- 存在错误或危险输出
- 需要Guardrails
- 不同任务需要不同模型
- 需要Router
- 多个模型API难以统一管理
- 需要Model Gateway
- 重复请求导致高延迟和成本
- 需要Cache
- 复杂任务需要动态决策和执行
- 需要Agent
- 多组件执行流程难以管理
- 需要Orchestrator
- 系统故障难以定位
- 需要Observability
- 缺少外部知识
- AI系统具有额外的不确定性
- 相同输入可能产生不同输出
- 输出可能不符合预期格式
- 可能出现幻觉
- 模型行为可能随版本变化
- 可能遭受提示词注入攻击
- 复杂Agent可能出现中间执行故障
- 离线评估不能完全代替真实用户反馈
- 测试数据无法覆盖全部真实场景
- 技术指标改善不一定代表用户满意度提升
- 用户可能有未被明确表达的需求
- 需要通过真实使用验证应用价值
3. 如何实现
- 整体流程
- 应用架构演进
- 基础Model API
- 增强Context
- 增加Guardrails
- 增加Router与Model Gateway
- 增加Cache
- 增加Agentic Patterns
- 根据复杂度引入Orchestration
- Observability贯穿整个过程
- 反馈闭环
- 用户使用AI应用
- 收集用户反馈与交互数据
- 分析用户满意度和失败案例
- 确定改进方案
- 优化Prompt、Context、Model或系统组件
- 执行评估
- 验证改进效果
- 发布并继续观察
- 注意
- 架构演进不代表固定的开发顺序
- 根据实际需求决定组件的引入顺序
- 可观测性应从设计阶段就考虑
- 应用架构演进
- 核心组成
- Model API
- 是什么
- 提供基础模型推理能力
- 实现方式
- 第三方商业模型API
- 自托管模型服务
- 是什么
- Context Construction
- 是什么
- 为模型构建完成当前任务所需的上下文
- 职责
- 获取外部信息
- 筛选和组织相关数据
- 构建模型输入
- 是什么
- Guardrails
- 是什么
- 检测和控制输入输出风险
- 职责
- 输入安全检查
- 输出质量与安全检查
- 故障处理
- 是什么
- Router
- 是什么
- 根据任务选择处理路径或模型
- 是什么
- Model Gateway
- 是什么
- 统一访问和管理多个模型服务
- 是什么
- Cache
- 是什么
- 缓存可以复用的请求或执行结果
- 是什么
- Agent与Tools
- 是什么
- 支持动态决策、工具调用和环境交互
- 是什么
- Orchestrator
- 是什么
- 协调多个组件的执行流程和数据传递
- 是什么
- Observability
- 是什么
- 记录和分析系统运行状态,帮助发现和定位问题
- 横切能力
- 贯穿整个系统
- 不一定是独立服务
- 是什么
- Feedback System
- 是什么
- 收集和分析用户反馈
- 职责
- 反馈采集
- 反馈分析
- 提供改进依据
- 是什么
- 注意
- 以上是逻辑职责划分
- 不要求每个组件独立部署
- 多个职责可以由同一个组件实现
- Model API
- 实现原理与技术方案
-
- Context Construction(上下文构建)
- 是什么
- 为模型准备当前任务需要的相关信息
- 实现方式
- RAG
- 从外部知识源检索信息
- Tool Calling
- 获取实时信息或执行操作
- 文件上传
- 向模型提供外部文档
- 其他数据检索
- 数据库
- 表格
- 图像
- RAG
- 与传统工程的关系
- 类似Feature Engineering
- 为模型准备有效输入
- 类似Feature Engineering
- 详细原理
- 复用第6章RAG与Agent知识
-
- Guardrails(安全防护)
- 是什么
- 检测并处理模型输入与输出中的风险和故障
- 分类
- Input Guardrails(输入防护)
- 解决什么问题
- 敏感数据泄露
- 恶意提示词
- 提示词注入
- 实现方法
- 检测个人身份信息(PII)
- 检测业务敏感信息
- 拦截高风险输入
- 敏感信息掩码
- 必要时通过安全映射恢复原始信息
- 执行过程
- 输入检测
- 识别敏感信息
- 拦截或脱敏
- 发送安全处理后的输入
- 解决什么问题
- Output Guardrails(输出防护)
- 解决什么问题
- 模型输出可能不符合质量或安全要求
- 故障类型
- 格式错误
- JSON不符合Schema
- 事实错误
- 生成不存在或不准确的信息
- 质量问题
- 回答不相关或质量差
- 有害内容
- 违反应用安全要求
- 隐私泄露
- 输出敏感信息
- 危险动作
- 触发未经授权的外部操作
- 格式错误
- 检测方式
- 程序化规则
- 专用检测模型
- AI评分器
- 故障处理
- 重试
- 拒绝响应
- 使用备用方案
- 转交人工
- 解决什么问题
- Input Guardrails(输入防护)
- 主要权衡
- 安全性与延迟
- 安全性与成本
- 流式输出与完整内容检查
- 注意
- 安全防护无法完全消除风险
- 需要关注误拒率
- 重试会增加成本和延迟
- 高风险动作还需要执行层权限控制
-
- Router(路由器)
- 是什么
- 根据任务类型、上下文和执行要求选择处理路径
- 实现方式
- Intent Classification(意图分类)
- 是什么
- 识别用户意图并选择对应处理方案
- 示例
- 密码找回 → FAQ
- 账单纠纷 → 人工客服
- 技术问题 → 技术支持Agent
- 其他用途
- 识别超出服务范围的请求
- 识别模糊请求
- 按任务复杂度选择模型
- 是什么
- Next-action Prediction(下一步动作预测)
- 是什么
- 根据当前状态预测下一步应该执行的操作
- 示例
- 选择调用哪个工具
- 判断是否需要检索
- 选择对应记忆存储
- 是什么
- Intent Classification(意图分类)
- 实现技术
- 规则路由
- 分类模型
- 小型语言模型
- 优化目标
- 减少不必要的高成本模型调用
- 减少路由本身的延迟和成本
-
- Model Gateway(模型网关)
- 是什么
- 为不同模型服务提供统一、安全、可管理的访问接口
- 主要功能
- 统一模型API
- 适配不同模型提供商
- 访问控制
- 管理用户和应用的模型权限
- 成本管理
- 记录和限制API调用
- Rate Limiting
- 限制请求频率
- Failover
- 主模型不可用时切换备用模型
- Load Balancing
- 分配模型请求
- Logging
- 记录模型调用信息
- 可选功能
- 缓存
- 安全防护
- 统一模型API
- 与传统工程的关系
- API Gateway
- Adapter Pattern
- Router与Gateway区别
- Router
- 决定使用哪个模型或处理方案
- Gateway
- 统一调用和管理模型服务
- 两者可以合并实现
- Router
-
- Cache(缓存)
- 是什么
- 复用已有计算结果,降低重复请求的成本和延迟
- 分类
- Exact Cache(精确缓存)
- 是什么
- 请求与缓存键匹配时直接复用结果
- 实现方式
- 使用缓存键查找结果
- Hit直接返回
- Miss执行模型调用并缓存
- 存储方案
- 内存
- Redis
- PostgreSQL
- 淘汰策略
- LRU
- LFU
- FIFO
- 是什么
- Semantic Cache(语义缓存)
- 是什么
- 允许语义相似的请求复用缓存结果
- 实现原理
- Embedding
- 将Query转换成向量
- Vector Search
- 检索相似查询
- Similarity Threshold
- 判断相似度是否超过阈值
- Embedding
- 执行流程
- Query → Embedding → Vector Search → 相似度判断
- 命中则返回缓存结果
- 未命中则调用模型并更新缓存
- 是什么
- Exact Cache(精确缓存)
- 两种缓存的区别
- Exact Cache
- 实现简单
- 命中范围较窄
- 错误复用风险相对容易控制
- Semantic Cache
- 命中范围较广
- 实现复杂
- 可能错误匹配不同问题
- 需要额外的向量检索成本
- Exact Cache
- 缓存风险
- 数据时效性
- 用户私有信息泄露
- 跨权限错误复用
- 语义匹配错误
- 注意
- 先考虑Exact Cache
- Semantic Cache需要验证实际收益
- 缓存键和命中条件应考虑权限与业务上下文
-
- Agentic Patterns(智能体模式)
- 是什么
- 支持动态决策、循环执行、条件分支和工具调用
- 为什么需要
- 固定的线性流程无法满足部分复杂任务
- 实现方式
- ReAct
- 推理 → 行动 → 观察 → 继续推理
- Tool Calling
- 获取外部信息
- 执行外部操作
- 复杂执行模式
- 循环
- 条件分支
- 并行执行
- ReAct
- Write Actions(写入动作)
- 是什么
- 修改外部环境的操作
- 示例
- 发送邮件
- 下订单
- 更新数据库
- 风险
- 可能产生真实的外部副作用
- 需要权限控制和必要的审批
- 是什么
- 详细内容
- 复用第6章Agent与Harness知识
-
- Observability(可观测性)
- 是什么
- 通过系统埋点和运行数据分析,理解系统状态并定位故障
- 为什么需要
- 降低应用故障和安全风险
- 发现性能与成本优化机会
- 帮助定位复杂组件的失败原因
- 核心技术
- Metrics(指标)
- 是什么
- 通过数值衡量系统状态和表现
- 指标分类
- 模型质量
- 任务正确率
- 事实一致性
- 格式错误率
- 安全性
- 有害内容比例
- 拒绝率
- 误拒率
- 性能
- TTFT
- TPOT
- 总响应时间
- 成本
- Token消耗
- 请求次数
- API成本
- 缓存命中率
- 组件性能
- 检索延迟
- 检索质量
- 向量数据库查询耗时
- 用户行为
- 对话轮数
- 重新生成率
- 中途终止率
- 业务指标
- DAU
- 订阅量
- 转化率
- 模型质量
- 是什么
- Logging(日志)
- 是什么
- 记录系统运行过程中发生的具体事件
- 记录内容
- 模型与调用配置
- Prompt及其版本
- Query与Response
- 工具调用与执行结果
- 错误信息
- 组件执行时间
- 请求关联ID
- 作用
- 复盘具体问题
- 分析异常事件
- 是什么
- Tracing(链路追踪)
- 是什么
- 关联请求执行过程中各组件的事件,重建完整执行路径
- 记录内容
- 组件调用顺序
- 中间结果
- 执行耗时
- Token消耗
- 调用成本
- 异常信息
- 作用
- 定位失败发生在哪个组件或步骤
- 是什么
- Drift Detection(漂移检测)
- 是什么
- 检测系统输入、配置或模型行为随时间发生的变化
- 常见类型
- Prompt Drift
- 提示词模板发生变化
- User Behavior Drift
- 用户查询习惯发生变化
- Model Drift
- 底层模型行为发生变化
- Prompt Drift
- 是什么
- Metrics(指标)
- 传统DevOps指标
- MTTD
- 平均检测时间
- 从问题发生到被发现的时间
- MTTR
- 本书指平均响应时间
- 从检测问题到解决问题的时间
- CFR
- 变更失败率
- 导致故障或需要修复、回滚的变更比例
- MTTD
- 核心原则
- 先确定故障模式
- 再设计指标和告警
- 按需结合抽样检查与全面检查
- 将监控问题反馈到离线评估流水线
-
- Orchestration(流水线编排)
- 是什么
- 协调多个模型、工具和数据源的执行与数据流转
- 实现原理
- Component Definition(组件定义)
- 声明系统使用的模型
- 声明数据源和工具
- 声明评估与监控组件
- Chaining(链式组合)
- 定义组件执行顺序和数据依赖关系
- Component Definition(组件定义)
- 主要能力
- 数据传递
- 格式转换
- 条件分支
- 并行执行
- 异常处理
- 传统工程中的类似技术
- Workflow Engine
- Pipeline
- 常见工具
- LangChain
- LlamaIndex
- Haystack
- Flowise
- Langflow
- 选型标准
- 集成性与可扩展性
- 复杂流水线支持
- 易用性
- 性能
- 可伸缩性
- 作者建议
- 初期优先尝试不依赖复杂编排框架
- 复杂度真正增加后再考虑引入
-
- User Feedback(用户反馈)
- 是什么
- 通过用户评价和交互行为获取应用改进信号
- 分类
- Explicit Feedback(显式反馈)
- 是什么
- 用户主动提供明确评价
- 示例
- 点赞与点踩
- 星级评分
- 人工评价
- 答案偏好比较
- 特点
- 容易解释
- 需要用户额外操作
- 反馈数量可能较少
- 是什么
- Implicit Feedback(隐式反馈)
- 是什么
- 通过用户行为推断满意度和偏好
- Natural Language Feedback(自然语言反馈)
- 是什么
- 从用户对话内容中提取反馈
- 信号
- 提前终止
- 用户停止生成
- 可能表示回答不符合预期
- 错误修正
- 用户指出错误
- 可能表示模型理解或回答有误
- 重新表述
- 用户重新描述请求
- 可能表示原始问题未得到解决
- 要求核实
- 用户要求重新检查或提供证据
- 可能表示用户缺乏信任
- 直接编辑
- 用户修改AI生成内容
- 可能形成偏好数据
- 抱怨
- 用户指出回答冗长、错误或质量差
- 情绪变化
- 用户表现出不满或满意
- 提前终止
- 是什么
- Other Interaction Feedback(其他交互反馈)
- 重新生成
- 可能表示不满意
- 也可能只是想比较其他结果
- 删除对话
- 可能表示对话不满意
- 也可能出于隐私考虑
- 收藏与分享
- 可能体现用户偏好
- 对话长度
- 不同业务中的含义不同
- 对话多样性
- 辅助识别无效重复对话
- 重新生成
- 特点
- 数据来源丰富
- 不需要用户专门评分
- 噪声和歧义较多
- 是什么
- Explicit Feedback(显式反馈)
- Feedback Design(反馈设计)
- 什么时候收集
- 初始使用阶段
- 了解用户偏好
- 进行必要的系统校准
- 出现问题时
- 收集错误信息
- 允许用户纠正
- 必要时提供人工协助
- 模型不确定时
- 请求用户确认
- 提供候选结果进行比较
- 用户主动反馈时
- 允许点赞、收藏、评论等
- 初始使用阶段
- 如何收集
- 将反馈融入正常工作流程
- 降低反馈操作成本
- 允许忽略反馈请求
- 提供清晰的反馈选项
- 说明反馈数据的用途
- 控制反馈请求频率
- 尊重用户隐私与授权
- 典型案例
- GitHub Copilot
- 接受代码建议
- 忽略代码建议
- 修改建议内容
- Midjourney
- 选择图片放大
- 生成图片变体
- 重新生成图片
- GitHub Copilot
- 什么时候收集
- 反馈用途
- 评估应用表现
- 指导产品改进
- 用户个性化
- 构建偏好训练数据
- 形成数据飞轮
-
- 执行流程详解
-
- AI请求执行流程
- 用户发送Query
- Input Guardrails
- 检查输入安全性
- 必要时脱敏或拦截
- Router
- 识别任务类型
- 选择处理路径
- Cache Lookup
- 检查是否存在可安全复用的结果
- Context Construction(按需)
- 检索外部信息
- 筛选与组织上下文
- Model Gateway
- 调用目标模型
- LLM Generation
- 生成模型响应
- Output Guardrails
- 检查输出质量与安全性
- 必要时重试或转交人工
- 返回Response
- 注意
- 具体执行顺序依赖实际架构
- 部分步骤可以省略或并行
- Agent任务可能包含多轮工具调用
- Observability贯穿全部步骤
-
- 用户反馈闭环
- 用户接收Response
- 用户继续交互
- Feedback Collection
- 收集显式反馈
- 提取隐式反馈
- 收集必要的交互上下文
- Feedback Analysis
- 识别失败案例
- 分析满意度
- 分析偏好和反馈偏差
- 确定改进方向
- Prompt优化
- Context优化
- 模型优化
- 系统组件优化
- 执行离线评估
- 验证改进效果
- 发布并持续观察
-
4. 如何优化
- 优化系统质量
- 知识不足
- RAG与Context Construction
- 模型选择不合理
- Router
- 输出格式或质量问题
- Output Guardrails
- 复杂任务执行失败
- Agentic Patterns
- 复杂工作流难以维护
- Orchestrator
- 知识不足
- 优化延迟和成本
- 缓存优化
- 优先使用Exact Cache
- 按需引入Semantic Cache
- 模型路由
- 简单任务使用低成本模型
- 复杂任务使用能力更强的模型
- 并行执行
- 并行处理相互独立的步骤
- 故障处理
- 使用重试或备用模型
- 权衡重试成本与延迟
- 缓存优化
- 优化可靠性
- 输入输出校验
- 模型故障回退
- 异常重试
- 人工介入
- 关键操作权限控制
- 优化可观测性
- 明确故障模式
- 围绕故障设计Metrics
- 记录Logs和Traces
- 设置告警
- 定位问题
- 将失败案例加入回归评估
- 优化用户反馈质量
- 主要偏差
- Leniency Bias(宽容偏差)
- 是什么
- 用户倾向给出比真实体验更高的评分
- 原因
- 避免冲突
- 负面评价需要额外操作
- 是什么
- Randomness(随机性)
- 是什么
- 用户未认真比较就随机选择反馈
- 是什么
- Position Bias(位置偏差)
- 是什么
- 选项展示位置影响用户选择
- 缓解方式
- 随机调整选项位置
- 按位置进行统计校正
- 是什么
- Preference Bias(偏好偏差)
- 是什么
- 某些容易感知的特征影响用户选择
- 示例
- 用户偏好较长回答
- 但较长回答不一定更准确
- 是什么
- Recency Bias(近因偏差)
- 是什么
- 用户可能偏好后看到的答案
- 是什么
- Leniency Bias(宽容偏差)
- 优化原则
- 减少不必要的反馈操作
- 使用多种信号交叉验证
- 检查反馈样本分布
- 避免直接将用户偏好等同于正确性
- 主要偏差
- Degenerate Feedback Loop(恶性反馈循环)
- 是什么
- 系统输出影响用户反馈,而反馈又影响下一轮系统输出,导致初始偏差持续放大
- 实现机制
- 某内容被优先展示
- 获得更多曝光和互动
- 系统认为该内容更受欢迎
- 继续提高其优先级
- 形成自我强化循环
- 可能造成的问题
- 曝光偏差
- 流行度偏差
- 信息茧房
- 数据分布越来越单一
- 模型原有偏见被放大
- Sycophancy(迎合行为)
- 是什么
- 模型为了获得用户认可而倾向迎合用户观点
- 风险
- 用户偏好提高
- 但事实正确性可能下降
- 是什么
- 核心原则
- 用户反馈不应成为唯一优化目标
- 需要结合客观正确性和业务约束
- 是什么
5. 如何评估
- 评估思想
- 复用第4章的评估方法论
- 从模型级评估扩展到整个应用系统
- 离线评估与在线监控相结合
- 评估维度
- 功能正确性
- 任务成功率
- 格式正确率
- 生成质量
- 回答正确性
- 事实一致性
- 相关性
- 安全性
- 风险检出率
- 误拒率
- 可靠性
- 请求失败率
- 重试率
- 性能
- TTFT
- TPOT
- 总响应时间
- 成本
- Token消耗
- 单次任务成本
- 用户体验
- 用户满意度
- 重新生成率
- 用户纠错率
- 可观测性
- MTTD
- MTTR
- 业务价值
- DAU
- 转化率
- 订阅量
- 功能正确性
- 评估方式
- 离线评估
- 是什么
- 使用预先准备的数据对系统进行测试
- 适用场景
- 开发验证
- 版本回归
- 方案比较
- 评估内容
- 模型质量
- RAG检索质量
- Agent任务成功率
- 输出格式
- 安全约束
- 是什么
- 在线评估与监控
- 是什么
- 利用真实生产环境中的数据观察系统表现
- 数据来源
- Metrics
- Logs
- Traces
- User Feedback
- 必要时使用AI评分器
- 主要目标
- 发现生产环境故障
- 监控模型质量
- 识别输入和用户行为变化
- 发现优化机会
- 是什么
- 注意
- 可观测性提供运行数据和问题定位能力
- 指标正常不代表任务一定成功
- 回答正确性仍需要合适的评分机制
- 离线评估
- 评估与优化闭环
- 收集评估数据
- 执行评估
- 分析整体指标
- 分析失败案例
- 定位问题
- 提出改进方案
- 实施改进
- 重新评估
- 将生产失败案例加入评估数据集
拖动可平移,滚轮缩放,点击节点可展开或折叠。大型导图默认折叠较深层级,可点击节点继续展开。
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看