首页
关于
翻译
留言
统计
搜索
1
以太坊简介
742 阅读
2
搭建 OpenAI 代理
663 阅读
3
第 4 章 创建您的第一个 React 组件
550 阅读
4
如何读懂编译后的 JavaScript 代码
526 阅读
5
第 9 章 使用 Jest 测试 React 应用
477 阅读
JavaScript
TypeScript
后端
Web
移动
运维
杂项
登录
Search
标签搜索
React
翻译
Vue
组件
Angular
工程化
库
Hook
框架
优化
路由
Node.js
Flash
部署
算法
可视化
Debug
测试
兼容
Web3
Flying
累计撰写
267
篇文章
累计收到
2
条评论
首页
栏目
JavaScript
TypeScript
后端
Web
移动
运维
杂项
页面
关于
翻译
留言
统计
搜索到
7
篇
AI
相关的结果
2023-05-08
OpenAI 指南——语音转文本
语音转文本 API 提供了两个端点,分别是转录和翻译,基于我们最先进的开源 large-v2 Whisper 模型。它们可以用于既将音频转录成所处语言和也可以将音频翻译成英语并转录。本文我们将讲述转录和翻译两种语音转文本方式的用法及其相应的API。
2023年05月08日
176 阅读
0 评论
1 点赞
2023-04-08
搭建 OpenAI 代理
目前在国内访问 OpenAI 还是需要“科学”上网的,更不用说调用 OpenAI API。所以我尝试用 Node.js 写了个代理小程序,并部署在 Codesandbox 上,然后就可以在本地用习惯的前后端分离的方式调用 OpenAI API。使用比较简单,特写本文和大家分享。好用话请帮忙 Star 一下我的 repo。获取 API 密钥本文假设我们已经注册了 OpenAI 账号,如果还没有创建 API 密钥,可以如下图进行操作。OpenAI 注册文章一大堆,最关键的是要输入一个可用的手机号完成验证,没有的话可租用,我是花了 12 卢布,不到人民币 2 元,所以自己动动手,真没必要花几十元买奸商的账号。代理实现其实多数语言都能模拟客户端调用实现类似网络爬虫,这里仅以Node.js为例。实现代码比较简单,主要是用 express 和 http-proxy-middleware 实现的。// ... app.use(express.static(path.join(__dirname, "public"))); app.use( "/v1/", createProxyMiddleware({ target: "https://api.openai.com", changeOrigin: true, onProxyReq: (proxyReq, req, res) => { console.log(req.originalUrl); proxyReq.setHeader("Authorization", `Bearer ${process.env.API_KEY}`); }, onProxyRes: (proxyRes, req, res) => { proxyRes.headers["Access-Control-Allow-Origin"] = "*"; proxyRes.headers["Access-Control-Allow-Headers"] = "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"; } }) ); // ...完整示例代码参看 repo 中的 index.js。createProxyMiddleware 的用法就不细说了。有几点需要注意:onProxyReq 事件回调中我们设置了请求标头 Authorization,将 API 密钥保存到了代理代码中,这样前端调用时就不用加代理验证了。但问题来了,我们的将代码部署到国外主机上安全吗?这就担心过头了。一来目前注册一个账号就买一根冰棒的钱,二来很多云平台可以使用环境变量配置 API 密钥。幸运的是,Codesandbox 就可以。onProxyReq 事件回调中我们通过设置了响应标头 Access-Control-Allow-Origin 为 *,这意味着任何人都可以访问我们的代理服务。当然如果不想被“白嫖”,我们可以根据需要固定几个IP。本地调试时,记得“科学”上网,还要将 ${process.env.API_KEY} 替换成你自己的 KEY。出于安全,官方不建议使用前后端分离方式开发 OpenAI Web 应用,我们搭建的代理刚好能回避这个问题。验证当然最好是用页面来验证,以下代码了演示怎样使用 axios 调用我们之前搭建的代理服务。 axios.post('http://localhost:3000/v1/completions', { model: 'text-davinci-003', max_tokens: 1024, prompt: prompt }) .then(response => { // ... }) .catch(error => { // ... })完整示例代码参看 repo 中的 public/index.html,这应该算是最简单的纯前端 OpenAI 应用了。和普通 Ajax 调用没啥区别。当然也可以使用官方提供的 openai 之类的库,只要将 basePath 设置代理服务地址(如本示例中的 http://localhost:3000/v1)即可。Node.js 版本的 openai 的其实是依赖 axios 的,社区的各种库也只是基于某种语言或业务场景对 OpenAI API 的封装,所以看看 OpenAI API 文档没啥难度。访问不了文档的可以让 ChatGPT 来帮忙?。API 常见的就是 Ajax 请求了。OpenAI API 也不例外。后端对界面不太关注的同学用 curl、postman 之类的工具也可以验证。免费部署代码测试好后还要部署在国外才行。目前,免费部署 Node.js 应用的云平台并不是很多,推荐 Codesandbox。CodesandboxCodesandbox 简直就是一个神器,我们不仅可以使用它来写代码,还能在上面托管应用,甚至是 Node.js 应用。登录 Codesandbox 账号没有 Codesandbox 账号的话最好关联自己的 Github 注册一个账号,以后我们就可以在这两个平台之间同步自己的项目了,非常方便。新建工程单击 “Create”,选择一个 Node.js 模板,新建 Node.js 工程。添加依赖在 package.json 中添加以下依赖:"dependencies": { "express": "^4.18.2", "http-proxy-middleware": "^2.0.6" }替换代码将 index.js 中的代码替换为完整的代理代码。可以从我的 repo 获取。如果觉得前面几步操作麻烦,可以直接 Fork 一下我的示例项目,然后继续。配置 API 密钥左上角菜单 > “Project Settings” > “Env Variables”,填入先前生成的 API 密钥,如下图所示:重启服务左上角菜单 > “Restart Sandbox”重启服务,若能在右侧看到以下预览页面说明部署没大问题。预览页面地址栏显示的就是最终生成的代理服务地址。如本项目的 https://ge68te-3000.csb.app。如果不打算分享服务,可以将 CodeSandbox 项目移动到草稿中私有化,以提高服务的安全性。其他选择VencelVencel 部署的应用目前国内要“科学”上网才可以访问,不推荐。Netlify国内倒是能访问,不过官方不支持 Express 模板,要用 Netlify function“曲线救国”,操作起来有些麻烦。还有部署生成服务地址也感觉怪怪的,所以也不推荐。其他平台像 AWS、腾讯云等平台也可以部署 Node.js 项目,但有一定的免费期限。我们的程序很简单,有点杀鸡用牛刀的感觉。当然最好的办法是使用 VPN 访问或搞到国外主机,不过俺是穷人。?总结直接 Fork我的示例项目使用环境变量配置 API 密钥重启服务就搭建好了,很简单吧?以前老觉得 AI 高深莫测,打通 OpenAI API 的“任督二脉”之后, 我们应该对 AI 开发充满信心。
2023年04月08日
663 阅读
0 评论
2 点赞
2023-04-04
OpenAI 指南——图像生成
我们将学习如何使用我们的 DALL·E 模型生成或操作图。图像 API 提供了三种与图像交互的方法:根据文本提示从头开始创建图像、根据新的文本提示创建现有图像的编辑、 创建现有图像的变体……
2023年04月04日
147 阅读
0 评论
2 点赞
2023-03-09
OpenAI 指南——聊天完成
使用 OpenAI Chat API,你可以使用 gpt-3.5-turbo 和 gpt-4 创建自己的应用程序,执行以下操作:编写电子邮件或其他文章编写 Python 代码回答一组文档的问题创建会话代理给你的软件自然语言界面范围广泛的主题辅导翻译语言模拟视频游戏的角色等等本指南介绍了如何调用基于聊天的语言模型的 API,并分享了获得良好结果的技巧。你还可以在 OpenAI Playground 中使用新的聊天格式进行实验。介绍聊天模式接收一系列信息作为输入,并返回一个模型生成的信息作为输出。虽然聊天格式旨在使得多轮对话容易,但它同样适用于不包含对话的单轮任务(如那些先前由跟随指令的模型来服务的,如 text-davinci-003)。一个 API 调用例子如下:# Note: you need to be using OpenAI Python v0.27.0 for the code below to work import openai openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Who won the world series in 2020?"}, {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, {"role": "user", "content": "Where was it played?"} ] )主要输入是 messages 参数,其中必须是一个消息对象数组的消息,其中每个对象有一个角色(“系统”,“用户”或“助理”)和内容(消息的内容)。对话可以只有 1 条消息,也可以填满很多页。通常,对话格式化为先有系统消息,然后是交替的用户和助理消息。系统消息有助于设置助理的行为。在上面的示例中,助理指示“你是一个有用的助手”。gpt-3.5-turbo-0301 不会一直关注系统消息。未来的模型将经过培训,以更强调系统消息。用户消息帮助指导助理,它们可以由应用程序的最终用户生成,也可以由开发人员设置为说明。助理消息有助于存储先前的响应。它们也可以由开发人员编写,以帮助示例所需的行为。当用户指令引用先前消息时,包括会话历史有助于。在上面的示例中,用户最后一个问题“Where was it played?” 只有在先前消息的背景下才有意义。因为模型对过去的请求没有记忆,所有相关信息都必须通过对话提供。如果对话不适合模型的令牌限制,则需要以某种方式缩短。响应格式API 响应示例如下所示 :{ 'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve', 'object': 'chat.completion', 'created': 1677649420, 'model': 'gpt-3.5-turbo', 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87}, 'choices': [ { 'message': { 'role': 'assistant', 'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'}, 'finish_reason': 'stop', 'index': 0 } ] }在 Python 中,可以通过 response['choices'][0]['message']['content'] 提取助手的回复。每个响应都将包含一个 finish_reason。 finish_reason 的可能值是:top:API 返回完整的模型输出length:由于 max_tokens 参数或令牌限制而导致不完整的模型输出content_filter:由于我们的内容过滤器标志而省略内容null:API 响应仍在进行中或不完整管理令牌语言模型通过一种叫做令牌的块来读取文本。在英语中,令牌可以是一个字符长,也可以是一个单词长(例如,a 或 apple),在某些语言中,令牌甚至可以比一个字符短,甚至比一个单词长。例如,字符串“ChatGPT is great!”被编码为 6 个令牌:["Chat", "G", "PT", " is", " great", "!"]。API 调用中的令牌总数会产生以下影响:API 调用的成本,因为每个令牌你都要付费API 调用所花费的时间,因为写入更多令牌需要更多时间API 调用是否可以工作,因为总令牌必须低于模型的最大限制(gpt-3.5-turbo-0301 的总令牌数为 4096)输入和输出令牌均计入此数量。例如,如果你的 API 调用在消息输入中使用了 10 个令牌,你在消息输出中收到了 20 个令牌,你将被收取 30 个令牌的费用。要查看 API 调用使用了多少令牌,请检查 API 响应中的 usage 字段(例如,response['usage'] ['total_tokens'])。gpt-3.5-turbo 和 gpt-4 等聊天模型与其他模型一样使用令牌,但由于它们基于消息的格式,更加难以计算对话使用的令牌数量。{collapse}{collapse-item label="深入探索——计算聊天 API 调用使用的令牌数量"}下面是一个示例函数,用于计算传递给gpt-3.5-turbo-0301的消息的令牌数。将消息转换为令牌的确切方式可能会因模型而异。因此,当发布未来的模型版本时,此函数返回的答案可能仅为近似值。ChatML 文档解释了如何使用 OpenAI API 将消息转换为令牌,并可能对编写自己的函数有用。def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301"): """Returns the number of tokens used by a list of messages.""" try: encoding = tiktoken.encoding_for_model(model) except KeyError: encoding = tiktoken.get_encoding("cl100k_base") if model == "gpt-3.5-turbo-0301": # note: future models may deviate from this num_tokens = 0 for message in messages: num_tokens += 4 # every message follows <im_start>{role/name}\n{content}<im_end>\n for key, value in message.items(): num_tokens += len(encoding.encode(value)) if key == "name": # if there's a name, the role is omitted num_tokens += -1 # role is always required and always 1 token num_tokens += 2 # every reply is primed with <im_start>assistant return num_tokens else: raise NotImplementedError(f"""num_tokens_from_messages() is not presently implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")接下来,创建一个消息并将其传递给上面定义的函数,以查看令牌计数,这应该与 API 使用参数返回的值匹配:messages = [ {"role": "system", "content": "You are a helpful, pattern-following assistant that translates corporate jargon into plain English."}, {"role": "system", "name":"example_user", "content": "New synergies will help drive top-line growth."}, {"role": "system", "name": "example_assistant", "content": "Things working well together will increase revenue."}, {"role": "system", "name":"example_user", "content": "Let's circle back when we have more bandwidth to touch base on opportunities for increased leverage."}, {"role": "system", "name": "example_assistant", "content": "Let's talk later when we're less busy about how to do better."}, {"role": "user", "content": "This late pivot means we don't have time to boil the ocean for the client deliverable."}, ] model = "gpt-3.5-turbo-0301" print(f"{num_tokens_from_messages(messages, model)} prompt tokens counted.") # Should show ~126 total_tokens确认我们上面的函数生成的数字与 API 返回的数字相同,请创建一个新的聊天完成:# example token count from the OpenAI API import openai response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0, ) print(f'{response["usage"]["prompt_tokens"]} prompt tokens used.'){/collapse-item}{/collapse}要查看文本字符串中有多少个令牌,而无需调用 API,请使用 OpenAI 的 tiktoken Python 库。示例代码可以在 OpenAI Cookbook 的指南中找到,该指南介绍了[如何使用 tiktoken 计数令牌]。传递给 API 的每条消息都会消耗内容、角色和其他字段中的令牌数量,此外还有一些额外的格式设置。这可能会在将来有所改变。如果一个对话中的令牌太多,以至于无法适应模型的最大限制(例如,gpt-3.5-turbo 超过 4096 个令牌),你将不得不截断、省略或缩小文本,直到它适合为止。 请注意,如果从消息输入中移除消息,模型将丢失所有这方面的知识。同样注意,非常长的对话更有可能收到不完整的回复。 例如,gpt-3.5-turbo 的对话长度为 4090 个令牌,只给 6 个令牌,它的回复就会截断。指示聊天模型指示模型的最佳实践可能会随着模型版本的更改而改变。 接下来的建议适用于 gpt-3.5-turbo-0301,可能不适用于未来的模型。许多对话都以系统消息开头,以友好指示助手。例如,这是用于 ChatGPT 的一条系统消息:你是 ChatGPT,由 OpenAI 训练的大型语言模型。尽可能简洁地回答。知识截断:{knowledge_cutoff} 当前日期:{current_date}通常,gpt-3.5-turbo-0301 对系统消息不会予以高度重视,因此最好经常将重要指令放置在用户消息中。如果模型不能生成你想要的输出,请自由迭代和尝试潜在的改进。你可以尝试以下方法:将你的指令变得更具体指定你想要的答案的格式让模型通过一步一步的思考,或者在得到答案前先讨论利弊要获得更多的工程性思路,请阅读 OpenAI Cookbook 手册中的技术提高可靠性的指南。在系统消息外, temperature 和 max tokens 是开发者们可以影响聊天模型输出的多个选项之二。 对于 temperature,像 0.8 这样的较高值将使输出更随机,而像 0.2 这样的较低值将使其更集中和确定性。 对于 max tokens,如果你希望将响应限制为某个长度,则可以将 max tokens 设置为任意数字。 例如,如果你将最大令牌值设置为 5,则会出现问题,因为输出将被截断,并且结果对用户来说将没有意义。聊天 vs 完成因为 gpt-3.5-turbo 的性能与 text-davinci-003 类似,但每个令牌的价格低 10%,我们建议大多数情况下使用 gpt-3.5-turbo。对于许多开发人员来说,转变就像重写和重新测试提示一样简单。例如,如果你使用以下补全提示将英语翻译成法语:Translate the following English text to French: "{text}"相同的聊天对话可能如下所示:[ {"role": "system", "content": "You are a helpful assistant that translates English to French."}, {"role": "user", "content": 'Translate the following English text to French: "{text}"'} ]或者仅仅是用户消息:[ {"role": "user", "content": 'Translate the following English text to French: "{text}"'} ]常见问题gpt-3.5-turbo 可以微调吗?不可以,2023 年 3 月 1 日起,你只能微调基础 GPT-3 模型。要了解更多关于如何使用微调模型的信息,请参阅微调指南。你们会保留传入 API 的数据吗?从 2023 年 3 月 1 日起,我们会保留你的 API 数据 30 天,但不再使用通过 API 发送的数据来改善我们的模型。更多信息请参阅我们的数据使用政策。添加一个修改层如果你想向聊天 API 的输出添加一个修改层,你可以按照我们的修改指南来防止显示违反 OpenAI 用法政策的内容。
2023年03月09日
112 阅读
0 评论
1 点赞
2023-02-28
OpenAI 指南——文本完成
完成端点可用于各种任务。 它为我们的任何[模型](https://platform.openai.com/docs/models)提供了一个简单而强大的接口。 您输入一些文本作为提示,模型将生成一个文本完成,该文本完成尝试匹配您给定的任何上下文或模式。 例如,如果您给API提示“正如笛卡尔所说,我认为,因此”,它将以高概率返回完成“我是”。
2023年02月28日
134 阅读
0 评论
1 点赞
1
2