首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >每天用AI干活的技术人,该如何沉淀可复用的工程落地经验?

每天用AI干活的技术人,该如何沉淀可复用的工程落地经验?

原创
作者头像
大盘鸡拌面
发布2026-08-17 10:00:43
发布2026-08-17 10:00:43
1370
举报

这个系列前面写了四篇,从开源模型部署到模型调优,从测试安全数据岗位的AI方案到全链路AI实战。但有个问题一直没聊透:你天天用AI干活,用的时候挺爽,用完之后呢?那些踩过的坑、摸索出来的prompt技巧、验证过的方案路径——它们去哪了? 大部分人的答案是:没了。下次遇到类似问题,从头再踩一遍坑。这篇文章就聊聊怎么把AI使用过程中的经验沉淀下来,变成可复用的工程资产。


一、一个特别真实的问题:你的AI经验在"蒸发"

先说个我自己经历的事。

去年我们团队开始用AI辅助做代码审查,我花了大概两周时间摸索出了一套效果不错的prompt模板——怎么描述审查规则、怎么让模型输出结构化结果、怎么处理不同语言的差异。效果挺好,准确率从60%提到了85%左右。

然后我休了两周年假。

回来之后发现:团队里另外两个同学也在做代码审查的AI方案,各自从零开始摸索prompt,一个用的模板跟我之前调的差不多但少了几个关键约束,另一个干脆走了弯路。我问他们为啥不看我之前的方案,回答是:"你的方案在哪?"

在哪儿呢?在我本地的一个markdown文件里,文件名叫​​prompt_test_v3_final_真的final.md​​。

这不是个例。我调研过身边十几个用AI比较多的技术团队,发现一个普遍现象:每个人都在用AI,每个人都在踩坑,但几乎没有人在系统性地沉淀经验。偶有几个好习惯的人,把prompt存在备忘录里、把踩坑记录写在飞书文档里,但这些都是碎片化的、个人化的、不可检索的。

经验在蒸发,而且蒸发得比你想象的快。


二、经验沉淀到底要沉淀什么?

别急着写代码,先想清楚要沉淀什么。我把AI使用经验分成四类,每类的沉淀方式不同。

这四类经验有个共同特点:它们都是在真实业务中产生的,不是从文档里抄来的。文档里能查到vLLM怎么安装,但查不到"我们的场景下vLLM的gpu-memory-utilization设0.85最稳定"这种实战经验。这种经验才是真正有价值的,也是最容易丢的。


三、Prompt经验沉淀:别让你的prompt变成一次性用品

3.1 Prompt模板的工程化管理

Prompt是AI使用中最频繁产生、也最容易丢失的经验。大多数人写prompt的方式是:打开聊天框→临时想一段→发出去→效果还行就用→关掉窗口→下次重写。

正确的做法是把有效的prompt当代码来管理——版本控制、结构化存储、可检索复用。下面是我团队在用的一个prompt管理工具:

代码语言:javascript
复制
import os
import json
import hashlib
from datetime import datetime
from pathlib import Path

class PromptRegistry:
    """Prompt模板注册中心——把prompt当代码管"""
    
    def __init__(self, storage_dir="./prompt_registry"):
        self.storage_dir = Path(storage_dir)
        self.storage_dir.mkdir(parents=True, exist_ok=True)
        self.index_file = self.storage_dir / "index.json"
        self._load_index()
    
    def _load_index(self):
        if self.index_file.exists():
            with open(self.index_file, 'r', encoding='utf-8') as f:
                self.index = json.load(f)
        else:
            self.index = {"prompts": []}
    
    def _save_index(self):
        with open(self.index_file, 'w', encoding='utf-8') as f:
            json.dump(self.index, f, ensure_ascii=False, indent=2)
    
    def register(self, name: str, template: str, metadata: dict):
        """注册一个新的prompt模板"""
        prompt_hash = hashlib.md5(template.encode()).hexdigest()[:8]
        
        entry = {
            "id": f"prompt_{prompt_hash}",
            "name": name,
            "template": template,
            "metadata": {
                **metadata,
                "created_at": datetime.now().isoformat(),
                "version": metadata.get("version", "1.0.0"),
            },
            "tags": metadata.get("tags", []),
            "scene": metadata.get("scene", "general"),
            "model": metadata.get("model", "Qwen2.5-7B"),
            "effectiveness_score": metadata.get("effectiveness_score", None),
            "notes": metadata.get("notes", ""),
        }
        
        # 检查是否已有同名模板
        existing = [p for p in self.index["prompts"] if p["name"] == name]
        if existing:
            # 版本对比:如果内容变了,新增版本记录
            old = existing[-1]
            if old["template"] != template:
                old["metadata"]["superseded_at"] = datetime.now().isoformat()
                old["metadata"]["superseded_by"] = entry["id"]
        
        self.index["prompts"].append(entry)
        self._save_index()
        
        # 同时保存独立文件(方便git diff)
        prompt_file = self.storage_dir / f"{entry['id']}.md"
        with open(prompt_file, 'w', encoding='utf-8') as f:
            f.write(f"# {name}\n\n")
            f.write(f"- **场景**: {metadata.get('scene', 'general')}\n")
            f.write(f"- **模型**: {metadata.get('model', 'N/A')}\n")
            f.write(f"- **效果评分**: {metadata.get('effectiveness_score', 'N/A')}/10\n")
            f.write(f"- **版本**: {metadata.get('version', '1.0.0')}\n\n")
            f.write(f"## Template\n\n```\n{template}\n```\n")
            if metadata.get("notes"):
                f.write(f"\n## Notes\n\n{metadata['notes']}\n")
        
        return entry["id"]
    
    def search(self, query: str = None, tag: str = None, scene: str = None):
        """检索prompt模板"""
        results = self.index["prompts"]
        
        # 只看最新版本
        latest = {}
        for p in results:
            if p["name"] not in latest:
                latest[p["name"]] = p
            elif p["metadata"]["created_at"] > latest[p["name"]]["metadata"]["created_at"]:
                latest[p["name"]] = p
        results = list(latest.values())
        
        if scene:
            results = [p for p in results if p["scene"] == scene]
        if tag:
            results = [p for p in results if tag in p["tags"]]
        if query:
            results = [p for p in results 
                       if query.lower() in p["name"].lower() 
                       or query.lower() in p["template"].lower()
                       or query.lower() in p.get("notes", "").lower()]
        
        return results
    
    def get_by_name(self, name: str):
        """按名称获取最新版prompt"""
        matches = [p for p in self.index["prompts"] if p["name"] == name]
        if not matches:
            return None
        return sorted(matches, key=lambda x: x["metadata"]["created_at"])[-1]


# ---- 使用示例 ----
if __name__ == "__main__":
    registry = PromptRegistry("./prompt_registry")
    
    # 注册一个代码审查prompt(第一次版本)
    v1 = registry.register(
        name="code_review_python",
        template="你是一个代码审查专家,请审查以下Python代码:\n{code}",
        metadata={
            "scene": "code_review",
            "tags": ["python", "review"],
            "model": "Qwen2.5-7B-Instruct",
            "effectiveness_score": 6,
            "notes": "基础版本,能识别简单问题但漏报较多",
            "version": "1.0.0",
        }
    )
    
    # 调优后注册第二个版本
    v2 = registry.register(
        name="code_review_python",
        template="""你是一位资深Python代码审查专家,精通PEP 8和常见安全漏洞。

请审查以下代码,重点关注:
1. 逻辑正确性和边界条件
2. SQL注入/XSS等安全问题
3. 异常处理是否完善
4. 性能问题(N+1查询、不必要循环)

以JSON格式输出:issues数组,每个issue含severity/file/line/description/suggestion。

代码:
{code}""",
        metadata={
            "scene": "code_review",
            "tags": ["python", "review", "security"],
            "model": "Qwen2.5-7B-Instruct",
            "effectiveness_score": 8.5,
            "notes": "增加结构化输出和安全审查维度,准确率提升明显。temperature=0.1效果最佳",
            "version": "2.0.0",
        }
    )
    
    # 检索
    results = registry.search(scene="code_review")
    for r in results:
        print(f"[{r['metadata']['version']}] {r['name']} - 评分: {r['effectiveness_score']}/10")
        print(f"  备注: {r['notes']}")

这套系统的核心理念是:prompt是有版本的、可追溯的、可评估的。每次调优都记录下来——改了什么、为什么改、效果变化多少。半年后你回头看,能看到一条清晰的prompt演化路径,这对新人来说价值极大。

3.2 Prompt经验的生命周期

prompt不是写完就结束了,它有自己的生命周期。下面这个流程描述了一个prompt从"灵光一现"到"团队标准"的完整过程:

图里有个关键节点是"反复使用3次以上"——这是经验从"偶发灵感"升级为"可沉淀经验"的门槛。低于这个次数的,记在个人笔记里就够了,没必要上升到团队层面。这个判断标准帮我们过滤掉了大量低价值的碎片,让团队标准prompt库保持精炼。


四、踩坑经验沉淀:让每个坑只被踩一次

4.1 结构化的故障与排障记录

技术人用AI的过程中会踩很多坑——模型不按格式输出、推理速度突然变慢、RAG检索结果不对、微调后效果反而变差……这些坑踩完之后如果不记录,下次自己或者同事还会踩。

但传统的"踩坑记录"写法有个问题:写得太随意,搜索的时候找不到。比如你写了个标题叫"vLLM报错处理",三个月后你搜"vLLM OOM",根本搜不到这条记录。

解决方法是结构化记录——每条踩坑记录都包含固定的字段,方便后续检索和关联:

代码语言:javascript
复制
import json
from datetime import datetime
from pathlib import Path

class IncidentKnowledgeBase:
    """AI工程踩坑知识库"""
    
    # 标准化的故障记录模板
    RECORD_TEMPLATE = {
        "id": "",
        "title": "",
        "category": "",           # deployment / performance / prompt / rag / finetune / integration
        "severity": "",            # blocker / major / minor
        "symptoms": [],            # 表象:报错信息/异常行为
        "root_cause": "",          # 根因分析
        "solution": "",            # 解决方案
        "solution_code": "",       # 解决方案代码(如有)
        "environment": {           # 环境信息
            "model": "",
            "framework": "",
            "gpu": "",
            "os": "",
        },
        "tags": [],
        "related_incidents": [],   # 关联的其他记录ID
        "created_at": "",
        "verified_at": "",         # 最后验证有效的时间
        "status": "active",        # active / outdated / deprecated
    }
    
    def __init__(self, storage_path="./ai_incidents_kb.json"):
        self.storage_path = Path(storage_path)
        if self.storage_path.exists():
            with open(self.storage_path, 'r', encoding='utf-8') as f:
                self.records = json.load(f)
        else:
            self.records = []
    
    def add(self, title: str, category: str, severity: str, 
            symptoms: list, root_cause: str, solution: str,
            environment: dict = None, tags: list = None, 
            solution_code: str = ""):
        """添加一条踩坑记录"""
        record = {
            "id": f"INC-{len(self.records)+1:04d}",
            "title": title,
            "category": category,
            "severity": severity,
            "symptoms": symptoms,
            "root_cause": root_cause,
            "solution": solution,
            "solution_code": solution_code,
            "environment": environment or {},
            "tags": tags or [],
            "related_incidents": [],
            "created_at": datetime.now().isoformat(),
            "verified_at": datetime.now().isoformat(),
            "status": "active",
        }
        self.records.append(record)
        self._save()
        return record["id"]
    
    def search(self, query: str = None, category: str = None, 
               severity: str = None, tags: list = None):
        """多维度检索"""
        results = [r for r in self.records if r["status"] == "active"]
        
        if category:
            results = [r for r in results if r["category"] == category]
        if severity:
            results = [r for r in results if r["severity"] == severity]
        if tags:
            results = [r for r in results if any(t in r["tags"] for t in tags)]
        if query:
            q = query.lower()
            results = [r for r in results 
                       if q in r["title"].lower() 
                       or q in r["root_cause"].lower()
                       or q in " ".join(r["symptoms"]).lower()
                       or q in r["solution"].lower()]
        
        return results
    
    def link_incidents(self, id1: str, id2: str):
        """关联两条记录(同类根因/连锁反应)"""
        for r in self.records:
            if r["id"] == id1 and id2 not in r["related_incidents"]:
                r["related_incidents"].append(id2)
            if r["id"] == id2 and id1 not in r["related_incidents"]:
                r["related_incidents"].append(id1)
        self._save()
    
    def _save(self):
        with open(self.storage_path, 'w', encoding='utf-8') as f:
            json.dump(self.records, f, ensure_ascii=False, indent=2)


# ---- 使用示例 ----
if __name__ == "__main__":
    kb = IncidentKnowledgeBase("./ai_incidents_kb.json")
    
    # 记录一个真实踩坑:vLLM显存OOM
    inc1 = kb.add(
        title="vLLM并发请求时CUDA Out of Memory",
        category="deployment",
        severity="blocker",
        symptoms=[
            "vLLM服务启动正常,低并发时运行正常",
            "并发请求>10时报错: CUDA error: out of memory",
            "nvidia-smi显示显存占用接近100%",
        ],
        root_cause="vLLM默认gpu-memory-utilization=0.9,预分配KV Cache过大。"
                   "高并发时多个请求的KV Cache叠加,超出显存上限。",
        solution="降低gpu-memory-utilization到0.85,同时限制max-num-seqs控制并发批次大小",
        solution_code="""python -m vllm.entrypoints.openai.api_server \\
    --model Qwen/Qwen2.5-7B-Instruct \\
    --gpu-memory-utilization 0.85 \\
    --max-num-seqs 16 \\
    --max-model-len 4096""",
        environment={
            "model": "Qwen2.5-7B-Instruct",
            "framework": "vLLM 0.6.0",
            "gpu": "RTX 4090 24GB",
            "os": "Ubuntu 22.04",
        },
        tags=["vllm", "oom", "gpu-memory", "concurrency"],
    )
    
    # 记录另一个关联问题:量化后精度下降
    inc2 = kb.add(
        title="AWQ量化后模型输出质量明显下降",
        category="performance",
        severity="major",
        symptoms=[
            "量化前回答准确率88%",
            "AWQ量化后准确率降至72%",
            "模型出现格式错乱和重复输出",
        ],
        root_cause="使用的是社区版AWQ量化模型,量化校准数据集与业务领域不匹配。"
                   "通用校准数据对中文业务场景覆盖不足。",
        solution="使用业务领域数据自行做AWQ量化校准,或改用GPTQ量化(对本场景影响更小)",
        environment={
            "model": "Qwen2.5-7B-Instruct",
            "framework": "vLLM 0.6.0 + AutoAWQ",
            "gpu": "RTX 4090 24GB",
        },
        tags=["quantization", "awq", "accuracy", "quality"],
    )
    
    # 关联两条记录
    kb.link_incidents(inc1, inc2)
    
    # 搜索
    results = kb.search(query="显存")
    for r in results:
        print(f"[{r['id']}] {r['title']}")
        print(f"  根因: {r['root_cause'][:60]}...")
        print(f"  方案: {r['solution'][:60]}...")

这个知识库的关键设计是多维度检索。你可以按类别搜(deployment/performance/prompt)、按严重程度搜(blocker/major/minor)、按关键词搜、按标签搜。当新人遇到问题时,第一反应不是"去问谁",而是"先搜知识库"。

4.2 踩坑记录的完整流转

光记录还不够,记录要有人维护、有生命周期。下面是踩坑记录从发现到沉淀的完整流转:

图里有个"定期维护"的环节特别重要。技术栈在变、模型版本在更新,半年前的解决方案可能已经不适用了。如果不定期清理,知识库会变成"历史博物馆"——信息很全但大部分过时了,反而降低了检索效率。我们团队的做法是每季度做一次review,把过时的标记为outdated,把仍然有效的更新verified_at时间。


五、方案架构经验:把"怎么做的"变成"为什么这么做"

5.1 决策记录:最重要的隐性知识

技术方案落地之后,大家看到的是最终的架构和代码。但为什么选A不选B、为什么用这个参数不用那个参数——这些决策过程是最难传承的隐性知识。

很多团队的技术文档只写了"我们用了vLLM部署Qwen模型",但没写"我们评估了vLLM/TGI/Ollama三个方案,选vLLM是因为PagedAttention在我们的高并发场景下吞吐量高出40%"。后者才是真正有价值的决策信息。

我团队的做法是用一个简单的ADR(Architecture Decision Record)模板来记录每次技术决策:

代码语言:javascript
复制
from datetime import datetime
from pathlib import Path
import json

class DecisionRecord:
    """技术决策记录(ADR)——记录为什么这么做"""
    
    TEMPLATE = """# {title}

## 状态
{status}  # proposed / accepted / deprecated / superseded

## 背景
{context}

## 决策
{decision}

## 方案对比
{alternatives}

## 理由
{rationale}

## 影响
{consequences}

## 验证
{validation}

---
- 决策时间: {date}
- 决策参与者: {participants}
- 关联文档: {related}
"""
    
    def __init__(self, storage_dir="./decisions"):
        self.storage_dir = Path(storage_dir)
        self.storage_dir.mkdir(parents=True, exist_ok=True)
    
    def create(self, title: str, context: str, decision: str,
               alternatives: str, rationale: str,
               consequences: str = "", validation: str = "",
               participants: list = None, related: list = None):
        """创建一条决策记录"""
        date_str = datetime.now().strftime("%Y-%m-%d")
        file_name = f"{date_str}_{title[:20].replace(' ', '_')}.md"
        file_path = self.storage_dir / file_name
        
        content = self.TEMPLATE.format(
            title=title,
            status="accepted",
            context=context,
            decision=decision,
            alternatives=alternatives,
            rationale=rationale,
            consequences=consequences,
            validation=validation,
            date=date_str,
            participants=", ".join(participants or []),
            related=", ".join(related or []),
        )
        
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(content)
        
        return file_path


# 使用示例
dr = DecisionRecord("./decisions")

dr.create(
    title="推理框架选型: vLLM vs TGI vs Ollama",
    context="""团队需要部署Qwen2.5-7B-Instruct作为内部AI服务的推理引擎。
预估日均调用量5万次,峰值QPS约50,要求P99延迟<3秒。
部署环境: 单台A10(24GB) GPU服务器。""",
    
    decision="选择vLLM作为推理框架",
    
    alternatives="""### 方案A: vLLM
- 优势: PagedAttention技术,高并发吞吐量最优;OpenAI API兼容
- 劣势: 社区相对年轻,偶有bug;配置参数较多

### 方案B: HuggingFace TGI
- 优势: 生态成熟,与transformers库无缝对接;文档完善
- 劣势: 吞吐量比vLLM低约30%(实测);启动慢

### 方案C: Ollama
- 优势: 部署极简,一行命令搞定;适合个人/小团队
- 劣势: 不支持高并发;无 batching;不适合生产环境""",
    
    rationale="""核心决策因素是高并发吞吐量。压测结果:
- vLLM: QPS=50时P99=2.1s,吞吐量1200 tokens/s
- TGI: QPS=50时P99=3.8s,吞吐量850 tokens/s  
- Ollama: QPS=10时P99=4.5s,无法满足50 QPS需求

vLLM在吞吐量和延迟上都明显领先,且API兼容OpenAI格式,
团队现有代码迁移成本最低。""",
    
    consequences="""正面:
- 满足性能SLA要求
- API兼容性好,迁移成本低

负面:
- 需要关注vLLM版本更新,偶有breaking change
- 需要专人维护vLLM配置参数调优""",
    
    validation="""部署后压测: QPS=50, P99=2.3s, 吞吐量1150 tokens/s
与预估基本一致,SLA达标。连续运行7天无异常。""",
    
    participants=["架构师A", "后端负责人B", "运维C"],
    related=["部署架构设计文档", "vLLM配置参数调优记录"],
)
5.2 经验沉淀的全景架构

核心在于经验不是存进去就完了,它有生命周期。从产生到采集、从加工到消费、从消费到反馈,形成一个持续运转的飞轮。飞轮转得越快,团队的知识资产就越厚。


六、评估经验:别让你的"好"只是感觉

6.1 建立可量化的评估基准

AI方案的效果评估是最容易被糊弄的环节。"感觉好多了"、"看起来不错"——这些主观判断没办法传承,也没办法对比。

真正有价值的评估经验是建立基准数据集和量化指标,每次方案迭代都用同一套基准来衡量:

代码语言:javascript
复制
import json
import time
from datetime import datetime
from openai import OpenAI

class EvaluationBenchmark:
    """AI方案效果评估基准"""
    
    def __init__(self, benchmark_path="./benchmarks"):
        self.benchmark_path = benchmark_path
        self.client = OpenAI(base_url="http://localhost:8000/v1", api_key="empty")
        self.benchmarks = self._load_benchmarks()
    
    def _load_benchmarks(self):
        """加载评估数据集"""
        path = f"{self.benchmark_path}/golden_set.json"
        try:
            with open(path, 'r', encoding='utf-8') as f:
                return json.load(f)
        except FileNotFoundError:
            return {"test_cases": []}
    
    def add_test_case(self, question: str, expected_answer: str, 
                      category: str, keywords: list = None):
        """添加评估用例(黄金标准QA对)"""
        case = {
            "id": f"TC-{len(self.benchmarks['test_cases'])+1:03d}",
            "question": question,
            "expected_answer": expected_answer,
            "category": category,
            "keywords": keywords or [],
            "added_at": datetime.now().isoformat(),
        }
        self.benchmarks["test_cases"].append(case)
        self._save_benchmarks()
    
    def run_evaluation(self, model_name: str, prompt_template: str = ""):
        """对指定模型+prompt运行评估"""
        results = []
        
        for case in self.benchmarks["test_cases"]:
            start_time = time.time()
            
            messages = [
                {"role": "system", "content": prompt_template or "你是技术助手"},
                {"role": "user", "content": case["question"]},
            ]
            
            try:
                response = self.client.chat.completions.create(
                    model=model_name,
                    messages=messages,
                    temperature=0.0,
                    max_tokens=512,
                )
                answer = response.choices[0].message.content
                latency = time.time() - start_time
                
                # 自动评分:关键词覆盖率
                keyword_coverage = self._calc_keyword_coverage(
                    answer, case.get("keywords", [])
                )
                
                results.append({
                    "case_id": case["id"],
                    "category": case["category"],
                    "question": case["question"],
                    "expected": case["expected_answer"],
                    "actual": answer,
                    "keyword_coverage": keyword_coverage,
                    "latency_ms": round(latency * 1000, 1),
                    "status": "pass" if keyword_coverage >= 0.6 else "review",
                })
            except Exception as e:
                results.append({
                    "case_id": case["id"],
                    "status": "error",
                    "error": str(e),
                })
        
        # 汇总指标
        summary = self._summarize(results, model_name)
        return summary
    
    def _calc_keyword_coverage(self, answer: str, keywords: list):
        """计算关键词覆盖率"""
        if not keywords:
            return 1.0
        hit = sum(1 for kw in keywords if kw.lower() in answer.lower())
        return hit / len(keywords)
    
    def _summarize(self, results: list, model_name: str):
        passed = [r for r in results if r["status"] == "pass"]
        review = [r for r in results if r["status"] == "review"]
        errors = [r for r in results if r["status"] == "error"]
        latencies = [r["latency_ms"] for r in results if "latency_ms" in r]
        
        return {
            "model": model_name,
            "total_cases": len(results),
            "passed": len(passed),
            "needs_review": len(review),
            "errors": len(errors),
            "pass_rate": round(len(passed) / max(len(results), 1) * 100, 1),
            "avg_latency_ms": round(sum(latencies) / max(len(latencies), 1), 1) if latencies else 0,
            "p99_latency_ms": round(sorted(latencies)[int(len(latencies)*0.99)] if latencies else 0, 1),
            "evaluated_at": datetime.now().isoformat(),
            "details": results,
        }
    
    def _save_benchmarks(self):
        path = f"{self.benchmark_path}/golden_set.json"
        import os
        os.makedirs(self.benchmark_path, exist_ok=True)
        with open(path, 'w', encoding='utf-8') as f:
            json.dump(self.benchmarks, f, ensure_ascii=False, indent=2)
    
    def save_result(self, result: dict, name: str):
        """保存评估结果用于历史对比"""
        path = f"{self.benchmark_path}/results/{name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
        import os
        os.makedirs(os.path.dirname(path), exist_ok=True)
        with open(path, 'w', encoding='utf-8') as f:
            json.dump(result, f, ensure_ascii=False, indent=2)
        print(f"评估结果已保存: {path}")


# 使用示例
bench = EvaluationBenchmark("./benchmarks")

# 添加黄金标准测试用例(从业务真实QA中精选)
bench.add_test_case(
    question="公司的退换货政策是什么?",
    expected_answer="7天无理由退货,15天质量问题换货",
    category="policy",
    keywords=["7天", "无理由", "退货", "15天", "换货"],
)

bench.add_test_case(
    question="如何修改收货地址?",
    expected_answer="在订单详情页点击修改地址,已发货订单不可修改",
    category="operation",
    keywords=["订单详情", "修改地址", "已发货", "不可修改"],
)

# 运行评估
result = bench.run_evaluation(
    model_name="Qwen/Qwen2.5-7B-Instruct",
    prompt_template="你是XX电商平台的客服助手,基于参考资料回答用户问题。",
)
bench.save_result(result, "qwen25_7b_baseline")

print(f"通过率: {result['pass_rate']}%")
print(f"平均延迟: {result['avg_latency_ms']}ms")
print(f"P99延迟: {result['p99_latency_ms']}ms")

这套评估体系的价值不在于某一次的评分,而在于历史对比。每次模型升级、prompt调整、RAG优化之后,跑一遍同一套基准,你能清楚地看到效果是变好了还是变差了。这些对比数据本身就是最硬的经验沉淀。


七、把经验变成可执行的SOP

前面讲的都是在"存"经验,但经验存了不用等于没存。最后一步是把验证过的经验提炼成SOP(标准操作流程),让新人能照着做、让工具链能自动化执行。

这个闭环的逻辑是:碎片经验→结构化存储→标准化输出→自动/人工执行→产生新的碎片经验。每一轮循环都让团队的工程资产更厚一层。

几个实操建议:

1. SOP不是写出来的,是跑出来的。 别坐在会议室里编SOP文档,从实际项目中提炼。每次项目做完,问自己三个问题:这次哪些做法要固化成标准?哪些坑要加到检查清单里?哪些决策值得记录成ADR?

2. 能自动化的别靠人记。 Prompt标准库接入工具链、部署检查清单做成CI/CD的自动校验脚本、故障应急手册接入值班告警系统。人是最不可靠的执行环节,能交给机器的就交给机器。

3. 定期清理比持续添加更重要。 知识库不清理就会变成垃圾场。我们团队每季度做一次清理:过时的prompt标记deprecated、不再适用的解决方案标记outdated、已被新方案替代的ADR标记superseded。保持知识库的"信噪比"比增加条目数重要得多。

4. 让经验消费变得无感。 最好的经验沉淀是"你不需要刻意去查,它就在你手边"。比如开发同学提交PR时,AI审查工具自动加载团队标准prompt;值班同学收到告警时,诊断报告自动关联历史相似案例。经验嵌入到工具链里,用的人甚至感觉不到它的存在,但它一直在发挥作用。


八、最后聊几句

写了这么多,核心其实就一句话:经验不是用完就扔的消耗品,是越用越厚的资产

AI技术迭代太快了,半年前的最佳实践半年后可能就过时了。但有些东西不会过时——你踩坑后总结的排查思路、你做技术选型时的评估框架、你调prompt时的方法论。这些是"渔"不是"鱼",是真正值得沉淀的东西。

团队层面,建议从最小处着手:先建一个Prompt Registry,把大家用得好的prompt存进去。就这么简单的一步,就能让你的团队在AI使用上从"各自为战"变成"经验共享"。等这个习惯养成了,再逐步加上Incident KB、ADR、评估基准。别一上来就想搞个大平台,工具不在多,在于用起来。

个人层面,养成一个习惯:每次用AI解决了一个非平凡的问题,花两分钟记录下来——什么场景、什么问题、怎么解决的、效果如何。这两分钟的投入,未来会以十倍百倍的效率回报你。

AI是工具,经验是资产。工具会更新换代,资产会持续增值。把每天和AI打交道的过程当成经验积累的过程,长期来看,这比任何单一的技术方案都有价值。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、一个特别真实的问题:你的AI经验在"蒸发"
  • 二、经验沉淀到底要沉淀什么?
  • 三、Prompt经验沉淀:别让你的prompt变成一次性用品
    • 3.1 Prompt模板的工程化管理
    • 3.2 Prompt经验的生命周期
  • 四、踩坑经验沉淀:让每个坑只被踩一次
    • 4.1 结构化的故障与排障记录
    • 4.2 踩坑记录的完整流转
  • 五、方案架构经验:把"怎么做的"变成"为什么这么做"
    • 5.1 决策记录:最重要的隐性知识
    • 5.2 经验沉淀的全景架构
  • 六、评估经验:别让你的"好"只是感觉
    • 6.1 建立可量化的评估基准
  • 七、把经验变成可执行的SOP
  • 八、最后聊几句
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档