六维教程

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 模型调用
上一篇
EdgeOne Makers 模型与厂商
下一篇
EdgeOne Makers RAG 与知识库