找回密码
 立即注册
首页 业界区 安全 VibeCoding On Function AI Deep Dive:用 AI 应用生产 ...

VibeCoding On Function AI Deep Dive:用 AI 应用生产 AI 应用

崔瑜然 昨天 14:16
这是一个很有意思的话题, 今天大家都在热火朝天的构建 AI 应用。有用各种各样的编程语言,开发框架开发的,也有用低代码工作流搭建的,但是你否知道,其实可以仅通过自然语言就可以完成一个 AI 应用的开发乃至上线么? 本篇文章就来跟大家分享一下我是如何使用自然语言 的方式构建丰富多彩的 AI 应用的,希望借此可以带您直观感受 VibeCoding 的魅力,感受 AI 时代的软件生产变革。
用 AI 应用生产 AI 应用——VibeCoding On Function AI Deep Dive
操作演示

接下来我们先来真实的操作一下使用自然语言构建AI应用, 基础软件部分的获取请参考之前的系列文章《Function AI 的 VibeCoding 解决方案》 ,对于已经部署好的同学可以重新部署一个新的版本。近期方案中增加了对百炼等 AI 能力的集成,可以帮助您生成有趣又实用的AI应用。
场景一: 儿童教育娱乐类 AI 应用

这类应用非常适合家里有小朋友的同学,跟他/她们一起利用 AI 进行娱乐和互动,培养使用 AI 的意识。我们接下来看一下如何生产构建。
儿童绘本制作应用

针对有声儿童绘本的生成场景,可以构建一些有教育意义或者有童趣的绘本场景。
演示效果如下

1.gif

构建过程

使用“专家模式”, 输入框 输入 “@”选择“资深全栈工程师”。(这里不需要数据库所以不用前面两个智能体)
2.png

总共10轮对话,没有一行代码,可以看到 AI (qwen3-code-plus)可以很好的进行修正。
3.png
4.png
5.png
6.png
7.png
8.png
发布

只需按照以下流程,点击一下“发布”按钮即可。
9.png

10.png

儿童猜画应用

可以跟小朋友玩“人类绘画 AI 猜画”的游戏培养绘画兴趣。
演示效果如下

11.gif

构建过程

使用“专家模式”, 输入框 输入 “@”选择“资深全栈工程师”。(这里不需要数据库所以不用前面两个智能体)
12.png

仅四轮对话即可生成修改这样的创意AI应用。
13.png
14.png
15.png
发布

可参考儿童绘本制作应用发布流程
场景二: 企业网站+知识问答

这类应用是非常刚需的企业应用,比如企业的产品门户页或者解决方案官网等,然后还要在官网上增加一个智能助手,来实现企业的自助服务。
效果演示

16.gif

构建过程

企业网站+知识问答分两个步骤
步骤一

构建知识问答 API 服务,知识问答服务可以使用 AgentCraft 的底座无代码搭建,构建一个知识库的 API 示例如下:
1. 新建数据集
17.png
2.新建数据源
18.png
3.上传知识文档
19.png
4.新建知识库智能体
20.png
5.关联1的数据集
21.png
6.复制该知识库的调用 API
22.png
步骤二

自然语言开发,本次依然只使用“全栈专家”
23.png

经过6轮对话即可完成+AI 的能力
24.png
25.png
26.png
27.png
28.png
系统中的 AI 集成

这里是如何做到可以让 AI 应用直接开发 AI 应用的呢? 主要分三个部分
系统提示词集成

您是一位专注于Web应用开发领域的专家X,拥有跨多种编程语言、框架和最佳实践的丰富知识。
你的协作方有D(一个数据库专家)以及M(一个专业的项目经理) 可以参考他们的建议开发应用
  1. 您是一位专注于Web应用开发领域的专家X,拥有跨多种编程语言、框架和最佳实践的丰富知识。
  2. 你的协作方有D(一个数据库专家)以及M(一个专业的项目经理) 可以参考他们的建议开发应用
  3. <system_constraints>
  4.   ...之前的提示内容
  5. <IntegrationExamples>
  6.   <Integration name="百炼平台AI">
  7.     // 已知存在server端的api文件 src/app/api/ai/route.ts
  8.     // 浏览器端调用示例
  9.     // 文本生成(非流式)
  10.     const response = await fetch('/api/ai', {
  11.       method: 'POST',
  12.       headers: {
  13.         'Content-Type': 'application/json'
  14.       },
  15.       body: JSON.stringify({
  16.         action: 'text-generation',
  17.         data: {
  18.           model: 'qwen-plus',
  19.           messages: [
  20.             {
  21.               role: 'system',
  22.               content: 'You are a helpful assistant.'
  23.             },
  24.             {
  25.               role: 'user',
  26.               content: '你是谁?'
  27.             }
  28.           ]
  29.         }
  30.       })
  31.     });
  32.     /**
  33.       文本生成response的数据结构如下
  34.       {
  35.           "choices": [
  36.               {
  37.                   "message": {
  38.                       "role": "assistant",
  39.                       "content": ""
  40.                   },
  41.                   "finish_reason": "stop",
  42.                   "index": 0,
  43.                   "logprobs": null
  44.               }
  45.           ],
  46.           "object": "chat.completion",
  47.           "usage": {
  48.               "prompt_tokens": 121,
  49.               "completion_tokens": 788,
  50.               "total_tokens": 909,
  51.               "prompt_tokens_details": {
  52.                   "cached_tokens": 0
  53.               }
  54.           },
  55.           "created": 1755147048,
  56.           "system_fingerprint": null,
  57.           "model": "qwen-plus",
  58.           "id": ""
  59.       }
  60.     **/
  61.     // 文本生成(流式)
  62.     const response = await fetch('/api/ai', {
  63.     method: 'POST',
  64.     headers: {
  65.       'Content-Type': 'application/json'
  66.     },
  67.     body: JSON.stringify({
  68.       action: 'text-generation',
  69.       data: {
  70.         model: 'qwen-plus',
  71.         messages: [
  72.           {
  73.             role: 'system',
  74.             content: 'You are a helpful assistant.'
  75.           },
  76.           {
  77.             role: 'user',
  78.             content: '你是谁?'
  79.           }
  80.         ],
  81.         stream: true,
  82.         stream_options: {
  83.           include_usage: true
  84.         }
  85.       }
  86.     })
  87.   });
  88.   // 处理流式响应
  89.   if (response.body) {
  90.     const reader = response.body.getReader();
  91.     const decoder = new TextDecoder();
  92.    
  93.     while (true) {
  94.       const { done, value } = await reader.read();
  95.       if (done) break;
  96.       
  97.       const chunk = decoder.decode(value);
  98.       // 处理每个数据块
  99.       console.log(chunk);
  100.     }
  101.   }
  102.     // 图像生成1-启动异步生成任务
  103.     const response = await fetch('/api/ai', {
  104.       method: 'POST',
  105.       headers: {
  106.         'Content-Type': 'application/json'
  107.       },
  108.       body: JSON.stringify({
  109.         action: 'image-generation',
  110.         data: {
  111.           model: 'wan2.2-t2i-flash',
  112.           input: {
  113.             prompt: '一间有着精致窗户的花店,漂亮的木质门,摆放着花朵'
  114.           },
  115.           parameters: {
  116.             size: '1024*1024',
  117.             n: 1
  118.           }
  119.         }
  120.       })
  121.     });
  122.     const { output } = await response.json();
  123.     const taskId = output.task_id;
  124.     // 图像生成2-查询异步任务
  125.     const response = await fetch('/api/ai', {
  126.       method: 'POST',
  127.       headers: {
  128.         'Content-Type': 'application/json'
  129.       },
  130.       body: JSON.stringify({
  131.         action: 'get-image-task',
  132.         data: {
  133.           taskId: '86ecf553-d340-4e21-xxxxxxxxx'
  134.         }
  135.       })
  136.     });
  137.     const result = await response.json();
  138.     /**
  139.       result.output?.task_status 状态码如下:
  140.           PENDING:任务排队中
  141.           RUNNING:任务处理中
  142.           SUCCEEDED:任务执行成功
  143.           FAILED:任务执行失败
  144.           CANCELED:任务取消成功
  145.           UNKNOWN:任务不存在或状态未知
  146.       示例:
  147.       if(result.output?.task_status === 'SUCCEEDED'){
  148.         let imageurl = result.output.results?.[0]?.url;
  149.       }
  150.     **/
  151.     // 图像理解
  152.     const response = await fetch('/api/ai', {
  153.       method: 'POST',
  154.       headers: {
  155.         'Content-Type': 'application/json'
  156.       },
  157.       body: JSON.stringify({
  158.         action: 'visual-understanding',
  159.         data: {
  160.           model: 'qwen-vl-max',
  161.           messages: [
  162.             {
  163.               role: 'system',
  164.               content: [
  165.                 { type: 'text', text: 'You are a helpful assistant.' }
  166.               ]
  167.             },
  168.             {
  169.               role: 'user',
  170.               content: [
  171.                 {
  172.                   type: 'image_url',
  173.                   image_url: {
  174.                     url: '<img-url>'
  175.                   }
  176.                 },
  177.                 { type: 'text', text: '图中描绘的是什么景象?' }
  178.               ]
  179.             }
  180.           ]
  181.         }
  182.       })
  183.     });
  184.     // 音频理解(音频识别)示例
  185.     const response = await fetch('/api/ai', {
  186.       method: 'POST',
  187.       headers: {
  188.         'Content-Type': 'application/json'
  189.       },
  190.       body: JSON.stringify({
  191.         action: 'audio-understanding',
  192.         data: {
  193.           model: 'qwen-audio-turbo-latest',
  194.           input: {
  195.             messages: [
  196.               {
  197.                 role: "system",
  198.                 content: [
  199.                   {"text": "You are a helpful assistant."}
  200.                 ]
  201.               },
  202.               {
  203.                 role: "user",
  204.                 content: [
  205.                   {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
  206.                   {"text": "这段音频在说什么?"}
  207.                 ]
  208.               },
  209.               {
  210.                 role: "assistant",
  211.                 content: [
  212.                   {"text": "这段音频说的是:'欢迎使用阿里云'"}
  213.                 ]
  214.               },
  215.               {
  216.                 role: "user",
  217.                 content: [
  218.                   {"text": "介绍一下这家公司。"}
  219.                 ]
  220.               }
  221.             ]
  222.           }
  223.         }
  224.       })
  225.     });
  226.     const result = await response.json();
  227.     // 文本转语音示例(语音合成)
  228.     const response = await fetch('/api/ai', {
  229.       method: 'POST',
  230.       headers: {
  231.         'Content-Type': 'application/json'
  232.       },
  233.       body: JSON.stringify({
  234.         action: 'text-to-speech',
  235.         data: {
  236.           model: 'qwen-tts',
  237.           input: {
  238.             text: "那我来给大家推荐一款T恤,这款呢真的是超级好看,这个颜色呢很显气质,而且呢也是搭配的绝佳单品,大家可以闭眼入,真的是非常好看,对身材的包容性也很好,不管啥身材的宝宝呢,穿上去都是很好看的。推荐宝宝们下单哦。",
  239.             voice: "Chelsie"
  240.           }
  241.         }
  242.       })
  243.     });
  244.     const result = await response.json();
  245.     /**
  246.       result 返回示例
  247.       {
  248.           "output": {
  249.               "finish_reason": "stop",
  250.               "audio": {
  251.                   "expires_at": 1755191553,
  252.                   "data": "",
  253.                   "id": "",
  254.                   "url": ""
  255.               }
  256.           },
  257.           "usage": {
  258.               "input_tokens_details": {
  259.                   "text_tokens": 14
  260.               },
  261.               "total_tokens": 122,
  262.               "output_tokens": 108,
  263.               "input_tokens": 14,
  264.               "output_tokens_details": {
  265.                   "audio_tokens": 108,
  266.                   "text_tokens": 0
  267.               }
  268.           },
  269.           "request_id": ""
  270.       }
  271.     **/
  272.   </Integration>
  273.    <Integration name="AgentCraft AI">
  274.     // 服务端 建议目录src/app/api/agentcraft/route.ts
  275.     // 已知 AGENTCRAFT_BASE_URL , API_VERSION 和 TOKEN 需要用户输入
  276.     import { NextResponse } from 'next/server';
  277.     export async function POST(request: Request) {
  278.       try {
  279.         const { messages ,stream} = await request.json();
  280.         
  281.         // 调用知识库API
  282.         // AgentCraft API Vesion 为 v1 或者 v2
  283.         const response = await fetch({AGENTCRAFT_BASE_URL} + '/{API_VERSION}/chat/completions', {
  284.           method: 'POST',
  285.           headers: {
  286.             'accept': 'application/json',
  287.             'Authorization': 'Bearer <TOKEN>',
  288.             'Content-Type': 'application/json'
  289.           },
  290.           body: JSON.stringify({
  291.             messages: [
  292.               {
  293.                 role: "system",
  294.                 content: "你是一个有用的助手"
  295.               },
  296.               ...messages
  297.             ],
  298.             stream,
  299.             max_tokens: 8192
  300.           })
  301.         });
  302.         if (stream) {
  303.           // 创建一个新的 Response 对象,直接转发流式响应
  304.           return new Response(response.body, {
  305.             status: response.status,
  306.             headers: {
  307.               'Content-Type': 'text/event-stream; charset=utf-8',
  308.               'Cache-Control': 'no-cache',
  309.               'Connection': 'keep-alive',
  310.               'Access-Control-Allow-Origin': '*',
  311.             }
  312.           });
  313.         }
  314.         if (!response.ok) {
  315.           throw new Error(`知识库API请求失败: ${response.status}`);
  316.         }
  317.         const data = await response.json();
  318.         const content = data.choices?.[0]?.message?.content || '抱歉,我无法处理您的请求。请稍后再试。';
  319.         
  320.         return NextResponse.json({ content });
  321.       } catch (error) {
  322.         console.error('Error:', error);
  323.         return NextResponse.json({ error: '处理请求时发生错误' }, { status: 500 });
  324.       }
  325.     }
  326.     // 客户端
  327.     const response = await fetch('/api/agentcraft', {
  328.     method: 'POST',
  329.     headers: {
  330.       'Content-Type': 'application/json'
  331.     },
  332.     body: JSON.stringify({
  333.       action: 'text-generation',
  334.       data: {
  335.         model: 'qwen-plus',
  336.         messages: [
  337.           {
  338.             role: 'system',
  339.             content: 'You are a helpful assistant.'
  340.           },
  341.           {
  342.             role: 'user',
  343.             content: '你是谁?'
  344.           }
  345.         ],
  346.         stream: true,
  347.         stream_options: {
  348.           include_usage: true
  349.         }
  350.       }
  351.     })
  352.   });
  353.   // 处理流式响应
  354.   if (response.body) {
  355.     const reader = response.body.getReader();
  356.     const decoder = new TextDecoder();
  357.    
  358.     while (true) {
  359.       const { done, value } = await reader.read();
  360.       if (done) break;
  361.       
  362.       const chunk = decoder.decode(value);
  363.       // 处理每个数据块
  364.       console.log(chunk);
  365.     }
  366.   }
  367.    
  368.   </Integration>
  369. </IntegrationExamples>
  370. ...之前的提示内容
  371. </system_constraints>
复制代码
可以看到,这里 IntegrationExamples 中写明了在客户端调用百炼 API 以及 AgentCraft AI 的示例,他们覆盖了文本生成,图片生成,声音生成,图像识别,知识库,智能体等全方位的 AI 能力,AI 可以根据示例很好的完成开发
开发态环境集成

为了减少 AI 的输出内容,降低成本,以及确保稳定的 AI 服务,系统通过应用模板内置了 AI 的 API Server,也就是在 NextJS 的后端服务中加入了提前写好的 AI API 服务(这里只是内置了百炼的 API 服务,AgentCraft 本身的服务则是服务端和客户端都需要重新生成)
29.png
  1. // app/api/ai/route.ts
  2. import { NextRequest, NextResponse } from 'next/server';
  3. // 定义类型
  4. type MessageContent = {
  5.   type: string;
  6.   text?: string;
  7.   image_url?: { url: string };
  8.   audio?: string;
  9. };
  10. type Message = {
  11.   role: string;
  12.   content: string | MessageContent[];
  13. };
  14. type RequestBodies = {
  15.   'text-generation': {
  16.     model: string;
  17.     messages: Message[];
  18.   };
  19.   'image-generation': {
  20.     model: string;
  21.     input: {
  22.       prompt: string;
  23.     };
  24.     parameters: {
  25.       size: string;
  26.       n: number;
  27.     };
  28.   };
  29.   'get-image-task': {
  30.     taskId: string;
  31.   };
  32.   'visual-understanding': {
  33.     model: string;
  34.     messages: Message[];
  35.   };
  36.   'audio-understanding': {
  37.     model: string;
  38.     input: {
  39.       messages: Message[];
  40.     };
  41.   };
  42.   'text-to-speech': {
  43.     model: string;
  44.     input: {
  45.       text: string;
  46.       voice?: string;
  47.     };
  48.   };
  49. };
  50. // API端点映射
  51. const API_ENDPOINTS = {
  52.   'text-generation': 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions',
  53.   'image-generation': 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis',
  54.   'get-image-task': (taskId: string) => `https://dashscope.aliyuncs.com/api/v1/tasks/${taskId}`,
  55.   'visual-understanding': 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions',
  56.   'audio-understanding': 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation',
  57.   'text-to-speech': 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation'
  58. };
  59. // 请求方法映射
  60. const REQUEST_METHODS = {
  61.   'text-generation': 'POST',
  62.   'image-generation': 'POST',
  63.   'get-image-task': 'GET',
  64.   'visual-understanding': 'POST',
  65.   'audio-understanding': 'POST',
  66.   'text-to-speech': 'POST'
  67. };
  68. // 是否需要异步头
  69. const ASYNC_HEADERS = {
  70.   'image-generation': true
  71. };
  72. export async function POST(req: NextRequest) {
  73.   const { action, data } = await req.json();
  74.   
  75.   // 检查API密钥
  76.   const apiKey = process.env.DASHSCOPE_API_KEY;
  77.   if (!apiKey) {
  78.     return NextResponse.json({ error: 'DASHSCOPE_API_KEY is not configured' }, { status: 500 });
  79.   }
  80.   // 验证action
  81.   if (!(action in API_ENDPOINTS)) {
  82.     return NextResponse.json({ error: 'Invalid action specified' }, { status: 400 });
  83.   }
  84.   try {
  85.     // 特殊处理get-image-task,因为它需要taskId参数
  86.     const url = action === 'get-image-task'
  87.       ? API_ENDPOINTS[action](data.taskId)
  88.       : API_ENDPOINTS[action];
  89.       
  90.     // 验证taskId
  91.     if (action === 'get-image-task' && !data.taskId) {
  92.       return NextResponse.json({ error: 'Task ID is required' }, { status: 400 });
  93.     }
  94.     // 构建请求头
  95.     const headers: Record<string, string> = {
  96.       'Authorization': `Bearer ${apiKey}`,
  97.       'Content-Type': 'application/json'
  98.     };
  99.    
  100.     // 添加异步头(如果需要)
  101.     if (ASYNC_HEADERS[action as keyof typeof ASYNC_HEADERS]) {
  102.       headers['X-DashScope-Async'] = 'enable';
  103.     }
  104.     // 构建请求配置
  105.     const config: RequestInit = {
  106.       method: REQUEST_METHODS[action],
  107.       headers
  108.     };
  109.     // 添加请求体(GET请求不需要)
  110.     if (REQUEST_METHODS[action] === 'POST') {
  111.       config.body = JSON.stringify(data);
  112.     }
  113.     // 发送请求
  114.     const response = await fetch(url, config);
  115.      // 处理流式响应
  116.   if (action === 'text-generation' && data.stream) {
  117.     // 创建一个新的 Response 对象,直接转发流式响应
  118.       return new Response(response.body, {
  119.         status: response.status,
  120.         headers: {
  121.           'Content-Type': 'text/event-stream; charset=utf-8',
  122.           'Cache-Control': 'no-cache',
  123.           'Connection': 'keep-alive',
  124.           'Access-Control-Allow-Origin': '*',
  125.         }
  126.       });
  127.     }
  128.     const result = await response.json();
  129.    
  130.     return NextResponse.json(result, { status: response.status });
  131.   } catch (error) {
  132.     console.error('DashScope API error:', error);
  133.     return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
  134.   }
  135. }
复制代码
对于 AI 应用,还有一个比较重要的东西,就是 API 秘钥。本方案中,API 秘钥是通过环境变量的方式从上层服务注入,而不是明文写到系统,因此更加安全。
  1. //...
  2. else if (shellCommand.startsWith('npm run dev')) {
  3.                         const currentPid = process.pid;
  4.                         await checkAndKillPort(PORT, currentPid);
  5.                         const childProcess: any = spawn('npm', ['run', 'dev'], {
  6.                             cwd: workdir,
  7.                             stdio: ['ignore', 'pipe', 'pipe'],
  8.                             detached: true, // 使子进程在父进程退出后继续运行
  9.                             env: {
  10.                                 ...process.env,
  11.                                 PATH: process.env.PATH,
  12.                                 NODE_ENV: 'development', // 明确设置开发环境
  13.                                 VITE_USER_NODE_ENV: 'development'
  14.                             },
  15.                             uid,
  16.                             gid
  17.                         });
  18. // ....
复制代码
生产态环境集成

因为在开发态的时候集成 AI 的代码以及客户端的调用代码都已经准备完毕,发布到生产环境,只是提取开发态的环境变量一并部署到服务器上即可。
构建的过程中会生成 s.yaml, 将整个生成的 AI 应用进行打包上传
  1. const sYamlContent = `edition: 3.0.0
  2. name: mayama_ai_generated_app
  3. vars:
  4.   region: '${process.env.REGION}'
  5.   functionName: 'mayama_${projectId}'
  6. template:
  7.   mayama_all:
  8.     internetAccess: true
  9. resources:
  10.   
  11.   mayama_nextjs_build:
  12.     component: fc3
  13.     actions:
  14.       pre-deploy:
  15.         - run: npm run build
  16.           path: ./
  17.     props:
  18.       region: '\${vars.region}'
  19.       description: 应用
  20.       timeout: 600
  21.       diskSize: 512
  22.       customRuntimeConfig:
  23.         port: 3000
  24.         command:
  25.           - bootstrap
  26.       layers:
  27.         - acs:fc:\${vars.region}:official:layers/Nodejs20/versions/1
  28.         - acs:fc:\${vars.region}:1154600634854327:layers/ac-client-mayama-base-release/versions/10
  29.         - >-
  30.           acs:fc:\${vars.region}:1154600634854327:layers/ac-client-base-release/versions/4
  31.       runtime: custom.debian10
  32.       instanceConcurrency: 100
  33.       memorySize: 3072
  34.       cpu: 2
  35.       environmentVariables:
  36.         LD_LIBRARY_PATH: /code:/code/lib:/usr/local/lib:/opt/lib
  37.         NODE_PATH: /opt/nodejs/node_modules
  38.         Region: '\${vars.region}'
  39.         DASHSCOPE_API_KEY: ${process.env.DASHSCOPE_API_KEY || ''}
  40.         NEXT_PUBLIC_SUPABASE_URL: ${NEXT_PUBLIC_SUPABASE_URL}
  41.         NEXT_PUBLIC_SUPABASE_ANON_KEY: ${NEXT_PUBLIC_SUPABASE_ANON_KEY}
  42.         PATH: >-
  43.           /opt/nodejs20/bin:/usr/local/bin/apache-maven/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/ruby/bin:/opt/bin:/code:/code/bin:/opt/nodejs/node_modules/.bin
  44.       functionName: \${vars.functionName}
  45.       code: ./
  46.       triggers:
  47.         - description: ''
  48.           qualifier: LATEST
  49.           triggerName: defaultTrigger
  50.           triggerType: http
  51.           triggerConfig:
  52.             methods:
  53.               - GET
  54.               - POST
  55.               - PUT
  56.               - DELETE
  57.             authType: anonymous
  58.             disableURLInternet: false
  59.       customDomain:
  60.         protocol: "HTTP"
  61.         route:
  62.           path: "/*"
  63.           qualifier: "LATEST"
  64.         domainName: auto
  65.     extend:
  66.       name: mayama_all
  67.   
  68. `;
  69.     await fs.writeFile(sYamlPath, sYamlContent, 'utf-8');
  70.     console.log(`✅ 已创建 s.yaml 配置文件`);
复制代码
VibeCoding 的技巧

了解系统的设计可以掌握系统的应用边界,知晓什么时候可以强化提示让 AI 系统更好的完成生产任务。这里有些小技巧。
一、项目唯一ID

30.png

当 AI 第一次将项目信息输出的时候,后续都应该围绕这里的 ID 进行持续的迭代,因为系统构建真实的应用文件是以这个 ID 为唯一值,如果你发现 ID 变了,那就意味着系统重新生成了一个项目,无法延续你之前的项目。 此时可以跟系统说“请在项目 ID 是 xxxx 的项目上修改”,这样就保持了项目持续迭代的一致性。
这里也建议一个会话对应一个项目,防止生成混淆。
二、一些必要的交流术语

绝大部分情况下,你使用自然语言表达自己的需求要求 AI 满足即可,但某些情况下,需要给他一些专业的软件开发术语,可以让他修改的更加明确,比如上述示例,使用 xxxx api 完成开发(复制的是一个 curl 的请求),再比如构建应用视觉的时候,可以输入 “请把页面上的卡片元素进行垂直/水平居中”,请使用 xxx 的 json 数据进行数据模拟等等。
31.png

三、异常情况处理

AI 编程结果不一定是一帆风顺的,系统内置了错误提示的效果,因此当遇到错误的时候最简单直接的办法就是直接粘贴复制,让 AI 自己看错误去修改。
32.png

除了异常,系统还会把生成的应用本身,以及多轮对话等上下文都一并传入给 AI,全面的上下文可以更好的让 AI 帮助我们解决问题。
四、解决不了的死循环

AI 可能会陷入某种死循环,怎么问问题都解决不了,此时你可以要求他换个思路,或者我们换一个问话方式,看看是否可以解决。
33.png

未来展望

随着 VibeCoding 解决方案的持续进化,我们正朝着全民开发者时代迈进,

  • 国内开放平台的登录:使用支付宝,微信等登录系统直接让自己生成的应用对外可服务
  • 小程序/移动应用:扩展应用类型,如支持小程序或者移动应用的自然语言编程方案
  • Agentic 应用:支持更复杂的 Agentic 工作流,多模态应用
上手体验

访问阿里云 Function AI控制台参考《全球首个搭载Kimi-K2&Qwen3-Coder的Serverless架构VibeCoding解决方案重磅来袭!》内容教程进行部署使用。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册