使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序

作者:来自 Elastic Adrian Cole

Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪,而无需任何代码更改。

介绍

去年,我们宣布了 OpenTelemetry(又名 Elastic Distribution of OpenTelemetry - EDOT)语言 SDK 的 Elastic 分发,它可以从应用程序收集日志、跟踪和指标。当宣布这一消息时,我们还不支持 OpenAI 等大型语言模型 (LLM) 提供商。这限制了开发人员对生成式人工智能 (GenAI) 应用程序的洞察力。

在之前的文章中,我们回顾了 LLM 可观察性的重点,例如 token 使用情况、聊天延迟以及了解你的应用程序使用哪些工具(如 DuckDuckGo)。通过正确的日志、跟踪和指标,开发人员可以回答诸如 “Which version of a model generated this response? - 哪个版本的模型生成了此响应?”之类的问题。或 “What was the exact chat prompt created by my RAG application? - 我的 RAG 应用程序创建的聊天提示的具体是什么?”

在过去的六个月中,Elastic 与 OpenTelemetry 社区的其他成员一起投入了大量精力来共享这些领域的规范,包括收集 LLM 相关日志、指标和跟踪的代码。我们的目标是扩展 EDOT 为 GenAI 用例带来的零代码(代理)方法。

今天,我们宣布了 EDOT 语言 SDK 中的第一个 GenAI 仪器功能:OpenAI。下面,你将看到如何使用我们的 Python、Node.js 和 Java EDOT SDK 观察 GenAI 应用程序。

示例应用程序

我们中的许多人可能熟悉 ChatGPT,它是 OpenAI GPT 模型系列的前端。使用这个,你可以提出一个问题,助手可能会根据你问的问题和 LLM 所训练的文本正确地回答。

以下是 ChatGPT 回答的一个深奥问题的示例:

我们的示例应用程序将简单地询问这个预定义的问题并打印结果。我们将使用三种语言编写它:Python、JavaScript 和 Java。

我们将采用“零代码”(代理)方法执行每个操作,以便在配置了 Kibana 和 APM 服务器的 Elastic Stack 中捕获和查看日志、指标和跟踪。如果你尚未运行堆栈,请使用 ElasticSearch Labs 的说明进行设置。

无论编程语言是什么,都需要三个变量:OpenAI API 密钥、Elastic APM 服务器的位置以及应用程序的服务名称。你将把这些写入名为 .env 的文件中。

OPENAI_API_KEY=sk-YOUR_API_KEY
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8200
OTEL_SERVICE_NAME=openai-example

每次应用程序运行时,它都会将日志、跟踪和指标发送到 APM 服务器,你可以通过像这样查询 Kibana 来找到应用程序 “openai-example”

http://localhost:5601/app/apm/services/openai-example/transactions

当你选择一个跟踪时,你将看到 OpenAI SDK 发出的 LLM 请求,以及由此引起的 HTTP 流量:

选择 logs 选项卡来查看对 OpenAI 的确切请求和响应。这些数据对于问答和评估用例至关重要。

你还可以转到 Metrics Explorer 并在运行应用程序的所有时间内绘制 “gen_ai.client.token.usage” 或 “gen_ai.client.operation.duration” 的图表:

http://localhost:5601/app/metrics/explorer

继续查看该应用程序在 Python、Java 和 Node.js 中的具体外观和运行方式。那些已经使用我们的 EDOT 语言 SDK 的人将会熟悉它的工作原理。

Python

假设你已经安装了 python,那么第一件事就是设置一个虚拟环境并安装所需的软件包:OpenAI 客户端、用于读取 .env 文件的辅助工具和我们的 EDOT Python 包:

python3 -m venv .venv
source .venv/bin/activate
pip install openai "python-dotenv[cli]" elastic-opentelemetry

接下来,运行 edot-bootstrap,它将分析代码以安装任何可用的相关工具:

edot-bootstrap —-action=install

现在,创建你的 .env 文件,如本文前面所述,以及 chat.py 中的以下源代码

import os

import openai

CHAT_MODEL = os.environ.get("CHAT_MODEL", "gpt-4o-mini")


def main():
  client = openai.Client()

  messages = [
    {
      "role": "user",
        "content": "Answer in up to 3 words: Which ocean contains Bouvet Island?",
    }
  ]

  chat_completion = client.chat.completions.create(model=CHAT_MODEL, messages=messages)
  print(chat_completion.choices[0].message.content)

if __name__ == "__main__":
  main()

现在你可以使用以下命令运行所有内容:

dotenv run -- opentelemetry-instrument python chat.py

最后,在 Kibana 中查找名为 “openai-example” 的服务的跟踪。你应该会看到一个名为 “chat gpt-4o-mini” 的交易。

你无需复制/粘贴上述内容,而是可以在此处的 Python EDOT 存储库中找到此示例的工作副本(以及说明)。

最后,如果你想尝试更全面的示例,请查看使用 OpenAI 和 ElasticSearch 的 Elser 检索模型的 chatbot-rag-app。

Java

初始化 Java 项目有几种流行的方法。由于我们使用的是 OpenAI,第一步是配置依赖项 com.openai:openai-java 并将以下源代码写为 Chat.java。

package openai.example;

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.*;


final class Chat {

  public static void main(String[] args) {
    String chatModel = System.getenv().getOrDefault("CHAT_MODEL", "gpt-4o-mini");

    OpenAIClient client = OpenAIOkHttpClient.fromEnv();

    String message = "Answer in up to 3 words: Which ocean contains Bouvet Island?";
    ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
        .addMessage(ChatCompletionUserMessageParam.builder()
          .content(message)
          .build())
        .model(chatModel)
        .build();

    ChatCompletion chatCompletion = client.chat().completions().create(params);
    System.out.println(chatCompletion.choices().get(0).message().content().get());
  }
}

构建项目使得所有依赖项都在一个 jar 中。例如,如果使用 Gradle,你将使用 com.gradleup.shadow 插件。

接下来,如前所述,创建 .env 文件,并下载我们将用来加载它的 shdotenv。

curl -O -L https://github.com/ko1nksm/shdotenv/releases/download/v0.14.0/shdotenv
chmod +x ./shdotenv

此时,你有一个 jar 和配置,可以用来运行 OpenAI 示例。下一步是下载 EDOT Java javaagent 二进制文件。这是记录和导出日志、指标和跟踪的部分。

curl -o elastic-otel-javaagent.jar -L 'https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=co.elastic.otel&a=elastic-otel-javaagent&v=LATEST'

假设你组装了一个名为 openai-example-all.jar 的文件,请使用 EDOT 运行它,如下所示:

./shdotenv java -javaagent:elastic-otel-javaagent.jar -jar openai-example-all.jar

最后,在 Kibana 中查找名为 “openai-example” 的服务的跟踪。你应该会看到一个名为 “chat gpt-4o-mini” 的交易。

你无需复制/粘贴上述内容,而是可以在此处的 EDOT Java 源代码存储库中找到此示例的工作副本。

Node.js

假设你已经安装并配置了 npm,请运行以下命令来初始化示例项目。这包括 openai 包和 @elastic/opentelemetry-node (EDOT Node.js)

npm init -y
npm install openai @elastic/opentelemetry-node

接下来,创建 .env 文件,如本文前面所述以及 index.js 中的以下源代码:

const {OpenAI} = require('openai');

let chatModel = process.env.CHAT_MODEL ?? 'gpt-4o-mini';

async function main() {
 const client = new OpenAI();
 const completion = await client.chat.completions.create({
  model: chatModel,
  messages: [
   {
    role: 'user',
    content: 'Answer in up to 3 words: Which ocean contains Bouvet Island?',
   },
  ],
 });
 console.log(completion.choices[0].message.content);
}

main();

有了这个,使用 EDOT 运行上述源,如下所示:

node --env-file .env --require @elastic/opentelemetry-node index.js

最后,在 Kibana 中查找名为 “openai-example” 的服务的跟踪。你应该会看到一个名为 “chat gpt-4o-mini” 的交易。

你无需复制/粘贴上述内容,就可以在此处的 EDOT Node.js 源存储库中找到此示例的工作副本。

最后,如果你想尝试一个更全面的示例,请查看 openai-embeddings,它使用 OpenAI 和 Elasticsearch 作为向量数据库!

结束语

以上你已经了解了如何使用 OpenTelemetry 的弹性分布 (EDOT) 以三种不同的语言观察官方 OpenAI SDK。

值得注意的是,一些 OpenAI SDK 以及围绕生成式 AI 的 OpenTelemetry 规范都是实验性的。如果你发现这对你有帮助,或者发现故障,请加入我们的 Slack 并让我们知道。

通过设置 OPENAI_BASE_URL 并选择相关模型,多个 LLM 平台可以接受来自 OpenAI 客户端 SDK 的请求。在开发过程中,我们测试了 Azure OpenAI 服务并使用 Ollama 进行集成测试。事实上,我们将代码贡献给 Ollama 以改进其 OpenAI 支持。无论你选择哪种 OpenAI 兼容平台,我们都希望这个新工具可以帮助你了解 LLM 的使用情况。

最后,虽然第一个搭载 EDOT 的生成式 AI SDK 是 OpenAI,但你很快就会看到更多。我们已经在 Bedrock 上开展工作,并与 OpenTelemetry 社区的其他人合作开发其他平台。请继续关注此博客以获取令人兴奋的更新。

原文:Instrumenting your OpenAI-powered Python, Node.js, and Java Applications with EDOT — Elastic Observability Labs

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang的多团队协作编程模式与实践经验

Golang的多团队协作编程模式与实践经验 一、多团队协作编程模式概述 在软件开发领域,多团队协作编程是一种常见的工作模式。特别是对于大型项目来说,不同团队间需要协同合作,共同完成复杂的任务。Golang作为一种高效、并发性强的编程语言&…

Sequence to Sequence model

基础模型 基础模型是用RNN模型,前部分是encoder用来寻找法语输入的编码,后半部分是decoder用来生成英文翻译作为输出,每次输出一个单词,直到输出结束标志如EOS。 下面是另一个例子,在CNN模型输出层之前会输出图片的向…

verilog练习:i2c slave 模块设计

文章目录 前言1.结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了,网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总,如果对读者有…

【竞技宝】PGL瓦拉几亚S4预选:Tidebound2-0轻取spiky

北京时间2月13日,DOTA2的PGL瓦拉几亚S4预选赛继续进行,昨日进行的中国区预选赛胜者组首轮Tidebound对阵的spiky比赛中,以下是本场比赛的详细战报。 第一局: 首局比赛,spiky在天辉方,Tidebound在夜魇方。阵容方面,spiky点出了幻刺、火枪、猛犸、小强、巫妖,Tidebound则是拿到飞…

Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)

Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1) import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.HardwareRenderer import android.graphics.PixelFormat import android.graphic…

AI前端开发的崛起与ScriptEcho的助力

近年来,人工智能(AI)技术飞速发展,深刻地改变着软件开发的格局。尤其是在前端开发领域,AI的应用越来越广泛,催生了对AI写代码工具的需求激增,也显著提升了相关人才的市场价值。然而,…

【Mac排错】ls: command not found 终端命令失效的解决办法

【TroubleShooting on Mac】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal,并且为她定制了不同的Profile。 这样,看起来她可以在不同季节&…

DexVLA:通用机器人控制中具有插件式扩散专家的视觉语言模型

25年2月来自美的集团和华东师范的论文“DexVLA: Vision-Language Model with Plug-In Diffusion Expert for General Robot Control”。 让机器人能够在不同的环境中执行不同的任务是机器人学习的核心挑战。虽然视觉-语言-动作 (VLA) 模型已显示出可泛化机器人技能的前景&…

【微服务学习一】springboot微服务项目构建以及nacos服务注册

参考链接 3. SpringCloud - 快速通关 springboot微服务项目构建 教程中使用的springboot版本是3.x,因此需要使用jdk17,并且idea也需要高版本,我这里使用的是IDEA2024。 环境准备好后我们就可以创建springboot项目,最外层的项目…

DeepSeek 助力 Vue 开发:打造丝滑的返回顶部按钮(Back to Top)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

deepseek大模型,本地搭建deepseek模型,springai调用本地deepseek模型,java调用deepseek大模型api

文档对应的视频地址: https://www.bilibili.com/video/BV1V8NBevEjk/?spm_id_from333.1387.homepage.video_card.click&vd_source14d27ec13a4737c281b7c79463687112SpringAI调用本地deepseek模型 一、 使用deepseek步骤 官网注册账号 地址: https…

大模型语言简介

大模型语言能做什么 信息提取 将长段文字中的信息抽取出来并且以结构化的方式输出。相比起传统NLP的方式,大模型在泛化能力上有非常大的提升,并且开发成本要低2个数量级。应用场景包括:论文论点论据提取、用户画像提取、舆情分析、病例结构…

计算机毕业设计Python旅游评论情感分析 NLP情感分析 LDA主题分析 bayes分类 旅游爬虫 旅游景点评论爬虫 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

FreeRtos实时系统: 十二.FreeRTOS的队列集

FreeRtos实时系统: 十二.FreeRTOS的队列集 一.队列集简介二.队列集相关API函数三.队列集操作实验 一.队列集简介 左边的接收任务会在没接收到队列时会阻塞,如果前面释放信号量这时该任务也获取不到信号量。 右边使用队列集如果获取到,判断句柄是谁&#…

vsftpd 编译安装流程

目录 vsftpd 编译安装流程1、下载源码包并上传致服务器解压2、进入源码目录后编译源码文件3、将对应文件安装到指定位置4、准备 vsftpd 的运行环境5、启动 vsftpd 服务进行测试6、编译安装说明 vsftpd 编译安装流程 1、下载源码包并上传致服务器解压 源码包下载地址&#xff1…

【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

问题描述 我们将Debug版本的安装包发送到手机上安装,会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码: android.injected.testOnlyfalse 最后点击“Sync now”,等待重新加载gradle资源即可 后面我们重新编译Debug安装…

计算机网络-八股-学习摘要

一:HTTP的基本概念 全称: 超文本传输协议 从三个方面介绍HTTP协议 1,超文本:我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…

八大排序——归并排序

目录 1.基本思想 2.动态图 3.分解的时候我们可以使用递归的方式进行 代码解释 1. main 方法 2. mergeSort 方法 3. merge 方法 示例运行过程 初始数组 每轮排序后的数组 代码总结 合并两个有序序列 1.基本思想 归并排序就是递归得将原始数组递归对半分隔&#xff0c…

C++ Primer 跳转语句

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

Elasticsearch:15 年来致力于索引一切,找到重要内容

作者:来自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 刚刚 15 岁了!回顾过去 15 年的索引和搜索,并展望未来 15 年的相关内容。 Elasticsearch 刚刚成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章(带有标志性的…