Install
openclaw skills install ai-dev-engineerAI开发工程师全流程工作流。覆盖需求分析→技术选型→数据处理→AI核心开发(Prompt/Agent/RAG/微调)→后端服务→前端交互→测试评估→部署运维→性能优化8大阶段。面向LLM应用开发全链路,提供代码模板、架构决策框架、调试排查指南。触发词: AI开发, AI工程师, AI全栈, LLM应用开发, Agent开发, RAG开发, Prompt工程, 模型微调, AI部署, AI后端, AI前端, 搭建AI应用, AI系统设计, AI架构, MLOps, AI工程化, AI dev, LLM app, AI fullstack, build AI app, AI system design.
openclaw skills install ai-dev-engineer从需求到上线的 AI 应用工程化全链路。侧重编码落地、架构设计、性能优化、运维监控——是 AI PM 的工程执行搭档。
AI Dev Engineer Skill 覆盖 AI 应用开发的完整工程链路,共 8 大阶段、32 个关键动作。与 ai-pm(产品视角)互补,本 skill 聚焦工程实现。
①需求与技术选型 → ②数据工程 → ③AI核心开发 → ④后端服务开发
↓
⑧性能优化与迭代 ← ⑦部署与运维 ← ⑥测试与评估 ← ⑤前端交互开发
触发: 拿到需求描述、PRD、或用户说"帮我设计一个AI系统的技术方案"
将产品需求转化为工程任务清单:
| 产品需求 | 工程任务 | 技术复杂度 | AI依赖度 | 优先级 |
|---------|---------|:--------:|:------:|:----:|
| 用户上传PDF并提问 | RAG文档问答 | 中 | 高 | P0 |
| 对话历史管理 | 会话存储+上下文窗口 | 低 | 中 | P0 |
| 多轮追问能力 | Agent工具调用 | 高 | 高 | P1 |
根据场景选择架构模式:
| 场景 | 推荐架构 | 适用条件 |
|---|---|---|
| 简单ChatBot | LLM API + 前端 | 无需外部数据、无需工具 |
| 知识库问答 | RAG架构 | 有私有文档/知识库 |
| 复杂工具调用 | Agent架构 (ReAct/Plan-Execute) | 需要多步推理+外部工具 |
| 多任务协同 | Multi-Agent架构 | 任务可拆解为独立子任务 |
| 高并发服务 | LLM API + 语义缓存 + 队列 | QPS > 100 |
快速决策矩阵:
┌─ 语言: Python (首选, AI生态最完善) / TypeScript (全栈偏好)
├─ 框架: FastAPI (高性能API) / LangChain (快速原型) / 自研 (灵活性最高)
├─ 模型API: OpenAI / DashScope / DeepSeek / 本地部署(vLLM/Ollama)
├─ 向量数据库: Milvus (生产级) / Chroma (原型) / pgvector (已有PG)
├─ 数据库: PostgreSQL + Redis (会话缓存)
├─ 部署: Docker + Docker Compose / K8s
└─ 监控: LangFuse / LangSmith / 自建 (Prometheus+Grafana)
月成本 = DAU × 平均对话轮次 × (输入Token × 输入单价 + 输出Token × 输出单价)
+ 向量数据库费用(云服务) 或 服务器费用(自建)
+ Embedding API调用费用
输出: 技术方案文档 + 成本估算表 + 架构图
触发: 需要准备训练数据、构建知识库、处理标注数据
# 典型的数据清洗 pipeline
import re
from typing import List, Dict
def clean_documents(raw_docs: List[Dict]) -> List[Dict]:
"""文档清洗: 去重、去噪、标准化"""
cleaned = []
seen = set()
for doc in raw_docs:
# 去重
content_hash = hash(doc['content'][:200])
if content_hash in seen:
continue
seen.add(content_hash)
# 去噪: 移除多余空白、特殊字符
doc['content'] = re.sub(r'\s+', ' ', doc['content']).strip()
# 过滤过短/过长文档
if 50 < len(doc['content']) < 10000:
cleaned.append(doc)
return cleaned
切片决策树:
├─ 结构化文档 (Markdown/HTML)
│ └─ 按标题层级切片 (MarkdownHeaderTextSplitter)
├─ 非结构化文本
│ ├─ 短文档 (< 2000字): 整篇不切
│ ├─ 中文文档: Chunk=512 tokens, Overlap=50
│ └─ 代码: Chunk=256 tokens, 按函数边界切
└─ 表格数据
└─ 保留为结构化JSON, 不加切片
# 标准 RAG 入库流程
from openai import OpenAI
def embed_and_store(docs: List[Dict], collection_name: str):
"""文档向量化并存入向量数据库"""
client = OpenAI()
embeddings = []
for doc in docs:
resp = client.embeddings.create(
model="text-embedding-3-small", # 性价比最优
input=doc['content']
)
embeddings.append({
'id': doc['id'],
'vector': resp.data[0].embedding,
'metadata': doc['metadata']
})
# 批量写入向量数据库
vector_db.upsert(collection_name, embeddings)
{"messages": [{"role": "system", "content": "你是AI客服"}, {"role": "user", "content": "如何退货?"}, {"role": "assistant", "content": "在订单详情页点击申请退货..."}]}
检查清单:
这是 AI 开发工程师的核心战场。
三层 Prompt 架构:
┌─────────────────────────────┐
│ System Prompt (角色+约束) │ ← 固定, 版本管理
├─────────────────────────────┤
│ Context (RAG结果/用户画像) │ ← 动态注入
├─────────────────────────────┤
│ User Message (当前输入) │ ← 原始用户输入
└─────────────────────────────┘
Prompt 版本管理模板:
# prompts/v1/customer_service.py
SYSTEM_PROMPT_V1 = """你是{company_name}的AI客服专家。
## 能力范围
- 回答产品相关问题
- 处理退换货咨询
- 查询订单状态
## 约束
- 不确定时明确告知,不要编造
- 涉及退款金额时必须确认后回答
- 语气友好但不谄媚"""
# prompts/v1/__init__.py 中做版本注册
PROMPT_REGISTRY = {
"customer_service": {"v1": SYSTEM_PROMPT_V1, "default": "v1"},
}
调试技巧:
{ } 标记动态变量,便于检查遗漏ReAct Agent 标准实现:
from typing import List, Dict, Any, Callable
import json
class ReActAgent:
"""标准 ReAct Agent 实现"""
def __init__(self, llm_call: Callable, tools: Dict[str, Callable]):
self.llm = llm_call
self.tools = tools
self.max_steps = 10
def run(self, user_input: str) -> str:
messages = [{"role": "system", "content": self._build_system_prompt()}]
messages.append({"role": "user", "content": user_input})
for step in range(self.max_steps):
response = self.llm(messages)
action = self._parse_action(response)
if action['type'] == 'final_answer':
return action['content']
elif action['type'] == 'tool_call':
tool_result = self._execute_tool(
action['tool'], action['input']
)
messages.append({"role": "assistant", "content": response})
messages.append({
"role": "user",
"content": f"工具返回: {tool_result}"
})
return "达到最大步数限制,请简化问题重试"
def _build_system_prompt(self) -> str:
tool_desc = "\n".join([
f"- {name}: {desc}"
for name, (_, desc) in self.tools.items()
])
return f"""你是AI助手,可使用以下工具完成任务:
{tool_desc}
回复格式:
- 使用工具: {{"action": "tool", "tool": "工具名", "input": "参数"}}
- 最终回答: {{"action": "final", "content": "答案"}}"""
Multi-Agent 编排模式:
模式A - 顺序流水线: Agent1 → Agent2 → Agent3
适用: 任务有明确先后依赖 (分析→设计→实现)
模式B - 并行+汇总: Agent1 ↘
Agent2 → 汇总Agent → 输出
Agent3 ↗
适用: 独立子任务可并行处理
模式C - 辩论模式: Agent1 ↔ Agent2 (多轮辩论) → 裁判Agent
适用: 需要多角度验证的决策场景
完整 RAG Pipeline:
class RAGPipeline:
"""生产级 RAG Pipeline"""
def __init__(self, embedding_model: str, llm_model: str,
vector_db, reranker=None):
self.embedding_model = embedding_model
self.llm_model = llm_model
self.vector_db = vector_db
self.reranker = reranker
def query(self, question: str, top_k: int = 10, rerank_k: int = 3):
# Step 1: Query 改写 (处理指代消解、拼写纠错)
query = self._rewrite_query(question)
# Step 2: 向量检索 + 关键词检索 (混合检索)
vector_results = self.vector_db.search(query, top_k=top_k)
keyword_results = self._bm25_search(query, top_k=top_k)
# Step 3: 融合排序 (RRF - Reciprocal Rank Fusion)
fused = self._reciprocal_rank_fusion(
[vector_results, keyword_results], k=60
)
# Step 4: Rerank (可选)
if self.reranker:
fused = self.reranker.rerank(query, fused)[:rerank_k]
# Step 5: 生成回答
context = "\n\n".join([doc['content'] for doc in fused])
answer = self.llm.generate(
prompt=f"基于以下参考资料回答问题:\n{context}\n\n问题: {question}"
)
return {
'answer': answer,
'sources': [doc['source'] for doc in fused],
'confidence': self._estimate_confidence(answer, fused)
}
RAG 优化清单:
微调决策框架:
需要微调吗?
├─ Prompt优化能解决? → 不需要, 改Prompt
├─ Few-shot示例能解决? → 不需要, 加示例
├─ 特定领域知识? → 先试RAG → 不够再微调
├─ 特定格式/风格? → 微调 (数据量 100-1000条)
├─ 新能力/任务? → 微调 (数据量 1000+条)
└─ 成本和延迟优化? → 蒸馏/微调小模型
# LoRA 微调核心流程 (使用 QLoRA 降低显存)
# 关键参数:
# - r=8~64 (秩, 越大能力越强但越慢)
# - lora_alpha=16~32 (缩放因子)
# - target_modules=["q_proj", "v_proj"] (Qwen/Llama 通用)
# - 学习率: 2e-4 ~ 5e-5
# FastAPI 标准项目结构
project/
├── app/
│ ├── api/
│ │ ├── v1/
│ │ │ ├── chat.py # 对话接口
│ │ │ ├── rag.py # RAG 接口
│ │ │ └── agent.py # Agent 接口
│ │ └── deps.py # 依赖注入
│ ├── core/
│ │ ├── config.py # 配置管理
│ │ ├── llm.py # LLM 调用封装
│ │ └── security.py # 鉴权
│ ├── models/ # 数据模型
│ ├── services/ # 业务逻辑层
│ └── main.py # 入口
├── tests/
├── Dockerfile
└── docker-compose.yml
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio
import json
@app.post("/api/v1/chat/stream")
async def chat_stream(request: ChatRequest):
async def generate():
async for chunk in llm_service.stream_chat(
messages=request.messages,
temperature=request.temperature
):
yield f"data: {json.dumps({'delta': chunk, 'finish': False})}\n\n"
yield f"data: {json.dumps({'delta': '', 'finish': True})}\n\n"
return StreamingResponse(
generate(),
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
"X-Accel-Buffering": "no", # Nginx 禁用缓冲
}
)
# 1. 请求限流
from slowapi import Limiter
limiter = Limiter(key_func=lambda: "global")
# 2. 语义缓存 (避免重复调用LLM)
class SemanticCache:
def get_or_compute(self, query: str, func, threshold=0.92):
cached = self.vector_db.search(query, top_k=1)
if cached and cached[0]['score'] > threshold:
return cached[0]['response']
result = func(query)
self.store(query, result)
return result
# 3. Token 计数与成本追踪
def estimate_cost(model: str, input_tokens: int, output_tokens: int) -> float:
pricing = {
"gpt-4o": (2.5/1e6, 10/1e6),
"gpt-4o-mini": (0.15/1e6, 0.6/1e6),
"deepseek-chat": (0.14/1e6, 0.28/1e6),
}
in_price, out_price = pricing.get(model, (0, 0))
return input_tokens * in_price + output_tokens * out_price
┌─────────────────────────────────┐
│ Header: 标题 + 新建对话 + 设置 │
├─────────────────────────────────┤
│ │
│ Message List (虚拟滚动) │
│ ┌─ User Bubble ────────────┐ │
│ │ 用户消息 │ │
│ └──────────────────────────┘ │
│ ┌─ AI Bubble ──────────────┐ │
│ │ 流式渲染中的AI回复... │ │
│ │ 📎 来源: doc1.pdf, doc2 │ │
│ └──────────────────────────┘ │
│ │
├─────────────────────────────────┤
│ Input: [文本框] [上传] [发送] │
└─────────────────────────────────┘
// React SSE 流式接收
async function* streamChat(messages: Message[]) {
const response = await fetch('/api/v1/chat/stream', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ messages }),
});
const reader = response.body!.getReader();
const decoder = new TextDecoder();
let buffer = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
// 解析 SSE 事件
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
if (data.finish) return;
yield data.delta;
}
}
}
}
思考 → 行动 → 观察 循环┌──────────────────────────┐
│ E2E 测试 (端到端场景) │ ← 少量, 覆盖核心用户旅程
├──────────────────────────┤
│ Eval 测试 (AI质量评估) │ ← AI应用特有, Golden Dataset
├──────────────────────────┤
│ 集成测试 (API + DB + LLM) │ ← Mock LLM 响应
├──────────────────────────┤
│ 单元测试 (纯逻辑) │ ← 大量, 快速反馈
└──────────────────────────┘
# 使用 Golden Dataset 进行评估
def evaluate_prompt(prompt_template, test_cases, llm):
"""评估Prompt效果"""
results = []
for case in test_cases:
response = llm(prompt_template.format(query=case['query']))
results.append({
'query': case['query'],
'expected': case['expected'],
'actual': response,
'pass': case['expected'].lower() in response.lower(),
'latency_ms': response.latency,
})
accuracy = sum(r['pass'] for r in results) / len(results)
avg_latency = sum(r['latency_ms'] for r in results) / len(results)
return {
'accuracy': accuracy,
'avg_latency_ms': avg_latency,
'total': len(results),
'failed_cases': [r for r in results if not r['pass']],
}
# 多阶段构建示例
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY app/ ./app/
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
Git Push → Lint + Type Check → Unit Tests → Eval Tests → Build Image
↓
Deploy Staging → Smoke Test → Deploy Prod
# 关键监控指标
metrics = {
'latency': {
'p50_ms', 'p95_ms', 'p99_ms', # 延迟分布
'first_token_ms', # 首Token时间(流式)
},
'quality': {
'thumbs_up_rate', # 用户点赞率
'thumbs_down_rate', # 用户点踩率
'regeneration_rate',# 重新生成率
},
'cost': {
'tokens_per_request', # 每次请求Token消耗
'daily_cost_usd', # 日成本
'cache_hit_rate', # 缓存命中率
},
'reliability': {
'error_rate', # 错误率
'timeout_rate', # 超时率
'fallback_rate', # 降级触发率
}
}
阶段1: 内部测试 (1%流量) → 观察 2小时
阶段2: 小流量 (5%) → 观察 24小时
阶段3: 中流量 (25%) → 观察 24小时
阶段4: 大流量 (50%) → 观察 12小时
阶段5: 全量 (100%)
每个阶段需验证: 错误率不升、延迟不升、点赞率不降
回滚条件: 任意核心指标恶化 > 20% 或 错误率 > 5%
| 优化手段 | 预期提升 | 实现复杂度 | 适用场景 |
|---|---|---|---|
| 语义缓存 | 50-80% | 中 | 重复问题多 |
| Prompt 精简 | 10-30% | 低 | 所有场景 |
| 流式输出 | 感知延迟降70% | 低 | 所有场景 |
| 模型降级 (强→弱) | 30-50% | 低 | 简单任务 |
| 并行调用 | 40-60% | 中 | 多步独立Agent |
| 预测用户意图 | 20-30% | 高 | 高频固定场景 |
| 模型量化/蒸馏 | 50-70% | 高 | 大规模部署 |
# 成本优化策略
class CostOptimizer:
def route_model(self, query: str) -> str:
"""智能路由: 简单问题用小模型,复杂问题用大模型"""
complexity = self.estimate_complexity(query)
if complexity == "simple":
return "gpt-4o-mini" # $0.15/M input
elif complexity == "medium":
return "gpt-4o" # $2.50/M input
else:
return "claude-opus" # 最强模型
def should_use_cache(self, query: str) -> bool:
"""判断是否走缓存"""
return self.semantic_cache.has_similar(query, threshold=0.95)
发现问题 → 归类根因 → 选择修复策略:
├─ Prompt 问题 (40%)
│ └─ 修改Prompt → 回归测试 → 灰度上线
├─ 知识库缺失 (30%)
│ └─ 补充文档 → 重新入库 → 验证召回
├─ 模型能力不足 (20%)
│ └─ 换模型 / 微调 / 加约束
└─ 架构缺陷 (10%)
└─ 重构Agent流程 / 增加校验层
用户提出具体开发任务,直接匹配对应阶段:
帮我设计一个AI客服的技术方案 → 阶段一清洗这批文档准备RAG入库 → 阶段二写一个ReAct Agent / 优化这段Prompt → 阶段三搭建FastAPI后端 / 实现流式输出 → 阶段四写一个AI聊天前端组件 → 阶段五搭建LLM评估体系 / 写Golden Dataset测试 → 阶段六Docker部署这个AI应用 / 配置监控 → 阶段七分析线上Bad Case / 优化延迟 → 阶段八用户说"帮我从零搭建一个XXX的AI应用"时,按顺序推进八个阶段,每个阶段产出后确认。
遇到具体问题时:
references/tech_stack_guide.md — 详细技术栈对比与选型指南references/common_pitfalls.md — AI 开发常见坑与解决方案scripts/eval_runner.py — LLM 评估测试运行脚本scripts/cost_tracker.py — Token 成本追踪脚本