EdgeOne Makers AI 原生开发
AI 原生应用不是简单调个模型 API,而是要把 AI 能力深度集成到产品流程里,让 AI 成为核心体验。这篇讲清楚 AI 应用开发流程、Prompt 工程技巧,以及一个完整的智能问答项目实战。
AI 应用开发流程
AI 原生应用开发不是写完代码就结束,而是要经过需求分析、模型选型、Prompt 设计、接口开发、测试优化等多个环节。
整体流程:
需求分析
↓
模型选型
↓
Prompt 设计
↓
接口开发
↓
测试与优化
↓
上线运行
需求分析
先搞清楚要解决什么问题。是智能客服、内容生成、数据分析,还是其他场景。不同场景对模型能力、延迟、成本的要求不同。
| 场景 | 模型要求 | 延迟要求 | 成本敏感度 |
|---|---|---|---|
| 智能客服 | 中等 | 低延迟 | 敏感 |
| 内容生成 | 高 | 可以等 | 不敏感 |
| 数据分析 | 高 | 可以等 | 不敏感 |
| 简单问答 | 低 | 极低延迟 | 敏感 |
模型选型
根据需求选择合适的模型。参考上一篇的选型指南,从任务复杂度、语言支持、成本预算、延迟要求四个维度判断。
Prompt 设计
Prompt 是 AI 应用的核心,直接决定输出质量。好的 Prompt 需要反复迭代优化。
接口开发
把模型调用封装成 API 接口,处理请求参数、错误处理、流式输出等。
测试与优化
测试不同场景的输出质量,优化 Prompt 和参数,调整温度、top_p 等控制生成行为。
Prompt 工程技巧
Prompt 不是随便写句话就行,而是要讲究结构、清晰、具体。好的 Prompt 能显著提升输出质量。
基本原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 明确角色 | 告诉模型它是谁 | “你是一个专业的技术文档写手” |
| 具体任务 | 清楚说明要做什么 | “把下面这段话改写成通俗易懂的版本” |
| 输出格式 | 指定返回格式 | “用 JSON 格式返回,包含 title 和 content 字段” |
| 示例引导 | 给一两个例子 | “比如: 输入’AI’, 输出’人工智能’” |
| 限制条件 | 说明不要做什么 | “不要使用专业术语,控制在 200 字以内” |
System Prompt 设计
System Prompt 设定模型的人设和行为规则,是整个对话的基础。
const systemPrompt = `你是一个专业的技术文档写手,擅长把复杂的技术概念用通俗易懂的语言解释清楚。
你的写作风格:
- 用大白话,像跟朋友聊天
- 多用比喻和例子
- 避免专业术语,必须用时先解释
- 段落短小,每段不超过 3 句话
你的任务:
- 把用户提供的技术概念改写成通俗易懂的版本
- 控制在 300 字以内
- 用中文回答`;
好的 System Prompt 能让模型稳定输出符合预期的内容。
User Prompt 设计
User Prompt 是具体的任务输入,要清晰、具体。
// 不好的 Prompt
const badPrompt = "解释一下 AI";
// 好的 Prompt
const goodPrompt = `请用通俗易懂的语言解释"人工智能"这个概念,要求:
1. 用一个生活中的比喻来说明
2. 举两个实际应用的例子
3. 控制在 200 字以内
4. 不要使用专业术语`;
Few-shot 示例
给模型一两个例子,让它理解你想要的输出格式和风格。
const messages = [
{
role: "system",
content: "你是一个标题生成器,把用户输入的内容改写成吸引人的标题。",
},
{
role: "user",
content: "如何学习编程",
},
{
role: "assistant",
content: "从零开始学编程: 新手入门完整指南",
},
{
role: "user",
content: "怎样提高写作能力",
},
];
通过给一个例子,模型就知道你想要什么样的标题风格。
Prompt 模板
把常用的 Prompt 封装成模板,方便复用。
const templates = {
// 摘要模板
summary: (text) => `请用 3 句话总结下面这段内容:
${text}`,
// 翻译模板
translate: (text, targetLang) => `请把下面这段内容翻译成${targetLang}:
${text}`,
// 改写模板
rewrite: (text, style) => `请把下面这段内容改写成${style}的风格:
${text}`,
};
// 使用
const prompt = templates.summary("这是一段很长的内容...");
完整示例项目
下面实现一个完整的智能问答项目,包含前端页面和后端接口。
后端接口
export default {
async fetch(request, env) {
const url = new URL(request.url);
// 处理静态资源
if (url.pathname === "/") {
return new Response(htmlContent, {
headers: { "content-type": "text/html; charset=utf-8" },
});
}
// 处理问答接口
if (url.pathname === "/api/ask" && request.method === "POST") {
let body;
try {
body = await request.json();
} catch {
return Response.json({ error: "请求体不是合法 JSON" }, { status: 400 });
}
const { question } = body;
if (!question) {
return Response.json({ error: "缺少 question 字段" }, { status: 400 });
}
// 调用 AI 模型
const response = await env.AI.run("@openai/gpt-3.5-turbo", {
messages: [
{
role: "system",
content: "你是一个用中文回答问题的助手,回答要简洁明了。",
},
{ role: "user", content: question },
],
max_tokens: 512,
temperature: 0.7,
});
return Response.json({
answer: response.response,
usage: response.usage,
});
}
return new Response("页面不存在", { status: 404 });
},
};
// 前端页面
const htmlContent = `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>智能问答</title>
<style>
body { font-family: sans-serif; max-width: 600px; margin: 50px auto; }
input { width: 100%; padding: 10px; margin: 10px 0; }
button { padding: 10px 20px; cursor: pointer; }
#answer { margin-top: 20px; padding: 15px; background: #f5f5f5; }
</style>
</head>
<body>
<h1>智能问答</h1>
<input type="text" id="question" placeholder="输入你的问题">
<button onclick="ask()">提问</button>
<div id="answer"></div>
<script>
async function ask() {
const question = document.getElementById('question').value;
if (!question) return;
const res = await fetch('/api/ask', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ question }),
});
const data = await res.json();
document.getElementById('answer').innerHTML =
'<strong>回答:</strong> ' + data.answer +
'<br><small>消耗 token: ' + data.usage.total_tokens + '</small>';
}
</script>
</body>
</html>
`;
部署与测试
把代码部署到 EdgeOne Makers,访问函数 URL 就能看到问答页面。输入问题后点击提问,后端调用 AI 模型生成回答并返回。
优化方向
- 加多轮对话: 把历史消息存到 KV,支持上下文
- 流式输出: 用 SSE 边生成边返回,体验更好
- 错误处理: 模型调用失败时返回友好提示
- 限流: 防止接口被滥用
速查卡片
| 要点 | 说明 |
|---|---|
| 开发流程 | 需求分析、模型选型、Prompt 设计、接口开发、测试优化 |
| Prompt 原则 | 明确角色、具体任务、输出格式、示例引导、限制条件 |
| System Prompt | 设定模型人设和行为规则 |
| User Prompt | 清晰、具体、给例子 |
| Few-shot | 给一两个例子引导输出风格 |
| 参数调整 | temperature 控制随机性,max_tokens 控制长度 |
| 流式输出 | 用 SSE 边生成边返回,提升体验 |
| 完整项目 | 前端页面 + 后端接口 + AI 模型调用 |