学习任务
1.为什么需要指定大模型的输出规范?
2.大模型的输出规范,有哪些核心参数?
3.为什么不直接在前端代码中调用模型,而是通过后端调用后封装成接口,前端在间接调用?

一、梳理大模型的由来

1.0 AI(人工智能) AI 是技术总称,模型是 AI 的具体实现体

1.1 模型(AI 的大脑): 训练好的一堆数据 + 算法,用来做判断、生成、识别

1.1.1 普通模型( 2022 年 ChatGPT 爆火之前,绝大多数模型,都是一个模型做只能做一件事)
特点:只干一件事、体量小、功能专一
举例:语音转文字模型

1.1.2 大模型(模型体积大、处理事件多)
概念:属于模型的一种,超级大,海量参数和海量文本训练,具备语言理解能力

  • 1.1.2.1 豆包模型(专业叫法:豆包大模型)
  • 1.1.2.2 DeepSeek 模型(专业叫法:DeepSeek 大模型)
  • 1.1.2.3 千问(…)
  • 1.1.2.4 文心一言(…)
  • 所以,你可以听到日常简称:大模型===豆包、deep seek、千问模型
二、大模型的3个核心参数(真正分类:只有2个核心参数)

在上一篇文章中,学习了如何在项目中手动(node.js方式)调用大模型功能,这里发3个核心参数就是在调用大模型后,制定大模型的输出内容(遵循的规范、约定),

  1. 表格理解:temperature 温度值(控制ai模型返回的内容的准确度,温度值越低,回答的准确度越高)、top_p核采样(针对温度值的微调)、max_tokens(限制模型单次返回的内容长度,有点类似数据库限制某个字段的最大值效果)

    在这里插入图片描述

  2. 通俗理解:

    temperature=0.1(最小值,最适合代码和问题的标准回复):模型会 “保守输出”,优先用最常规的写法,代码几乎不会出错,适合生产场景。

    temperature=1.5(值越大,涉及逻辑代码的准确率越低):说好听点就是,模型会 “放飞自我”,说坏点用来生成功能代码功能的正确率不高,需要来回请求模型进行校准,当然开放问题的时候,适合找多种思路(我就没真正体验到过实际的好处,个人觉得问题的描述精确点,使用最小值的请求模型进行输出,避免浪费时间…)。

    top_p(针对温度调节后的微调) :是temperature温度的子集,当温度值调节完毕后,部分微调可以使用top_p,取值范围:0.1-0.9

    max_tokens(控制:输出的内容的长度):相当于给输出 “设上限”,既控制成本,也避免模型生成超长无效文本(我记得之前配置过开源龙虾成功后,在对话的时候让他帮忙生成一个功能代码,当时报了一个错误,就是输出控件太小限制了,最后就是修改配置文件中max_tokens的文本输出大小)。

  3. 以豆包实践,咨询

    在这里插入图片描述

  4. 实践结论:参考豆包的大致温度值,我们可以代码中尝试去看看效果…(当然也可以用一些边界值,看看ai的输出到底有多离谱)

    在这里插入图片描述

    1. 当你不配置这三个参数时,模型会直接使用平台 / 模型预设的内置默认值来生成内容,,,
三、node代码中,定义大模型的返回规范
  1. 指定模型的返回规范js

    // ai-client.js
    require('dotenv').config();
    const OpenAI = require('openai');
    
    // 初始化客户端(兼容所有OpenAI接口的模型)
    const openai = new OpenAI({
      apiKey: process.env.OPENAI_API_KEY,
      baseURL: process.env.OPENAI_BASE_URL,
    });
    
    /**
     * 通用AI调用函数,支持配置核心参数
     * @param {Object} options 调用参数
     * @param {string} options.prompt 给AI的提示词
     * @param {string} [options.model] 模型名称(默认取环境变量)
     * @param {number} [options.temperature=0.7] 温度参数
     * @param {number} [options.top_p=1] top_p参数
     * @param {number} [options.max_tokens=1024] 最大生成token数
     * @returns {Promise<string>} AI生成的文本
     */
    async function callAI({
      prompt,
      model = process.env.OPENAI_MODEL,
      temperature = 0.7,
      top_p = 1,
      max_tokens = 1024,
    }) {
      try {
        const response = await openai.chat.completions.create({
          model,
          messages: [{ role: 'user', content: prompt }],
          temperature,
          top_p,
          max_tokens,
        });
    
        return response.choices[0].message.content.trim();
      } catch (error) {
        console.error('AI调用失败:', error.response?.data || error.message);
        throw error;
      }
    }
    
    module.exports = { callAI };
    
  2. 测试3个核心参数不同组合配置的效果

    // test-params.js
    const { callAI } = require('./ai-client');
    
    // 测试用prompt:生成Vue3计数器组件
    const TEST_PROMPT = `请帮我写一个Vue3的计数器组件,包含:
    1. 显示当前计数
    2. 增加按钮
    3. 减少按钮
    4. 重置按钮
    请直接给代码,不需要额外解释`;
    
    // 不同参数组合的测试用例
    const testCases = [
      {
        name: '低temperature+低top_p(稳定模式)',
        params: { temperature: 0.1, top_p: 0.1, max_tokens: 1024 },
      },
      {
        name: '中temperature+中top_p(平衡模式)',
        params: { temperature: 0.5, top_p: 0.5, max_tokens: 1024 },
      },
      {
        name: '高temperature+高top_p(创意模式)',
        params: { temperature: 1.5, top_p: 0.9, max_tokens: 1024 },
      },
      {
        name: '低temperature+高top_p(稳定+细节变化)',
        params: { temperature: 0.2, top_p: 0.9, max_tokens: 1024 },
      },
    ];
    
    // 批量执行测试
    async function runTests() {
      for (const test of testCases) {
        console.log(`\n===== 测试: ${test.name} =====`);
        console.log(`参数: ${JSON.stringify(test.params)}`);
        console.log('正在生成代码...\n');
    
        try {
          const code = await callAI({
            prompt: TEST_PROMPT,
            ...test.params,
          });
          console.log('生成的代码:');
          console.log(code);
          console.log('\n----------------------------------------');
        } catch (error) {
          console.error(`测试失败: ${error.message}`);
        }
      }
    }
    
    // 运行测试
    runTests();
    
四、大模型的其他参数

在这里插入图片描述
除了 stream:流式输出(打字机效果),其余似乎没怎么用过…

五、调用模型,为什么都放在后端?为什么不直接在前端直接调用?

其实,只要能发送 HTTP 请求的框架,都能直接调用模型。但从安全角度「前端直接调用为什么不合适」

原因:避免模型的Key泄露
前端代码是对用户透明的(可通过 “查看网页源代码” 或抓包获取)。如果把Key 写在前端代码里,容易被盗用从而产生巨额费用的安全问题,当然还有前端直接使用也会出现跨域问题,

六、总结

学习制定模型返回的核心参数,旨在后续在项目中封装自己的 AI 工具,
可以任意切换国产大模型(DeepSeek、千问、豆包),的自由使用;

  1. 在模型返回代码的场景,温度值不能太高,过高会乱编语法、制造 bug;追求稳定一定要用低温度。
    安全问题
  2. API 密钥绝对不能明文写代码里、不能上传 github,必须用环境变量储存,防止被盗扣费。
    模型匹配
  3. max_tokens 不要设置太大,按需设置使用,避免多余消耗、增加费用。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐