标签
万字总结分享成为 Agent 工程师的学习路线,覆盖 LLM 基础、Prompt Engineering、RAG、Agent 应用与后端工程,配套学习文档、项目要求和验收标准,帮助读者系统补齐 AI 应用开发技能。
# 一位 AI 视频代理后端工程师分享如何修复模型路由问题:通过规则过滤加评分,避免代理在 1000+ 视频模型中自信却错误地选择不兼容的模型 在 AI 视频生成领域,随着可用模型数量爆炸式增长——如今已超过 1000 个——一个看似简单的任务变得异常复杂:**如何为用户的请求选择正确的模型?** 一位在某 AI 视频代理平台工作的后端工程师最近分享了他们团队如何诊断并修复模型路由(Model Routing)问题的经历。问题的核心不是代理"不知道",而是代理**非常自信地选择了错误且不兼容的模型**。 ## 问题的起点:一个"自信"的错误 这个 AI 视频代理本质上是一个智能调度层。用户输入自然语言描述(例如"生成一个 4K 电影感的延时摄影视频"),代理需要从庞大的模型目录中挑选出最合适的模型来执行任务。 初期,团队采用了一种简单的方案:**让大型语言模型(LLM)直接阅读模型目录,然后自主选择。** 看似合理,但实际运行中暴露了严重问题: - 用户请求生成 **竖屏 9:16 格式** 的短视频,代理却路由到了只支持 **横屏 16:9** 的模型 - 用户明确要求 **超过 30 秒** 的视频长度,代理选择了一个 **最大输出 10 秒** 的模型 - 用户指定了 **特定的输入格式**(如图片到视频),代理却路由到了 **纯文本到视频** 的模型 最令人头疼的是——**代理从不表现出犹豫**。它总是给出一个明确的模型选择,并附带一段看起来非常有说服力的推理说明。工程师将这种现象称为**"自信的错误"(Confidently Wrong)**。 ## 根本原因分析 团队经过深入排查,发现了几个关键根因: ### 1. 模型目录信息过载 当目录中包含超过 1000 个模型时,将完整的模型元数据塞入 LLM 的上下文窗口,会导致以下问题: - **注意力稀释**:模型无法同时关注所有约束条件 - **相似性混淆**:大量名称相似的模型(例如 `video-gen-v2`、`video-gen-v2-pro`、`video-gen-v2-turbo`)容易被混淆 - **上下文窗口截断**:部分模型的详细参数在长上下文中被截断,LLM 根本看不到关键的兼容性信息 ### 2. 缺乏硬性约束过滤 原始方案中,**格式、时长、输入类型** 等约束条件被视为"软性偏好"而非"硬性门槛"。LLM 被期望理解这些约束,但在实践中它经常为了"整体相似度"而牺牲"局部兼容性"。 ### 3. 排序机制缺失 即便 LLM 选中了大方向正确的候选模型,也没有任何机制对其进行**细粒度的评分和排序**,导致最终输出可能是候选集中的次优选择。 ## 解决方案:规则过滤 + 评分排序的两层架构 团队最终设计了一个**两层混合路由架构**,将确定性工程规则与 AI 的语义理解能力结合起来。 ### 第一层:硬性规则过滤(Rule-Based Filtering) 在任何 LLM 参与之前,先用**确定性代码**执行硬性约束过滤: ```python def filter_compatible_models(request, model_catalog): candidates = [] for model in model_catalog: # 硬性约束:格式必须匹配 if request.aspect_ratio not in model.supported_ratios: continue # 硬性约束:时长必须在模型能力范围内 if not (model.min_duration <= request.duration <= model.max_duration): continue # 硬性约束:输入类型必须匹配 if request.input_type not in model.supported_input_types: continue # 硬性约束:分辨率必须在模型能力范围内 if request.resolution not in model.supported_resolutions: continue candidates.append(model) return candidates ``` **关键原则**:这一层**完全不使用 AI**。它是确定性的、可预测的、100% 可测试的。任何不满足硬性约束的模型都会被直接排除,无论它在其他维度上表现多么优秀。 这一步的效果立竿见影——在实际测试中,**超过 70% 的不兼容选择在这一层就被拦截了**。 ### 第二层:语义评分排序(Semantic Scoring & Ranking) 通过第一层过滤后,候选集通常会从 1000+ 缩小到 5-20 个。此时再将筛选后的候选集交给 LLM,让它专注于**语义匹配和偏好排序**: ```python def score_candidates(request, candidates): scores = [] for model in candidates: score = 0 # 语义匹配分:请求描述与模型擅长领域的匹配度 score += semantic_match_score(request.prompt, model.capabilities) * 0.4 # 质量分:模型的平均用户评分 score += model.quality_score * 0.25 # 速度分:模型的平均生成速度 score += model.speed_score * 0.15 # 成本分:模型的成本效益比 score += model.cost_efficiency * 0.10 # 新鲜度分:模型的版本新鲜度 score += model.freshness_score * 0.10 scores.append((model, score)) return sorted(scores, key=lambda x: x[1], reverse=True) ``` ### 关键设计决策 | 决策点 | 选择 | 理由 | |---|---|---| | 过滤在前还是排序在前 | **过滤在前** | 减少 LLM 面临的选项数量,降低注意力稀释 | | 硬约束由代码还是 LLM 执行 | **代码执行** | 确定性规则需要确定性执行,不能依赖概率性推理 | | LLM 的角色 | **语义排序** | LLM 擅长理解语义相似性,但不擅长精确数值比较 | | 权重是否固定 | **可配置** | 不同用户群体对质量、速度、成本的偏好不同 | ## 实施效果 上线后,团队追踪了以下关键指标的变化: ### 不兼容路由率 - **修复前**:约 12% 的请求被路由到不兼容的模型 - **修复后**:不兼容路由率降至 **0.3% 以下**(剩余的 0.3% 主要来自元数据不完整的新模型) ### 用户满意度 - 用户对视频生成结果的满意度评分提升了 **23%** - "重新生成"率(用户对结果不满意而重新请求)下降了 **35%** ### 平均路由延迟 - 尽管增加了两层处理,但因为候选集大幅缩小,LLM 的处理时间反而**降低了 40%** - 整体端到端延迟**基本持平** ## 经验总结 工程师总结了以下几条核心经验: 1. **不要让 AI 替你做确定性决策**。格式、时长、分辨率等硬性约束应该由代码处理,LLM 的价值在于理解语义和处理模糊性。 2. **"自信"不等于"正确"**。LLM 的输出总是带有确定性的语气,但这不代表它真的知道自己是对的。在生产系统中,必须建立独立于 AI 的验证机制。 3. **缩小选项空间比提升推理能力更有效**。与其寄希望于更强的模型来"想清楚",不如用工程手段先帮它排除明显错误的选项。 4. **评分权重应该是可配置的**。不同场景下用户对质量、速度、成本的权衡不同,僵化的权重设定会成为新的瓶颈。 5. **元数据质量决定路由质量**。垃圾进、垃圾出——如果模型的元数据(支持的格式、时长上限等)不准确或不完整,再好的路由算法也无法做出正确决策。团队后续专门建立了**模型元数据的自动化验证流水线**。 --- 这个案例生动地说明了一个在 AI 工程领域反复出现的主题:**最先进的 AI 系统,往往需要最基础的工程护栏来确保其可靠性。** 当代理面对 1000+ 个模型时,最聪明的做法不是让 AI 更努力地思考,而是先帮它把不可能的选项划掉。
一位工程师通过管理一组AI智能体,在短短12天内构建了一个完整的大学LMS生产后端,展示了AI如何通过让一个人发挥整个工程团队的作用来改变软件开发。
一位Atlassian首席工程师分享了已完结的25天Twitter系列帖,内容涵盖系统设计扩容基础,现整理成单一资源。
这篇博客文章描述了使用Temporal构建可扩展的数据摄取管道的架构,用于处理来自不同来源的客户文档的抓取、提取、分块和嵌入,强调了持久性、状态性和并发控制。
文章分析了使用 PostgreSQL 作为作业队列的可扩展性限制,特别强调了高并发下 MultiXact SLRU 争用导致的性能瓶颈。文章解释了为什么这种架构在开发环境中表现良好,但在生产环境中却会失败,并建议考虑替代方案。
# 深入探索后端系统的细节 来源:[https://openai.com/index/discovering-the-minutiae-of-backend-systems/](https://openai.com/index/discovering-the-minutiae-of-backend-systems/) OpenAI 很幸运在年幼时就接触到了编程,并将其作为探索其他话题的入口。在中学时,一位朋友向我介绍了 Texas Instruments 计算器中特有的 BASIC 编程语言(我写的代码可想而知是难以维护的)