当前位置: 首页 > 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基础上改造而来。其作用及时基于…...

第2.1章 StarRocks表设计——概述

注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的表设计相关内容。 建表是使用StarRocks非常重要的一环&#xff0c;规范化的表设计在某些场景下能使查询性能有数倍的提升。StarRocks的表设计涉及到的知识点主要包括数据表类型、数据分布&#xff08;分区分桶及排序键&#…...

WooCommerce商品采集与发布插件

如何采集商品或产品信息&#xff0c;并自动发布到Wordpress系统的WooCommerce商品&#xff1f; 推荐使用简数采集器&#xff0c;操作简单方便&#xff0c;且无缝衔接WooCommerce插件&#xff0c;快速完成商品的采集与发布。 简数采集器的智能自动生成采集规则和可视化操作功能…...

select滑动分页请求数据

需求背景 Antd 的 select 组件支滑动分页获取后端数据 实现滑动加载数据 定义变量 const allLoadedRef useRef<boolean>(true); // 是否触底 const [current, setCurrent] useState<number>(1); // 当前页 const [list, setList] useState([]); // 列表定义…...

【Go channel如何控制goroutine并发执行顺序?】

多个goroutine并发执行时&#xff0c;每一个goroutine抢到处理器的时间点不一致&#xff0c;gorouine的执行本身不能保证顺序。即代码中先写的gorouine并不能保证先执行 思路&#xff1a;使用channel进行通信通知&#xff0c;用channel去传递信息&#xff0c;从而控制并发执行…...

逆向分析Cobalt Strike安装后门

Cobalt Strike简介 Cobalt Strike是一款基于java的渗透测试神器&#xff0c;也是红队研究人员的主要武器之一&#xff0c;功能非常强大&#xff0c;非常适用于团队作战&#xff0c;Cobalt Strike集成了端口转发、服务扫描&#xff0c;自动化溢出&#xff0c;多模式端口监听&am…...

【嵌入式学习】QT-Day3-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2> 完善登录界面 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后…...

【杭州游戏业:创业热土,政策先行】

在前面的文章中&#xff0c;我们探讨了上海、北京、广州、深圳等城市的游戏产业现状。现在&#xff0c;我们切换视角&#xff0c;来看看另一个游戏创业热土——杭州的发展情况 最近第19届亚运会在杭州举办&#xff0c;本次亚运会上&#xff0c;电子竞技首次获准列为正式比赛项…...

Python-pdfplumber读取PDF内容

文章目录 前言一、pdfplumber模块1.1 pdfplumber的特点1.2 pdfplumber.PDF类1.3pdfplumber.Page类 二 pdfplumber的使用2.1 加载PDF2.2 pdfplumber.PDF 类2.3 pdfplumber.Page 类2.4 读取PDF2.5 读取PDF文档信息2.6 查看总页数2.7 查看总页数读取第一页的宽度&#xff0c;页高等…...

js设计模式汇总

目录 前言: 单篇目录: 工厂模式 单例模式 发布订阅模式 观察者模式 中介者模式 建造者模式 解释器模式 依赖注入模式 享元模式 路由模式 计算属性模式 委托者模式 访问者模式 外观模式 备忘录模式 过滤器模式 模板方法模式 状态模式 桥接模式 原型模式 组…...

【Java面试】MongoDB

目录 1、mongodb是什么&#xff1f;2、mongodb特点什么是NoSQL数据库&#xff1f;NoSQL和RDBMS有什么区别&#xff1f;在哪些情况下使用和不使用NoSQL数据库&#xff1f;NoSQL数据库有哪些类型?启用备份故障恢复需要多久什么是master或primary什么是secondary或slave系列文章版…...