- 2022 年 11 月,ChatGPT 成功面世,成为历史上用户增长最快的消费者应用。与 Google、FaceBook等公司不同,OpenAI 从初代模型 GPT-1 开始,始终贯彻只有解码器(Decoder-only)的技术路径,不断迭代升级。
-
可以看到,2022 年是 GPT 系列模型围绕 GPT-3、GPT-3.5 加速版本迭代的年份;
- 2022 年 3 月,基于 GPT-3 微调的 InstructGPT 发布,验证了人类反馈强化学习RLHF对模型输出对齐(alignment)的重要作用;
- 2022年4-6月,基于Codex、InstructGPT,OpenAI 加速迭代形成 GPT-3.5 模型;
- 2022 年 11 月,基于 GPT-3.5 微调的 ChatGPT 发布,成为 Instruction-tuning、RLHF、思维链等 LLM 相关技术的集大成者。
- ChatGPT与InstructGPT的训练方法基本一致,区别在于InstructGPT、ChatGPT分别基于GPT-3、GPT-3.5进行模型微调。
- InstructGPT具体可分为有监督微调、奖励模型训练、PPO 强化学习三个步骤。
- ChatGPT技术原理解析可参考:https://blog.csdn.net/v_JULY_v/article/details/128579457
- 2023年3月中旬,OpenAI正式对外发布GPT-4,增加了多模态(支持图片的输入形式),且ChatGPT底层的语言模型直接从GPT3.5升级到了GPT4。
-
ChatGPT 的发展不仅得益于 GPT 模型参数、训练数据的持续优化,也得益于各类 LLM 新技术的融会贯通,OpenAI 博采众长,加速 Instruction-tuning、RLHF、思维链等新技术在 GPT 系列模型中的深度应用,ChatGPT 是现有技术的集大成者。
-
我们今天从应用的角度,利用Open AI提供的API,学习下prompt(提示词)、Function Calling(外部函数调用)、RAG(检索增强生成)等相关内容。
- 由于众所周知的原因,OpenAI是不对国内用户正式开放的。所以如果你想使用ChatGPT或调用OpenAI的接口,要么搭梯子翻墙,要么使用国内代理。
- 为了方便,我这里使用国内的代理。代理网站会提供给你一个虚拟的API key,我们只需要把使用代理网站提供的url和key就行了,使用起来和原生的区别不大。
- 这里提供两个代理网站,可以自己注册下(首次注册应该会赠送一定的免费次数或金额,用多了之后可能就需要花钱了):
- https://devcto.com/
- https://api.zetatechs.com/
- 我们把相关信息配置到系统环境变量中,避免暴露在代码中:
- 然后,我们就可以进行OpenAi API的Hello World了:
- 从下图可以看到(https://platform.openai.com/docs/quickstart),和原生API几乎一样。
重要参数解释下:
-
model:用来指定使用哪个模型,例如:gpt-3.5-turbo
-
messages:传入大模型的prompt,prompt有三种角色:
- system:系统指令,用于初始化GPT行为,以及规定GPT的角色、背景和后续行为模式。system是主提示,可以进行更加详细的设置。
- user: 用户输入的信息。
- assistant: 机器回复,由 API 根据 system 和 user 消息自动生成的。
-
max_token:控制了输入和输出的总的token上限
-
temperature:在0和2之间选择采样温度。
- 值越高,如0.8,会使输出更随机;而值越低,如0.2,会使输出更集中和确定性更强。
- 通常建议修改这个值或,但不要同时修改两者。
- Temperature 用于调整模型的softmax输出层中预测词的概率。温度参数定义为在应用 softmax 函数之前用于调整 logits 的比例因子的倒数。
- 当temperature 设置为较低的值时,预测词的概率会变尖锐,这意味着选择最有可能的词的概率更高。这会产生更保守和可预测的文本,因为模型不太可能生成意想不到或不寻常的词。
- 另一方面,当temperature 设置为较高值时,预测词的概率被拉平,这意味着所有词被选择的可能性更大。这会产生更有创意和多样化的文本,因为模型更有可能生成不寻常或意想不到的词。
-
top_p:与 temperature 一起称为核采样的技术,如:0.1 表示仅考虑组成顶部 10% 概率质量的标记。
- tools: 模型可能调用的工具列表:
- 目前只支持函数作为工具。
- 用 JSON 描述函数,可以定义多个,由模型决定调用谁
- 最多支持 128 个函数。
- tool_choice: 控制模型是否调用工具(如果有的话):
- 意味着模型将不会调用任何工具,而是生成一条消息。
- 意味着模型可以选择生成消息或调用一个或多个工具。
- 意味着模型必须调用一个或多个工具。通过指定 可以强制模型调用该工具。
- 默认情况下,none 在没有工具存在时生效,auto 在存在工具时生效。
大模型目前存在下面的局限性:
- 训练数据不全面。由于训练数据的局限性,大模型无法涵盖所有信息,尤其是一些垂直或非公开数据。
- 知识更新滞后。大模型的训练周期很长,更新成本高昂,因此难以实时更新知识,通常滞后于最新信息。以GPT-3.5为例,其知识库截止于2022年1月,而GPT-4的则为2023年4月。
- 缺乏真正的逻辑推理能力。大模型表现出的逻辑和推理能力,实质上是基于训练文本的统计规律,而非真正的符合逻辑的思维。
- 这意味着其输出结果存在一定的不确定性,对于需要精确和确定结果的领域(如数学等)来说,可能难以满足要求。
- 例如,对于加法运算,大模型可能通过记忆100以内加法算式的统计规律,能够正确回答100以内的加法问题。但对于更大数字的加法,其结果就可能不准确,因为它并未真正理解加法的概念和原理。
然后,我们利用tools添加模型可能调用的工具列表
当大模型返回了需要调用的名称和参数之后,我们可以通过本地代码解析出来,然后再去调用相应函数
这里这使用高德地图的开放接口
- get_location_coordinate用于查询某个地点的地理坐标。
- search_nearby_pois用于查询地理坐标附近的某些信息(取决于用户输入的Keyword)
- 可以看到tool_calls已经识别到通过get_location_coordinate函数获取人民广场的经纬度
- 我们把回复信息加入到messages中,然后执行get_location_coordinate函数,获取相关接口结果
- 然后,get_location_coordinate执行结果给到大模型,大模型识别到下一步应该调用search_nearby_pois
- search_nearby_pois执行结果给到大模型,大模型识别到不需要调用其它函数,用自然语言组织了最终答案。
- 我们先创建一张mysql表,并插入几条数据:
- 定义获取模型回复的函数
- 定义tools_arr,利用json描述外部函数功能
- 定义外部函数,执行sql语句获取结果
- 最后,我们使用外部函数查询数据库,获取最终的结果
官网:https://platform.openai.com/docs/guides/prompt-engineering/prompt-engineering
-
OpenAI的文本生成模型(通常被称为大型语言模型)已经接受过自然语言、代码和图像的训练。这些模型根据输入生成文本输出。
-
这些模型的文本输入也被称为。设计提示本质上就是如何“编程”一个大型语言模型,通常通过提供说明或一些示例来实现。
-
这里介绍下OpenAI官网中提到的6大策略,这里描述的方法可以组合使用以获得更好效果。鼓励尝试实验,找到最适合的方法。
-
各类prompt最佳实践可以参考:各类prompt最佳实践
▶具体操作:
- 在查询中包含细节以获得更相关的答案(Include details in your query to get more relevant answers)
- 要求模型采用特定的角色或风格(Ask the model to adopt a persona)
- 使用分隔符清楚地指示输入的不同部分(Use delimiters to clearly indicate distinct parts of the input)
- 指定完成任务所需的步骤(Specify the steps required to complete a task)
- 提供示例(Provide examples)
- 指定输出的期望长度(Specify the desired length of the output)
- 要求模型按照我们指定的长度输出答案。
- 这个长度可以是单词、句子、段落、项目符号等的数量。
- 由于tokenizer的原因,中文的效果不是很准确,通常只是个大概,具体多少个字肯定是不精准的,但多少段这种效果就比较好。
语言模型可能会创造虚假答案,尤其是在询问特定主题或要求引用和URL时。提供参考文本可以帮助模型提供更准确的答案。
▶具体操作:
• 指导模型使用参考文本来回答问题。
• 要求模型在回答时引用参考文本中的内容。
一件复杂的任务交给我们来作,出错的概率也很大,模型也不例外。但如果把复杂的任务拆解一个个简单的子任务,那么出错的概率就会骤然降低。
▶具体操作:
- 使用意图分类来识别用户查询的最相关指令。
- 通过分析用户提问的目的,将这些提问分到不同的类别里。
- 这样做可以帮助系统更准确地理解用户想要什么,并给出更合适的回答。
-
对于需要长时间对话的应用,总结或过滤之前的对话。
- 模型的上下文长度有限,因此模型只能记住有限的内容。
- 可以用总结或过滤的方法处理以前的对话。这就像是把之前的长篇大论压缩成几句话的要点,或者挑出几个重要的信息点。
- 这样做能帮助保持对话的连贯性,同时避免因为对话太长而超出模型的记忆范围。
-
分段总结长文档,并递归地构建完整摘要。
- 模型具有固定的上下文长度,因此不能用于汇总长度超过上下文长度减去单个查询中生成的摘要长度的文本。
- 比如让模型总结一本书,基本都是超 Token 上限了,所以可以使用一系列查询来总结文档的每个部分
- 这个过程可以递归地进行,直到总结整个文档。
模型在立即回答问题时可能会犯更多的推理错误。要求模型在给出答案之前进行“思考链”可以帮助模型更可靠地推理出正确答案。
▶具体操作:
-
指导模型在急于得出结论之前先自行找出解决方案。
- 比如做数学题,我们都知道模型的数学能力很差,一会对一会错的,答案很随机,但是如果你让它先自己做一遍,再去判断对与不对,结果就会准确多了。
-
使用内部独白或一系列查询来隐藏模型的推理过程。
- 这个就像是模型在"心里"默默地思考问题,然后只告诉你最后的答案,而不是把思考的每一步都展示出来。
- 这样做的目的是让交流更简洁,只给你最重要的信息,避免让你看到复杂的思考过程而感到困惑。
- 简单来说,就是模型在给出答案之前先自己“思考”,但只跟你分享最终结论。
-
在之前的回答中询问模型是否遗漏了什么。
有时候结合使用AI和其他工具(比如数据搜索工具)可以得到更好的结果。利用其他工具的输出来补偿模型的不足。我们已经在外部函数调用时候,体会到了此功能。
例如,文本检索系统可以向模型提供相关文档信息,代码执行引擎可以帮助模型进行数学计算和运行代码。
▶具体操作:
-
使用基于嵌入的搜索来实现高效的知识检索。
-
使用代码执行来进行更准确的计算或调用外部API。
-
让模型访问特定的功能。
尝试不同的指令和方法,看看哪种效果最好,然后根据结果进行调整。
随着大语言模型(LLMs)能⼒的巨大进步,现阶段它们已经被实际采⽤并集成到许多系统中。这些能力的本质是一个自动化程序将从互联网等不可信来源获取,交由GPT等大模型处理。这个过程的安全性,也值得我们关注。
提示词破解:绕过 ChatGPT 的安全审查 (selfboot.cn)
ChatGPT安全风险 | 基于LLMs应用的prompt注入攻击
RAG 是一个增强大模型垂直领域能力和减少幻觉的通用方法论。
具体可以参考:大模型检索增强生成(RAG)最全综述
RAG的流程如下所示:
(1)本地知识通过切分、向量化保存到向量数据库中,供后续使用
(2)用户提问时,将用户提问用同样的方式向量化,然后去向量数据库中检索
(3)检索出相似度最高的k个切分段落
(4)将检索结果和用户的提问放到prompt模板中,组装成一个完整的prompt
(5)组装好的prompt给大模型,让大模型生成回答
- 我们这里为了简单,使用了langchain框架,这样处理离线部分就很简单了
- 离线部分,可提前生成好
(1)文档加载与分块
(2)分块数据灌入向量数据库 - 在线部分
(3)解析用户提问,用户提问向量化
(4)查询向量数据库,得到最相似的k个文本块
(5)使用得到的k个文本块和用户提问组装prompt模板
(6)询问大模型得到最终答案
Open AI的图像生成API提供了三种与图像交互的方法:
- 根据文本提示从头开始创建图像(DALL·E 3和DALL·E 2)
- 可以从文本提示中编辑现有图片(仅限DALL·E 2)
- 创建现有图像的变体(仅限DALL·E 2)
官网:https://platform.openai.com/docs/guides/images/image-generation
- 图像生成允许根据文本提示创建图像。使用DALL·E 3时,图像可以具有1024x1024、1024x1792或1792x1024像素的大小。
- 默认情况下,图像以标准质量生成(standard),使用DALL·E 3时,您可以设置质量为以获得增强的细节。不过,方形、标准质量的图像生成速度最快。
- 使用DALL·E 3一次获取1张图像
- 而使用DALL·E 2,可以通过参数n一次请求最多10张图像。
-
模型现在会接受提供的默认提示,并出于安全原因自动重写它,并添加更多细节(通常更详细的提示会产生更高质量的图像)。
-
虽然目前无法禁用这个功能,但可以使用提示功能,通过在提示中添加以下内容来获得更接近请求的图像输出:。
-
更新后的提示可在数据响应对象的revised_prompt字段中看到。
-
每个图像可以通过response_format参数返回为URL或base64数据。
-
URL将在一小时后过期。
-
历史上,语言模型系统受限于只能接收单一输入模态,即文本。
-
而GPT-4o和GPT-4 Turbo都具有视觉能力,这些模型可以接收图像并回答有关它们的问题。
-
官网:Vision - OpenAI API
- 如果您在本地拥有一张或一组图像,可以用base64编码格式将其传递给模型
- 模型能够,两种形式都是base64编码格式或图像URL。
- 模型将处理每个图像,并使用来自所有图像的信息来回答问题。
-
通过控制具有三个选项()的细节参数,您可以控制模型处理图像并生成其文本理解的方式。默认情况下,模型将使用设置,它将查看图像输入大小并决定是否应该使用设置。
-
将启用“low res”模式。模型将接收图像的低分辨率512px x 512px版本,并使用85个tokens表示图像。这使API能够返回更快的响应,并为不需要高细节的用例消耗更少的输入令牌。
-
将启用“high res”模式,该模式首先允许模型查看低分辨率图像(使用85个tokens),然后使用170个tokens对每个512px x 512px的区域进行详细的裁剪。
5.3.1 文本转语音
-
可以通过提供所选语言的输入文本来生成这些语言的口头语音。
-
TTS 模型通常遵循 Whisper 模型的语言支持,具体支持的语言如下:
南非荷兰语、阿拉伯语、亚美尼亚语、阿塞拜疆语、白俄罗斯语、波斯尼亚语、保加利亚语、加泰罗尼亚语、中文、克罗地亚语、捷克语、丹麦语、荷兰语、英语、爱沙尼亚语、芬兰语、法语、加利西亚语、德语、希腊语、希伯来语、印地语、匈牙利语、冰岛语、印度尼西亚语、意大利语、日语、卡纳达语、哈萨克语、韩语、拉脱维亚语、立陶宛语、马其顿语、马来语、马拉地语、毛利语、尼泊尔语、挪威语、波斯语、波兰语、葡萄牙语、罗马尼亚语、俄语、塞尔维亚语、斯洛伐克语、斯洛文尼亚语、西班牙语、斯瓦希里语、瑞典语、他加禄语、泰米尔语、泰语、土耳其语、乌克兰语、乌尔都语、越南语和威尔士语。
5.3.2 语音转文本
- 我们将刚才的output.mp3转为文本
- 文件上传目前限制为 25 MB,支持以下输入文件类型:mp3、mp4、mpeg、mpga、m4a、wav 和 webm。
- 可以将音频转录成音频本身的任何语言
GPT4o使用可以参考官网:Introduction to gpt-4o | OpenAI Cookbook
可以看到,对于视频的处理目前还是需要三步走:
- Visual Summary
- Audio Summary
- Visual + Audio Summary