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

作者:David Hope

ChatGPT 现在很火,它打破了互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发者,我对这项技术的可能性感到无比兴奋。 我看到的情况是,基于 ChatGPT 的解决方案将呈指数级增长,人们将需要监控这些解决方案。

由于这是一项非常新的技术,我们不想让我们闪亮的新代码负担专有技术,对吗? 不,我们不会,这就是为什么我们要使用 OpenTelemetry 来监控本博客中的 ChatGPT 代码。 这对我来说尤其重要,因为我最近创建了一项服务,可以从 Zoom 通话中生成会议记录。 如果我要将其发布到外面,我要花多少钱?我如何确保它可用?

OpenAI API 来拯救

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

{"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 of Observability 的地步。 我们可以使用它来记录日志、指标和跟踪,并以供应商中立的方式将它们放入我们最喜欢的可观察性工具 —— 在本例中为 Elastic 可观察性。

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

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

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

登录后,单击 Add integrations

点击 APM Integration

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

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

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?(为什么 Elastic 是一个了不起的可观察性工具?)”

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()

此处使用 Python 实现 OpenTelemetry 的任何人都应该相当熟悉此代码 — 没有特定的魔法。 魔法发生在 “监控” 代码中,你可以自由使用它来检测你自己的 OpenAI 应用程序。

摆弄 Monkey

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

我们在这里要做的是修改 “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)。

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

 此处对 OpenAI 的一些请求已超过 3 秒。 ChatGPT 可能会非常慢,因此了解它有多慢以及用户是否感到沮丧对我们来说很重要。

总结

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

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

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

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

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

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

原文:Monitor OpenAI API and GPT models with OpenTelemetry and Elastic | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/49425.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型时代的自然语言处理:挑战、机遇与发展

来源:专知‍‍ 近期发布的 ChatGPT 和 GPT-4 等大型语言模型, 不仅能高质量完成自然语言生成任务, 生 成流畅通顺, 贴合人类需求的语言, 而且具备以生成式框架完成各种开放域自然语言理解任务的能 力. 在少样本, 零样本场景下, 大模型可取得接近乃至达到传统监督学习…

促进社区AIGC发展!Stability AI 再开源 RLHF、DeepFloyd IF

本文来源 新智元 编辑:Aeneas 好困 【新智元导读】开源先锋StabilityAI一天扔了两枚重磅炸弹:发布史上首个开源RLHF大语言模型,以及像素级图像模型DeepFloyd IF。开源社区狂喜! 最近,大名鼎鼎的Stable Diffusion背后…

分享200+个关于AI的网站

分享200个关于AI的网站 欢迎大家访问:https://tools.haiyong.site/ai 快速导航 AI 应用AI 写作AI 编程AI 设计AI 作图AI 训练模型AI 影音编辑AI 效率助手 AI 应用 文心一言: https://yiyan.baidu.com/ 百度出品的人工智能语言模型 ChatGPT: https://chat.openai.c…

论文《Can AI-Generated Text be Reliably Detected?》译文

摘要 大型语言模型(LLM)的快速发展使它们能够在包括文档续写和问答系统在内的各种任务中表现惊人。然而,不受监管地使用这些模型可能导致恶意后果,如抄袭、伪造新闻、垃圾邮件等。因此,可靠地检测人工智能生成的文本对…

我的周刊(第080期)

我的信息周刊,记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 stable-diffusion-webui-docker[1] 基于 Docker 的…

文案一键配图!

大家好,我是懂王。 之前听到过这样一句话,朋友圈内容吸引力为:视频>图片>文字>链接。其实这句话还是有几分道理的。毕竟如何简短,快速的了解信息才是最重要的。 无论是发朋友还是写文章,只要你涉及到内容创…

ChatGPT iOS 应用程序用户现在可以访问互联网

OpenAI 的 iOS 版 ChatGPT 应用程序现在允许 ChatGPT Plus 用户通过 Bing 搜索访问信息。付费用户的浏览功能处于测试阶段。 ChatGPT iOS 应用程序用户现在可以通过 Bing 搜索访问信息。但是,该功能仅适用于 ChatGPT Plus 用户,并且必须通过设置启用。 …

iOS iTunes Connect后台显示app已经上架(可供销售),但用手机在App Store搜不到的解决办法。

//联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄 一、概念 在 iTunes Connect后台显示的状态是“Ready for sale”,即"可供销售"。 审核通过后,客户即在appstore搜索下载,但没有搜到,以为是苹果数据同步延迟。 图: 二解…

已经上架的app(可供销售)在AppStore上搜不到的解决办法

这两天很是头大, 因为3天前手动发布的app到现在都还没在AppStore上看到,打了无数电话给苹果和发邮件给review团队. 下面说说怎么解决我们在iTunes后台看到是绿灯(可供销售)但是就是在AppStore上搜不到新版本. 1.打电话 4006-701-855, 这是iTunes提供的支持电话,中国时间 9:00-1…

已上架的App在AppStore上无法搜索到的问题

前言 # 如果还没有苹果开发者账号,自行注册苹果开发者中心 (opens new window)并缴费成为开发者。 # 证书配置 证书教程 (opens new window)Win系统请使用 appuploader (opens new window)进行生成。 # 发布证书(三个端只需一个即可 格式.p12 上传到后…

itunesconnect后台显示app已经上架(可供销售),但在appstore搜不到的解决办法。

昨天在itunesconnect提交了新版本,今天早上一早起来看到已经审核通过了 。在itunesconnect中显示是“可供销售”,但是在appstore中搜索时显示的还是老的版本。搜了几次都是这样。后来查了一些资料发现遇到这个appstore缓存bug的开发者还不在少数。还找到…

新人直接上手,手机拍延时摄影

新人直接上手,手机拍延时摄影 延时摄影是什么飞机上的摄影海天一色海天一色精剪版高空摄像机场降落神仙仙云-猴哥腾云驾雾腾云驾雾精剪版蓝天白云的马尼拉 延时摄影是什么 延时摄影是什么?这是一种视频,也可以理解为是一种gif动图。我们一般…

隔空拍照,视频,定位,PHP开发的在线版网恋照妖镜源码使用方法

初衷还是为了避免网恋翻车,毕竟网络世界里 谁也不知道和你相聊甚欢的对象是不是一个抠脚大汉呢?! 其原理:对方点击该链接并确认授权后 网页会自动调用前置摄像头抓拍照片,然后通过前面设置的密码就可以查看到刚刚抓拍…

Android Camera2 实现连拍

gitee 链接: 通过 captureBurst 实现连拍 拍完的图片放在 /data/data/com.example.burstcapture/files/ 连拍的具体实现代码在 BurstCapture.java 、BurstCaptureExpo.java、BurstCaptureFocus.java中,调用在 MainActivity.java中,调用方式很…

对拍详解

对拍详解 ——HM 对拍是家中写题、考场中写题判断自己的程序答案是否正确的一种技巧,当…

Android Camera预览角度和拍照保存图片角度学习

1 Camera预览角度处理 开发Camera过程中会遇到Camera拍照,获取照片后可以上传照片或者展示给用户。 Camera的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会有一个默认的方向,一般默认方向是当手机左侧横放时&…

国仁网络资讯:短视频拍摄如何上热门;掌握这8大拍摄运镜手法即可。

抖音视频拍摄基本分为两种:一种是随手拍,记录生活精彩时刻;一种是情景拍摄,一般整个视频都是设计好的。 随手一拍很轻松,但未免没有那么多偶然的精彩瞬间,此时就需要我们自己去编排了,编排出一条精彩视频,拍摄技巧是必须的。 不同拍摄手法所表达的意思也各不相同。那么…

定位教程4-固定相机之先抓后拍

相机固定,机器人吸住一个物料,拍照,然后将电池放到其他位置,这也是一个经典的应用场景。 相机在上和在下都是一样的标定方法,只是需要注意下角度取反而已,大家在实际使用的时候自己测试一下就知道角度取反问题. 其标定方法和之前的固定相机-先拍再抓一样,都是先9点标定,再5点标…

Android 使用CameraX实现预览/拍照/录制视频/图片分析/对焦/缩放/切换摄像头等操作

1. CameraX架构 看官方文档 CameraX架构 有如下这一段话 使用CameraX,借助名为"用例"的抽象概念与设备的相机进行交互。 预览 : 接受用于显示预览的Surface,例如PreviewView图片分析 : 为分析 (例如机器学习) 提供CPU可访问的缓冲区图片拍摄…

Android 使用Camera2 实现拍照录像的功能

职场小白迷上优美句子: 还是电影 《无问西东》中的台词,这句有点感人: 沈光耀的妈妈对沈光耀说:"当初你离家千里,来到这个地方读书,你父亲和我都没有反对过,因为,是我们想你,…