当前位置: 首页 > news >正文

[Vibe Coding] 降低大模型幻觉 - 重试机制

/*** 带重试的 LLM 调用执行器** 默认行为:重试时自动将错误信息反馈给 LLM,让它能够根据错误修正输出** @param model 可调用的模型(需要有 invoke 方法)* @param messages 初始消息数组* @param options 重试配置* @returns 执行结果** @example* const result = await withRetry(structuredModel, messages, {*   maxRetries: 3,*   onRetry: (attempt, error) => console.warn(`Retry ${attempt}:`, error.message)* });*/
export async function withRetry<T>(model: InvokableModel<T>,messages: any[],options: RetryOptions = {},
): Promise<T> {const {maxRetries = DEFAULT_MAX_RETRIES,onRetry,formatErrorFeedback = defaultErrorFeedback,} = options;let lastError: Error | null = null;let currentMessages = [...messages];for (let attempt = 1; attempt <= maxRetries; attempt++) {try {return await model.invoke(currentMessages);} catch (error) {lastError = error instanceof Error ? error : new Error(String(error));if (attempt < maxRetries) {onRetry?.(attempt, lastError);// 追加错误反馈消息用于下次重试currentMessages = [...messages,new HumanMessage(formatErrorFeedback(lastError)),];}}}throw lastError;
}

 

Usage

  // ========== 3. AI 命名调用 ==========const structuredModel = getStructuredModel(SectionNamingOutputSchema);const messages = [new SystemMessage(getSectionNamingSystemPrompt()),new HumanMessage(getSectionNamingHumanPrompt(sectionsInfo)),];console.log("⏳ [SectionNamingNode] 正在调用 AI 命名...");let result: T_SectionNamingOutput;try {result = await withRetry(structuredModel, messages, {maxRetries: 2,onRetry: (attempt, error) => {console.warn(`⚠️ [SectionNamingNode] 命名重试 ${attempt}: ${error.message}`,);},});} catch (error) {console.error("❌ [SectionNamingNode] AI 命名失败:", error);// Fallback: 使用默认命名console.log("⚠️ [SectionNamingNode] 使用默认命名作为 fallback");result = {namedSections: sections.map((s, i) => ({index: s.index,componentName: `Section${i + 1}`,description: `页面第 ${i + 1} 区域,包含 ${s.totalBlocks} 个元素`,fileName: `Section${i + 1}`,})),};}

 

http://www.jsqmd.com/news/745373/

相关文章:

  • STM32H743 FDCAN配置避坑指南:从共享RAM分配到滤波器设置,手把手教你搞定双CAN通信
  • 在多模型间切换时如何通过Taotoken用量看板透明管理API成本
  • QQ机器人AI升级指南:逆向库原理与多模型接入实战
  • 保姆级教程:用Python+OpenCV批量处理图片尺寸,彻底避开cv2.resize的那些‘坑’
  • 环境配置与基础教程:源码级剖析:深度解读 Ultralytics 引擎源码(Engine),从零教你自定义训练循环(Training Loop)
  • 终极解决方案:免费解锁macOS百度网盘SVIP高速下载功能
  • 告别飞线!给HK32F030M开发板做个专属DAP-Link转接板,并搞定CH340N串口下载的避坑指南
  • 如何快速解锁全球创作平台:开源镜像解决方案完整指南
  • 5大核心功能解锁:Grasscutter Tools 让原神私服管理变得如此简单
  • 抖音批量下载神器:3分钟学会无水印高清视频下载
  • Python面试官最爱问的10个‘坑’题,我帮你整理好了(附避坑指南)
  • BG3ModManager终极指南:简单快速管理博德之门3模组
  • 在ubuntu上用nodejs快速接入taotoken并实现异步聊天补全
  • ENVI Classic裁剪避坑指南:为什么你的.shp文件裁剪出来还是矩形?
  • 查看 Taotoken 账单明细实现项目级 API 成本分摊与核算
  • B站缓存视频完整转换指南:m4s-converter一键解决播放难题
  • Go语言构建Linux系统托盘应用:轻量级框架indicator实战指南
  • 微信小程序登录背后的安全门道:从auth.code2Session到你的用户体系,这几点千万别做错
  • HS2-HF Patch:终极HoneySelect2汉化与MOD整合指南
  • QMC音频解密终极指南:5分钟解决QQ音乐格式转换难题
  • 多分辨率视觉理解:MuRF架构解析与工程实践
  • 专业级WebP图像处理:WebPShop插件在Photoshop中的完整实践指南
  • 用Python手把手复现鹈鹕优化算法POA:从论文公式到完整代码(附避坑指南)
  • GEDI数据如何改变我们看待森林的方式?从碳汇估算到生物多样性保护
  • 如何用DistroAV构建高可靠分布式媒体传输系统:NDI协议与OBS深度集成指南
  • Taotoken 用量看板如何帮助开发者精细化管控 API 成本
  • 终极Windows安卓应用安装指南:APK Installer完全解析与实战教程
  • 保姆级脚本:一键启动XTDrone仿真与ego-planner三维路径规划(附自动悬停hover.py源码解析)
  • 别再踩坑了!微信小程序虚拟支付从接入到调试的完整避坑指南(附iPhone/Android差异处理)
  • 生信小白也能搞定的ceRNA网络构建:手把手教你用miRcode批量预测lncRNA-miRNA关系