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

Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型

作者: 来自 Elastic David Hope

ChatGPT 现在非常火爆,甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员,我对这项技术的可能性感到非常兴奋。 我看到的情况是,基于 ChatGPT 的解决方案将会呈指数级增长,人们将需要监控这些解决方案。

由于这是一项相当新技术,我们不想让专有技术给我们闪亮的新代码带来负担,不是吗? 不,我们不会,这就是为什么我们将在本博客中使用 OpenTelemetry 来监控我们的 ChatGPT 代码。 这对我来说尤其重要,因为我最近创建了一项通过 Zoom 通话生成会议记录的服务(需要使用 OpenAI 服务)。 如果我要任意使用这个功能,需要花费多少钱以及如何确保它可用?

OpenAI API 来救援

毫无疑问,OpenAI API 非常棒。 它还为我们提供了对每个 API 调用的每个响应中如下所示的信息,这可以帮助我们了解我们所收取的费用。 通过使用 OpenAI 在其网站上发布的 token 数量、模型和定价,我们可以计算成本。 问题是,我们如何将这些信息输入到我们的监控工具中?

{"choices": [{"finish_reason": "length","index": 0,"logprobs": null,"text": "\n\nElastic is an amazing observability tool because it provides a comprehensive set of features for monitoring"}],"created": 1680281710,"id": "cmpl-70CJq07gibupTcSM8xOWekOTV5FRF","model": "text-davinci-003","object": "text_completion","usage": {"completion_tokens": 20,"prompt_tokens": 9,"total_tokens": 29}
}

OpenTelemetry 来救援

OpenTelemetry 确实是一项出色的工作。 多年来,它得到了如此多的采用和投入,似乎真的已经到了我们可以将其称为 “可观察性 Linux” 的地步。 我们可以使用它来记录日志、指标和跟踪,并以供应商中立的方式将它们放入我们最喜欢的可观察性工具中 - 在本例中为 Elastic Observability。

借助 Python 中最新最好的 otel 库,我们可以自动检测外部调用,这将帮助我们了解 OpenAI 调用的执行情况。 让我们先看一下我们的示例 Python 应用程序,它实现了 Flask 和 ChatGPT API,并且还具有 OpenTelemetry。 如果你想亲自尝试一下,请查看本博客末尾的 GitHub 链接并按照以下步骤操作。

设置 Elastic Cloud 帐户(如果你还没有)

  1. 请访问 https://www.elastic.co/cloud/elasticsearch-service/signup 注册为期两周的免费试用。
  2. 创建部署。

登录后,单击添加集成。

单击 APM integrations

然后向下滚动以获取此博客所需的详细信息:

请务必设置以下环境变量,将变量替换为你从上面的 Elastic 和此处的 OpenAI 获得的数据,然后在命令行上运行这些 export 命令。

export OPEN_AI_KEY=sk-abcdefgh5ijk2l173mnop3qrstuvwxyzab2cde47fP2g9jij
export OTEL_EXPORTER_OTLP_AUTH_HEADER=abc9ldeofghij3klmn
export OTEL_EXPORTER_OTLP_ENDPOINT=https://123456abcdef.apm.us-west2.gcp.elastic-cloud.com:443

并安装以下 Python 库:

pip3 install opentelemetry-api
pip3 install opentelemetry-sdk
pip3 install opentelemetry-exporter-otlp
pip3 install opentelemetry-instrumentation
pip3 install opentelemetry-instrumentation-requests
pip3 install openai
pip3 install flask

下面是我们用于示例应用程序的代码。 在现实世界中,这将是你自己的代码。 所有这一切都是通过以下消息调用 OpenAI API:“Why is Elastic an amazing observability tool?”

import openai
from flask import Flask
import monitor  # Import the module
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
import urllib
import os
from opentelemetry import trace
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.requests import RequestsInstrumentor# OpenTelemetry setup up code here, feel free to replace the “your-service-name” attribute here.
resource = Resource(attributes={SERVICE_NAME: "your-service-name"
})
provider = TracerProvider(resource=resource)
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint=os.getenv('OTEL_EXPORTER_OTLP_ENDPOINT'),headers="Authorization=Bearer%20"+os.getenv('OTEL_EXPORTER_OTLP_AUTH_HEADER')))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
RequestsInstrumentor().instrument()# Initialize Flask app and instrument itapp = Flask(__name__)
# Set OpenAI API key
openai.api_key = os.getenv('OPEN_AI_KEY')@app.route("/completion")
@tracer.start_as_current_span("do_work")
def completion():response = openai.Completion.create(model="text-davinci-003",prompt="Why is Elastic an amazing observability tool?",max_tokens=20,temperature=0)return response.choices[0].text.strip()if __name__ == "__main__":app.run()

使用 Monkey patching (猴子补丁)

在 monitor.py 代码中,你会看到我们做了一些叫做 “Monkey Patching” 的事情。 猴子修补是 Python 中的一项技术,你可以通过修改类或模块的属性或方法在运行时动态修改类或模块的行为。 猴子补丁允许你更改类或模块的功能,而无需修改其源代码。 当你需要修改你无法控制或无法直接修改的现有类或模块的行为时,它会很有用。

我们在这里要做的是修改 “Completion” 调用的行为,以便我们可以 “窃取” 响应指标并将它们添加到我们的 OpenTelemetry 范围中。 你可以在下面看到我们如何做到这一点:

def count_completion_requests_and_tokens(func):@wraps(func)def wrapper(*args, **kwargs):counters['completion_count'] += 1response = func(*args, **kwargs)token_count = response.usage.total_tokensprompt_tokens = response.usage.prompt_tokenscompletion_tokens = response.usage.completion_tokenscost = calculate_cost(response)strResponse = json.dumps(response)# Set OpenTelemetry attributesspan = trace.get_current_span()if span:span.set_attribute("completion_count", counters['completion_count'])span.set_attribute("token_count", token_count)span.set_attribute("prompt_tokens", prompt_tokens)span.set_attribute("completion_tokens", completion_tokens)span.set_attribute("model", response.model)span.set_attribute("cost", cost)span.set_attribute("response", strResponse)return responsereturn wrapper
# Monkey-patch the openai.Completion.create function
openai.Completion.create = count_completion_requests_and_tokens(openai.Completion.create)

通过将所有这些数据添加到我们的 Span,我们实际上可以将其发送到我们的 OpenTelemetry OTLP 端点(在本例中它将是 Elastic 的)。 这样做的好处是你可以轻松使用数据进行搜索或构建仪表板和可视化。 在最后一步中,我们还要计算成本。 我们通过实现以下函数来实现这一点,该函数将计算对 OpenAI API 的单个请求的成本。

def calculate_cost(response):if response.model in ['gpt-4', 'gpt-4-0314']:cost = (response.usage.prompt_tokens * 0.03 + response.usage.completion_tokens * 0.06) / 1000elif response.model in ['gpt-4-32k', 'gpt-4-32k-0314']:cost = (response.usage.prompt_tokens * 0.06 + response.usage.completion_tokens * 0.12) / 1000elif 'gpt-3.5-turbo' in response.model:cost = response.usage.total_tokens * 0.002 / 1000elif 'davinci' in response.model:cost = response.usage.total_tokens * 0.02 / 1000elif 'curie' in response.model:cost = response.usage.total_tokens * 0.002 / 1000elif 'babbage' in response.model:cost = response.usage.total_tokens * 0.0005 / 1000elif 'ada' in response.model:cost = response.usage.total_tokens * 0.0004 / 1000else:cost = 0return cost

Elastic 来拯救

一旦我们捕获了所有这些数据,就可以在 Elastic 中享受一些乐趣了。 在 Discover 中,我们可以看到使用 OpenTelemetry 库发送的所有数据点:

有了这些标签,构建仪表板就变得非常容易。 看一下我之前构建的这个(也已并入到我的 GitHub 存储库):

我们还可以看到 OpenAI 服务的 transactions、延迟以及与 ChatGPT 服务调用相关的所有 span。

在 transaction 视图中,我们还可以看到特定 OpenAI 调用花费了多长时间:

此处对 OpenAI 的某些请求花费了超过 3 秒的时间。 ChatGPT 可能非常慢,因此我们必须了解其速度有多慢以及用户是否感到沮丧。

概括

我们研究了通过 OpenTelemetry 和 Elastic 监控 ChatGPT。 ChatGPT 是一种全球现象,毫无疑问它会不断发展壮大,很快每个人都会使用它。 由于获取响应的速度可能很慢,因此人们能够了解使用此服务的任何代码的性能至关重要。

还有成本问题,因为了解这项服务是否会侵蚀你的利润以及你所要求的服务是否能为你的业务带来利润非常重要。 在当前的经济环境下,我们必须关注盈利能力。

在这里查看该解决方案的代码。 请随意使用 “monitor” 库来检测你自己的 OpenAI 代码。

有兴趣了解有关 Elastic Observability 的更多信息吗? 查看以下资源:

  • Elastic 可观测性简介
  • 可观察性基础培训
  • 观看 Elastic Observability 演示
  • 2023 年可观测性预测和趋势

并报名参加我们以 AWS 和 Forrester 为主题的 Elastic 可观测性趋势网络研讨会,不容错过!

在这篇博文中,我们可能使用了第三方生成式人工智能工具,这些工具由其各自所有者拥有和运营。 Elastic 对第三方工具没有任何控制权,我们对其内容、操作或使用不承担任何责任,也不对你使用此类工具可能产生的任何损失或损害负责。 使用人工智能工具处理个人、敏感或机密信息时请务必谨慎。 你提交的任何数据都可能用于人工智能培训或其他目的。 无法保证你提供的信息将得到安全或保密。 在使用之前,你应该熟悉任何生成式人工智能工具的隐私惯例和使用条款。

Elastic、Elasticsearch 和相关标志是 Elasticsearch N.V. 在美国和其他国家/地区的商标、徽标或注册商标。 所有其他公司和产品名称均为其各自所有者的商标、徽标或注册商标。

原文:Monitor OpenAI API and GPT models with OpenTelemetry and Elastic — Elastic Search Labs

相关文章:

Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型

作者: 来自 Elastic David Hope ChatGPT 现在非常火爆,甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员,我对这项技术的可能性感到非常兴奋。 我看到的情况是,基于 ChatGPT 的解决方案将会呈指数级…...

靡语IT:Vue精讲(一)

Vue简介 发端于2013年的个人项目,已然成为全世界三大前端框架之一,在中国大陆更是前端首选。 它的设计思想、编码技巧也被众多的框架借鉴、模仿。 纪略 2013年,在Google工作的尤雨溪,受到Angular的启发,从中提取自…...

vue3 toRefs之后的变量修改方法

上效果 修改值需要带上解构之前的对象名obj&#xff0c; changeName:()>{ // toRefs 解决后变量修改值方法&#xff1a; 解构前变量.字段新值 obj.name FEIFEI; } } 案例源码 <!DOCTYPE html> <html> <head><me…...

【教程】详解相机模型与坐标转换

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 由于复制过来&#xff0c;如果有格式问题&#xff0c;推荐大家直接去我原网站上查看&#xff1a; 相机模型与坐标转换 - 生活大爆炸 目录 经纬度坐标系 转 地球直角坐标系大地直角坐标系 转 经纬度坐标系地理坐标…...

171基于matlab的随机共振微弱信号检测

基于matlab的随机共振微弱信号检测&#xff0c;随机共振描述了过阻尼布朗粒子受周期性信号和随机噪声的共同作用下,在非线性双稳态系统中所发生的跃迁现象. 随机共振可用于弱信号的检测。程序已调通&#xff0c;可直接运行。...

petalinux_zynq7 驱动DAC以及ADC模块之三:实现C语言API并编译出库被python调用

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…...

NXP实战笔记(五):S32K3xx基于RTD-SDK在S32DS上配置ADC的硬件触发同步采样与软件采样过程

目录 1、概述 1.1、软件触发 1.2、硬件触发 - BCTU 1.3、硬件触发 - TRGMUX 1.4、ADC的校准 1.5、ADC时钟配置 2、BTCU硬件触发ADC的SDK配置 3、软件触发ADC 3.1、选择相应Port作为ADC的输入 3.2、ADC配置 3.3、代码示例 1、概述 恩智浦 S32K3xx 系列汽车微控制器…...

pikachu靶场-CSRF

CSRF: 介绍&#xff1a; Cross-site request forgery简称为"CSRF”。 在CSF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09; 然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击也就完成了&#xff0…...

【结合OpenAI官方文档】解决Chatgpt的API接口请求速率限制

OpenAI API接口请求速率限制 速率限制以五种方式衡量&#xff1a;RPM&#xff08;每分钟请求数&#xff09;、RPD&#xff08;每天请求数&#xff09;、TPM&#xff08;每分钟令牌数&#xff09;、TPD&#xff08;每天令牌数&#xff09;和IPM&#xff08;每分钟图像数&#x…...

C语言实现基础数据结构——栈

目录 栈 栈的实现 数组栈 数组栈的实现 栈的初始化 栈的销毁 数据入栈 判断栈是否为空 数据出栈 获取栈顶元素 获取栈内数据个数 项目实现 栈的基础练习 有效的括号 栈 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的…...

船舶制造5G智能工厂数字孪生可视化平台,推进船舶行业数字化转型

船舶制造5G智能工厂数字孪生可视化平台&#xff0c;推进船舶行业数字化转型。随着数字化时代的到来&#xff0c;船舶行业正面临着前所未有的机遇与挑战。为了适应这一变革&#xff0c;船舶制造企业需要加快数字化转型的步伐&#xff0c;提高生产效率、降低成本并增强市场竞争力…...

【网络编程】okhttp深入理解

newCall 实际上是创建了一个 RealCall 有三个参数&#xff1a;OkHttpClient&#xff08;通用配置&#xff0c;超时时间等&#xff09; Request(Http请求所用到的条件&#xff0c;url等) 布尔变量forWebSocket&#xff08;webSocket是一种应用层的交互方式&#xff0c;可双向交互…...

大功率厚膜电阻器制造 – 优化性能?

通过优化工业大功率电阻器制造工艺&#xff0c;制造商可以提高电阻器的性能和可靠性、容差、额定电压、TCR、稳定性和额定功率。 在本文中&#xff0c;我们将介绍工业功率电阻器的制造过程。我们讨论了材料选择和生产技术及其对性能的潜在影响。 完美的电阻器 在其整个使用寿…...

ElasticStack安装(windows)

官网 : Elasticsearch 平台 — 大规模查找实时答案 | Elastic Elasticsearch Elastic Stack(一套技术栈) 包含了数据的整合 >提取 >存储 >使用&#xff0c;一整套! 各组件介绍: beats 套件:从各种不同类型的文件/应用中采集数据。比如:a,b,cd,e,aa,bb,ccLogstash:…...

gitlab的使用

前一篇文章我们已经知道Git人人都是中心&#xff0c;那他们怎么交互数据呢&#xff1f; • 使用GitHub或者码云等公共代码仓库 • 使用GitLab私有仓库 目录 一、安装配置gitlab 安装 初始化 这里初始化完成以后需要记住一个初始密码 查看状态 二、使用浏览器访问&#xf…...

基于springboot+vue的植物健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

Python爬虫实战入门:爬取360模拟翻译(仅实验)

文章目录 需求所需第三方库requests 实战教程打开网站抓包添加请求头等信息发送请求&#xff0c;解析数据修改翻译内容以及实现中英互译 完整代码 需求 目标网站&#xff1a;https://fanyi.so.com/# 要求&#xff1a;爬取360翻译数据包&#xff0c;实现翻译功能 所需第三方库 …...

微服务-微服务API网关Spring-clould-gateway实战

1. 需求背景 在微服务架构中&#xff0c;通常一个系统会被拆分为多个微服务&#xff0c;面对这么多微服务客户端应该如何去调用呢&#xff1f; 如果根据每个微服务的地址发起调用&#xff0c;存在如下问题&#xff1a; 1.客户端多次请求不同的微服务&#xff0c;会增加客户端…...

ECMAScript modules规范示例详解

ECMAScript modules&#xff08;简称 ES modules&#xff09;是JavaScript的标准模块系统。每个模块都是一个独立的JavaScript文件&#xff0c;可以在其中定义导出的变量、函数或类&#xff0c;并从其他模块中导入这些变量、函数或类。以下是ES modules规范的一些示例和详解&am…...

【OpenFeign常用配置】

OpenFeign常用配置 快速入门&#xff1a;1、引入依赖2、启用OpenFeign 实践1、引入依赖2、开启连接池功能3、模块划分4、日志5、重试 快速入门&#xff1a; OpenFeign是一个声明式的http客户端&#xff0c;是spring cloud在eureka公司开源的feign基础上改造而来。其作用及时基于…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...

C#中用于控制自定义特性(Attribute)

我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中&#xff0c;Attribute&#xff08;特性&#xff09;是一种用于向程序元素&#xff08;如类、方法、属性等&#xff09;添加元数据的机制。Attr…...