当前位置: 首页 > ds >正文

【AI】小参数,大影响:从OpenAI参数看AI开发挑战

欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。

目录

  • 引言
  • 如何输入、与大模型交互?
  • 如何控制模型的随机性与创造性?
    • 二选一的temperature与top_p
      • temperature
      • top_p
  • 如何控制输出的长度?
    • max_tokens
  • 如何减少重复性,提高新颖度
    • presence_penalty
    • frequency_penalty
  • 如何精确控制生成结束?
    • stop
  • 如何一次性获取多个候选输出?
    • n
  • 如何实时获取生成内容?
    • stream
  • 总结

引言

当我们调用一个大模型时,那些API的参数都干什么用的呢?
只是提供key与选择模型就够了么?为什么会有那些参数?
下面,我们以OpenAI的开发为例,一起了解一下这些参数是做什么、为什么。

本来从DeepSeek入手的,但是官网显示不支持很多参数,也就算了。

![[【AI入门】从DeepSeek开发看AI开发有哪些值得注意的问题.png]]

  • API文档
    OpenAI Platfrom

如何输入、与大模型交互?

消息列表messages是与模型进行对话的主要输入。它是一个对象列表,每个对象代表对话中的一条消息。

  • 结构: 每个消息对象包含 role (角色) 和 content (内容)。
    • role: 可以是:
      • “system”: 用于设置助手的行为和个性,通常放在消息列表的开头,提供高级指令。
      • “user”: 代表用户的输入。
      • “assistant”: 代表模型之前的回复。通过提供历史对话,模型可以理解上下文。
      • “tool” (较新,用于Function Calling/Tool Calling): 代表工具调用的结果。
curl https://api.openai.com/v1/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"model": "gpt-4.1","messages": [{"role": "developer","content": "You are a helpful assistant."},{"role": "user","content": "Hello!"}]}'

如何控制模型的随机性与创造性?

如何让模型的输出在“完全可预测/事实性”和“富有想象力/多样性”之间找到平衡?如何避免模型输出过于平淡重复,或者过于天马行空以至于胡言乱语?

二选一的temperature与top_p

控制模型输出随机性有两个参数:temperature与top_p。通常是2选1,两个都选行为会难以预测。

temperature

可以通过 temperature 控制生成文本的随机性创造性。它影响下一个词选择的概率分布。

取值范围: 通常在 0 到 2 之间,对话通常是1。

  • 较低的值 (e.g., 0.0 - 0.3): 输出更确定、更集中、更可预测。模型倾向于选择概率最高的词。适用于需要事实性、精确性、重复性的任务(如代码生成、数据提取)。
  • 较高的值 (e.g., 0.7 - 1.0): 输出更随机、更多样化、更具创造性。模型会给概率较低的词更多被选中的机会。适用于创意写作、头脑风暴、生成多种选项。
  • 极高的值 (e.g., > 1.0): 可能导致输出非常随机,甚至胡言乱语、不连贯。

top_p

另一种控制输出随机性的方法,从概率最高的词开始累加,直到累加的概率达到 top_p 设定的阈值,然后模型只从这个核心词汇集合中进行采样。
通常是1。

  • 取值范围: 0 到 1 之间。
    • 较低的值 (e.g., 0.1): 只有概率最高的极少数词被考虑,输出非常确定和保守。
    • 较高的值 (e.g., 0.9): 考虑的词汇范围更广,输出更多样化。
    • 值为 1 时,相当于不使用 top_p 过滤(除了必须的概率排序)。

如何控制输出的长度?

如何确保模型的回复不会太短以至于信息不完整,也不会太长以至于冗余或超出预算?如何限制API调用的token消耗?

token:token 是文本处理的基本单位,通常代表一个单词、标点符号或单词的一部分。也是大模型计费的基本单位。
分为"输入token"与"输出token"。分别对应用户发送给模型的提示(prompt)或上下文内容的 token ,与 模型生成的响应的 token 数。
其他操作如嵌入生成、RAG 检索等也会消耗token。

max_tokens

设定模型在当前这次调用中,可以生成的最大token数量。不同API或版本对token的范围限定不一样,有些版本指的是“输出token”,不包括“输入token”。

如何减少重复性,提高新颖度

模型有时会陷入循环,不断重复相同的词语、短语或观点。如何让模型引入新的信息或使用不同的表达方式?
相关参数有presence_penalty与frequency_penalty。

presence_penalty

对已经在已生成文本中出现过的token施加一次性的惩罚,降低它们再次被选择的概率。一旦一个token出现过,后续无论出现多少次,受到的基础惩罚是一样的。

  • 取值范围: -2.0 到 2.0。正值会根据token的现有频率来降低其再次出现的可能性。
    presence_penalty有助于让模型避免简单重复已经说过的词。

frequency_penalty

根据token在已生成文本中出现的频率来惩罚它。一个token出现得越频繁,它再次被选择的概率就越低。

  • 取值范围: -2.0 到 2.0。正值会根据token的现有频率来降低其再次出现的可能性。
    相比 presence_penalty,frequency_penalty更侧重于减少高频词的过度使用,使得文本不那么单调。

当temperature很低时,模型创造性与随机性低,模型本身会倾向于重复高概率词。此时这些惩罚参数可能效果更明显。

如何精确控制生成结束?

模型有时会生成超出期望范围的内容,或者在回答完问题后继续“自言自语”。如何让模型在特定的点或模式出现时停止生成?
使用stop参数。

stop

提供一个或多个字符串序列。当模型生成的内容匹配到其中任何一个停止序列时,它会立即停止进一步生成。

  • 取值: 一个字符串,或最多包含4个字符串的列表。
    确保输出在达到某个逻辑断点(如换行符、特定标识符、对话角色切换)时结束,使输出更整洁、符合预期格式。
    对于需要结构化输出或模拟特定对话流程的应用非常关键。

如何一次性获取多个候选输出?

对于同一个输入,有时希望模型能提供多种不同的回答或创意,以便从中选择最佳的,或者进行多样性展示。
使用参数n。

n

指定为每个输入prompt生成多少个独立的、完整的候选响应(choices)。
取值: 一个正整数,默认为1。
n > 1 时,API会返回多个版本的输出。这会显著增加token消耗(成本变为 n 倍),因为每个候选都是独立生成的。

如何实时获取生成内容?

对于较长的生成任务,用户可能需要等待较长时间才能看到完整结果,体验不佳。如何让用户能像打字一样逐步看到生成的内容?
使用stream参数。

stream

设置为 true 时,API会以服务器发送事件 (Server-Sent Events, SSE) 的方式,逐步地、一块一块地返回生成的token,而不是等待整个响应生成完毕后再返回。

  • 取值: true 或 false (默认)。
    可以显著改善用户体验,尤其是在交互式应用或需要快速反馈的场景。用户可以即时看到输出,而不是长时间等待。
    这是一个关于“如何传递结果”的参数,与“生成什么结果”的参数(如temperature, max_tokens等)是正交的。

总结

![[【AI入门】从OpenAI开发常用参数看AI开发有哪些值得注意的问题.png]]

http://www.xdnf.cn/news/8611.html

相关文章:

  • Python打卡训练营学习记录Day34
  • 文章记单词 | 第104篇(六级)
  • MySQL --- 事务
  • 【Linux系列】EVS 与 VBD 的对比
  • 文章记单词 | 第103篇(六级)
  • 永磁同步电机参数辨识算法--拓展卡尔曼滤波参数辨识
  • 探索微观世界的“度量衡”:显微测量仪器解析
  • 《C++20新特性全解析:模块、协程与概念(Concepts)》
  • Python包管理器:uv
  • 目前,Navicat 17.1 版本的用户管理功能无法使用,如何回退到上一个版本?关于之前提到的转置功能?
  • Three.js 中的 Octree(八叉树)详解
  • android studio第一次编译apk,用时6分钟
  • 安装openEuler操作系统
  • 49页 @《人工智能生命体 新启点》中國龍 原创连载
  • ResNet、MobileNet、YOLOv3、DeepLabv3+ 比较
  • 数据库表设计题目
  • OpenCV CUDA 模块图像过滤------创建一个线性滤波器(Linear Filter)函数createLinearFilter()
  • 【Golang笔记03】error、panic、fatal错误处理学习笔记
  • Mysql逻辑架构
  • leetcode-hot-100 (普通数组)
  • 数据结构(6)线性表-队列
  • 计算机系统结构 -第三章:指令集并行 -1
  • Z世代消费新图鉴:从盲盒经济到可持续浪潮,解码年轻世代的消费密码
  • 方洪波摸着雷军,“甩掉”小米
  • Linux里more 和 less的区别
  • 怎么判断一个Android APP使用了flutter 这个跨端框架
  • 预处理越复杂越好?评估脑电预处理在深度学习应用中的作用
  • JavaScript关键字完全解析:从入门到精通
  • Foldseek快速蛋白质结构比对
  • HarmonyOS开发-应用间跳转