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

半亩花草  论坛元老 | 2025-2-14 00:09:18 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1005|帖子 1005|积分 3015

作者:来自 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 的文件中。
  1. OPENAI_API_KEY=sk-YOUR_API_KEY
  2. OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8200
  3. 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 包:
  1. python3 -m venv .venv
  2. source .venv/bin/activate
  3. pip install openai "python-dotenv[cli]" elastic-opentelemetry
复制代码
接下来,运行 edot-bootstrap,它将分析代码以安装任何可用的相干工具:
  1. edot-bootstrap —-action=install
复制代码
现在,创建你的 .env 文件,如本文前面所述,以及 chat.py 中的以下源代码
  1. import os
  2. import openai
  3. CHAT_MODEL = os.environ.get("CHAT_MODEL", "gpt-4o-mini")
  4. def main():
  5.   client = openai.Client()
  6.   messages = [
  7.     {
  8.       "role": "user",
  9.         "content": "Answer in up to 3 words: Which ocean contains Bouvet Island?",
  10.     }
  11.   ]
  12.   chat_completion = client.chat.completions.create(model=CHAT_MODEL, messages=messages)
  13.   print(chat_completion.choices[0].message.content)
  14. if __name__ == "__main__":
  15.   main()
复制代码
现在你可以利用以下下令运行所有内容:
  1. 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.openaipenai-java 并将以下源代码写为 Chat.java。
  1. package openai.example;
  2. import com.openai.client.OpenAIClient;
  3. import com.openai.client.okhttp.OpenAIOkHttpClient;
  4. import com.openai.models.*;
  5. final class Chat {
  6.   public static void main(String[] args) {
  7.     String chatModel = System.getenv().getOrDefault("CHAT_MODEL", "gpt-4o-mini");
  8.     OpenAIClient client = OpenAIOkHttpClient.fromEnv();
  9.     String message = "Answer in up to 3 words: Which ocean contains Bouvet Island?";
  10.     ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
  11.         .addMessage(ChatCompletionUserMessageParam.builder()
  12.           .content(message)
  13.           .build())
  14.         .model(chatModel)
  15.         .build();
  16.     ChatCompletion chatCompletion = client.chat().completions().create(params);
  17.     System.out.println(chatCompletion.choices().get(0).message().content().get());
  18.   }
  19. }
复制代码
构建项目使得所有依靠项都在一个 jar 中。比方,如果利用 Gradle,你将利用 com.gradleup.shadow 插件。
接下来,如前所述,创建 .env 文件,并下载我们将用来加载它的 shdotenv。
  1. curl -O -L https://github.com/ko1nksm/shdotenv/releases/download/v0.14.0/shdotenv
  2. chmod +x ./shdotenv
复制代码
此时,你有一个 jar 和设置,可以用来运行 OpenAI 示例。下一步是下载 EDOT Java javaagent 二进制文件。这是记载和导出日记、指标和跟踪的部分。
  1. 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 运行它,如下所示:
  1. ./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)
  1. npm init -y
  2. npm install openai @elastic/opentelemetry-node
复制代码
接下来,创建 .env 文件,如本文前面所述以及 index.js 中的以下源代码:
  1. const {OpenAI} = require('openai');
  2. let chatModel = process.env.CHAT_MODEL ?? 'gpt-4o-mini';
  3. async function main() {
  4. const client = new OpenAI();
  5. const completion = await client.chat.completions.create({
  6.   model: chatModel,
  7.   messages: [
  8.    {
  9.     role: 'user',
  10.     content: 'Answer in up to 3 words: Which ocean contains Bouvet Island?',
  11.    },
  12.   ],
  13. });
  14. console.log(completion.choices[0].message.content);
  15. }
  16. main();
复制代码
有了这个,利用 EDOT 运行上述源,如下所示:
  1. 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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表