引言AI应用开发速度很快但技术债务积累也很快。许多团队在Demo成功后匆忙推进生产留下了一堆隐患。到2026年已经有足够多的企业踩坑案例可以总结出一份典型的技术债务清单。本文梳理大模型应用开发中最常见的10类技术债务并给出具体的偿还方案。—## 一、硬编码的Prompt最常见的债务### 问题描述python# 反模式Prompt硬编码在代码里def answer_question(question: str) - str: response openai.chat.completions.create( modelgpt-4o, messages[{ role: system, content: 你是一个客服助手帮助用户解决问题。请用礼貌、专业的语气回答。 }, { role: user, content: question }] ) return response.choices[0].message.content隐患- Prompt修改需要改代码、重新部署效率极低- 无法A/B测试不同版本的Prompt- 无法追踪哪个版本的Prompt效果更好- 团队成员无法协作优化Prompt### 解决方案python# 正确方式使用Prompt版本管理系统from langfuse import Langfuselangfuse Langfuse()def answer_question(question: str, prompt_version: str production) - str: # 从Prompt管理系统获取当前版本 prompt langfuse.get_prompt( customer-service-system, versionprompt_version ) response openai.chat.completions.create( modelprompt.config.get(model, gpt-4o), messages[{ role: system, content: prompt.compile() # 支持变量插值 }, { role: user, content: question }] ) return response.choices[0].message.content配套基础设施- Prompt版本控制Langfuse Prompt Management / PromptLayer- 自动化Prompt评估流水线- A/B测试框架—## 二、无状态的对话管理### 问题描述python# 反模式对话历史无管理无限增长conversation_history []def chat(user_message: str) - str: conversation_history.append({role: user, content: user_message}) response openai.chat.completions.create( modelgpt-4o, messagesconversation_history # 随着对话增长Token无限增加 ) assistant_message response.choices[0].message.content conversation_history.append({role: assistant, content: assistant_message}) return assistant_message隐患- Token消耗线性增长成本无法控制- 超出上下文窗口后报错- 无法持久化应用重启丢失历史- 无法在多个实例间共享状态### 解决方案pythonfrom redis import Redisimport jsonclass ProductionConversationManager: def __init__(self, redis_client: Redis, max_tokens: int 8192): self.redis redis_client self.max_tokens max_tokens self.encoder tiktoken.get_encoding(cl100k_base) def get_session(self, session_id: str) - list: 从Redis获取持久化的对话历史 data self.redis.get(fsession:{session_id}) if data: return json.loads(data) return [] def save_session(self, session_id: str, messages: list, ttl: int 3600): 将对话历史持久化到Redis self.redis.setex( fsession:{session_id}, ttl, json.dumps(messages, ensure_asciiFalse) ) def trim_to_budget(self, messages: list) - list: 将历史裁剪到Token预算内 total_tokens sum( len(self.encoder.encode(m[content])) for m in messages ) # 保留系统消息和最近的对话 system_messages [m for m in messages if m[role] system] conversation_messages [m for m in messages if m[role] ! system] while total_tokens self.max_tokens and len(conversation_messages) 2: # 删除最早的一轮对话 removed conversation_messages.pop(0) total_tokens - len(self.encoder.encode(removed[content])) return system_messages conversation_messages—## 三、缺乏降级策略### 问题描述python# 反模式没有降级LLM出问题应用就崩溃def generate_product_description(product: dict) - str: response openai.chat.completions.create( modelgpt-4o, messages[{ role: user, content: f为以下产品生成描述{product} }] ) return response.choices[0].message.content # 如果OpenAI宕机这里直接抛异常### 解决方案pythonfrom openai import OpenAI, APIConnectionError, RateLimitErrorfrom tenacity import retry, stop_after_attempt, wait_exponentialclass ResilientLLMClient: def __init__(self): self.primary OpenAI(api_keyos.getenv(OPENAI_API_KEY)) self.fallback OpenAI( # 备用DeepSeek api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com/v1 ) self.cache Redis() retry( stopstop_after_attempt(3), waitwait_exponential(multiplier1, min2, max10), retry(APIConnectionError, RateLimitError) ) async def generate(self, prompt: str, **kwargs) - str: # 检查缓存对于相同输入 cache_key fllm:{hash(prompt)} cached self.cache.get(cache_key) if cached: return cached.decode() try: # 尝试主要模型 response await self.primary.chat.completions.create( modelgpt-4o, messages[{role: user, content: prompt}], **kwargs ) result response.choices[0].message.content except Exception as primary_error: logger.warning(f主要模型失败: {primary_error}切换到备用) try: # 切换到备用模型 response await self.fallback.chat.completions.create( modeldeepseek-v4, messages[{role: user, content: prompt}], **kwargs ) result response.choices[0].message.content except Exception as fallback_error: logger.error(f所有LLM都失败使用模板降级) # 最终降级返回模板响应 result self.template_fallback(prompt) # 缓存结果1小时 self.cache.setex(cache_key, 3600, result) return result def template_fallback(self, prompt: str) - str: 模板降级当所有LLM都不可用时使用 return 抱歉AI服务暂时不可用请稍后重试或联系客服。—## 四、Embedding模型硬依赖### 问题描述python# 反模式硬编码embedding模型无法迁移def create_embeddings(texts: list) - list: response openai.embeddings.create( modeltext-embedding-ada-002, # 硬编码 inputtexts ) return [e.embedding for e in response.data]隐患- OpenAI弃用该模型时所有向量需要重新计算- 无法评估其他更好/更便宜的embedding模型- 向量数据库和模型强耦合### 解决方案pythonfrom abc import ABC, abstractmethodclass EmbeddingProvider(ABC): abstractmethod async def embed(self, texts: list) - list: pass property abstractmethod def dimension(self) - int: pass property abstractmethod def model_name(self) - str: passclass OpenAIEmbeddingProvider(EmbeddingProvider): def __init__(self, model: str text-embedding-3-small): self.model model self._dimension 1536 if small in model else 3072 async def embed(self, texts: list) - list: response await self.client.embeddings.create( modelself.model, inputtexts ) return [e.embedding for e in response.data] property def dimension(self) - int: return self._dimensionclass BGEEmbeddingProvider(EmbeddingProvider): 使用本地BGE模型成本更低 async def embed(self, texts: list) - list: # 本地推理 return self.model.encode(texts).tolist()# 通过配置切换embedding模型def get_embedding_provider() - EmbeddingProvider: provider_name os.getenv(EMBEDDING_PROVIDER, openai) if provider_name openai: return OpenAIEmbeddingProvider() elif provider_name bge: return BGEEmbeddingProvider() raise ValueError(f未知的embedding提供商: {provider_name})—## 五、缺乏幻觉检测### 解决方案pythonclass HallucinationDetector: 生产级幻觉检测器 async def check(self, answer: str, context: str, question: str) - dict: # 方法1基于上下文的一致性检测 faithfulness await self._check_faithfulness(answer, context) # 方法2检测高置信度声明 confidence_check await self._check_overconfident_claims(answer) # 方法3数字/日期准确性验证 factual_check await self._verify_factual_claims(answer) hallucination_score 1 - (faithfulness confidence_check factual_check) / 3 return { has_hallucination: hallucination_score 0.3, score: hallucination_score, details: { faithfulness: faithfulness, confidence: confidence_check, factual: factual_check } } async def _check_faithfulness(self, answer: str, context: str) - float: 检查答案是否忠实于上下文 prompt f判断以下回答是否只包含上下文中存在的信息上下文{context[:2000]}回答{answer}评分1完全忠实0存在幻觉 response await self.judge_llm.generate(prompt) try: return float(response.strip()) except: return 0.7—## 六、其他常见债务速查| 技术债务 | 风险等级 | 快速解决方案 ||---------|---------|------------|| 不限速的API调用 | 高 | 添加令牌桶限速 队列 || 无超时设置 | 高 | 所有LLM调用设30s超时 || 缺少请求日志 | 中 | 接入Langfuse/LangSmith || Token消耗无监控 | 中 | 添加成本追踪告警 || 同步阻塞调用 | 中 | 改为async/await || 没有速率限制 | 高 | 添加用户级别限速 || Prompt注入漏洞 | 高 | 添加输入验证和过滤 |—## 总结技术债务的本质是短期效率换长期代价。在AI应用开发中最容易累积的债务是1.配置性债务Prompt、模型参数硬编码2.可靠性债务缺乏降级、重试、限速3.可观测性债务没有追踪、监控、告警4.质量债务没有幻觉检测、评估体系建议每个季度做一次债务偿还Sprint优先处理红色风险项。技术债务和业务功能一样需要计划性的投入而不是等到出问题再解决。