钉钉 AI 客服:大模型调用优化技巧
大模型 API 是主要成本,优化调用很重要。
一、成本分析
| 模型 | 输入价格 | 输出价格 |
|---|---|---|
| DeepSeek | ¥0.27/M | ¥1.08/M |
| GPT-4 | $10/M | $30/M |
| Claude | $3/M | $15/M |
二、调用优化
2.1 提示词压缩
// ❌ 冗长提示词
const prompt = `
你是一个专业的客服,需要礼貌、友好、专业地回答用户问题...
(500字)
`;
// ✅ 精简提示词
const prompt = `客服。简洁友好回答。`;
2.2 上下文管理
// 只保留最近 5 轮对话
function trimContext(messages) {
return messages.slice(-5);
}
2.3 批量处理
// 批量处理多个问题
async function batchProcess(questions) {
const prompt = questions.map((q, i) => `${i+1}. ${q}`).join('\n');
const response = await ai.chat(prompt);
return parseResponses(response);
}
三、缓存策略
3.1 相同问题缓存
async function getResponse(question) {
const key = `response:${hash(question)}`;
const cached = await redis.get(key);
if (cached) return cached;
const response = await ai.chat(question);
await redis.set(key, response, 'EX', 3600);
return response;
}
3.2 语义缓存
async function getResponseWithSemanticCache(question) {
// 找相似问题
const similar = await findSimilar(question);
if (similar && similar.similarity > 0.95) {
return similar.response;
}
const response = await ai.chat(question);
await saveToCache(question, response);
return response;
}
四、模型选择
4.1 简单问题用小模型
function selectModel(question) {
if (question.length < 50 && isSimple(question)) {
return 'deepseek-chat'; // 便宜
}
return 'deepseek-reasoner'; // 复杂问题
}
4.2 本地模型
// 简单问题用本地模型
if (isSimpleQuestion(question)) {
return localModel.generate(question);
}
五、流式响应
// 流式响应提升用户体验
const stream = await ai.chat.stream(question);
for await (const chunk of stream) {
res.write(chunk);
}
res.end();
六、成本监控
let totalTokens = 0;
async function chatWithTracking(question) {
const response = await ai.chat(question);
totalTokens += response.usage.total_tokens;
// 告警
if (totalTokens > DAILY_LIMIT) {
await sendAlert('Token 使用量过高');
}
return response;
}
七、优化效果
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 日均 Token | 10M | 3M |
| 月成本 | ¥3,000 | ¥900 |
| 响应时间 | 2s | 0.8s |
项目地址:GitHub - dingtalk-connector-pro 有问题欢迎 Issue 或评论区交流