admin管理员组

文章数量:1446760

使用EDOT为你的Python、Node.js和Java应用程序进行OpenAI监控

使用EDOT为你的Python、Node.js和Java应用程序进行OpenAI监控

介绍

去年,我们宣布了Elastic OpenTelemetry分布 (简称EDOT) 语言SDK,它们用于从应用程序中收集日志、跟踪和指标。然而,当时我们还不支持大型语言模型(LLM)提供商如OpenAI,这限制了开发者对生成式AI(GenAI)应用的洞察。

在一篇之前的文章中,我们讨论了LLM的可观察性重点,如令牌使用、聊天延迟以及应用程序使用的工具(如DuckDuckGo)。通过适当的日志、跟踪和指标,开发者可以回答例如“哪个版本的模型生成了这个响应?”或“我的RAG应用程序创建的确切聊天提示是什么?”等问题。

在过去的六个月里,Elastic与OpenTelemetry社区的其他成员共同努力,制定了这些领域的共享规范,包括收集与LLM相关的日志、指标和跟踪的代码。我们的目标是将EDOT的无代码(agent)方法扩展到GenAI使用案例中。

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

示例应用程序

许多人可能熟悉ChatGPT,这是OpenAI的GPT模型家族的前端。使用它,你可以提出问题,助手可能会根据你提出的问题和LLM接受的文本正确回答。

这是一个由ChatGPT回答的深奥问题的示例:

ChatGPT回答

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

我们将使用“无代码”(agent)方法执行每个示例,以便在配置了Kibana和APM服务器的Elastic Stack中捕获和可视化日志、指标和跟踪。如果你没有运行堆栈,可以使用Elasticsearch Labs的说明来设置一个。

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

代码语言:javascript代码运行次数:0运行复制
OPENAI_API_KEY=sk-YOUR_API_KEY
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8200
OTEL_SERVICE_NAME=openai-example

默认情况下,监控不会捕获发送到OpenAI API的内容,如果你想捕获它,可以添加以下内容:

代码语言:javascript代码运行次数:0运行复制
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true

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

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

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

Kibana交易时间轴

选择日志选项卡以查看发送给OpenAI的确切请求和响应。这些数据对于问答和评估使用案例至关重要。

Kibana交易日志

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

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

Kibana指标探索器

继续阅读,了解如何在Python、Java和Node.js中运行此应用程序。那些已经使用我们EDOT语言SDK的人会熟悉其工作原理。

Python

假设你已经安装了Python,首先需要设置一个虚拟环境并安装所需的包:OpenAI客户端、读取.env文件的辅助工具以及我们的EDOT Python包:

代码语言:javascript代码运行次数:0运行复制
python3 -m venv .venv
source .venv/bin/activate
pip install openai "python-dotenv[cli]" elastic-opentelemetry

接下来,运行edot-bootstrap,它会分析代码并安装任何可用的相关监控:

代码语言:javascript代码运行次数:0运行复制
edot-bootstrap —-action=install

现在,按照本文前面描述的方式创建你的.env文件,并在chat.py中编写如下源代码:

代码语言:javascript代码运行次数:0运行复制
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.chatpletions.create(model=CHAT_MODEL, messages=messages)
  print(chat_completion.choices[0].message.content)

if __name__ == "__main__":
  main()

现在,你可以运行以下命令:

代码语言:javascript代码运行次数:0运行复制
dotenv run -- opentelemetry-instrument python chat.py

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

你可以在Python EDOT库的这里找到此示例的工作副本和相关说明。

如果你想尝试更全面的示例,可以查看使用OpenAI和Elasticsearch的chatbot-rag-app,它使用Elasticsearch的Elser检索模型。

Java

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

代码语言:javascript代码运行次数:0运行复制
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()pletions().create(params);
    System.out.println(chatCompletion.choices().get(0).message().content().get());
  }
}

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

接下来,按照前文描述的方式创建你的.env文件,并下载shdotenv,我们将使用它来加载环境变量。

代码语言:javascript代码运行次数:0运行复制
curl -O -L .14.0/shdotenv
chmod +x ./shdotenv

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

代码语言:javascript代码运行次数:0运行复制
curl -o elastic-otel-javaagent.jar -L ';g=co.elastic.otel&a=elastic-otel-javaagent&v=LATEST'

假设你生成了一个名为openai-example-all.jar的文件,可以像这样使用EDOT运行它:

代码语言:javascript代码运行次数:0运行复制
./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)。

代码语言:javascript代码运行次数:0运行复制
npm init -y
npm install openai @elastic/opentelemetry-node

接下来,按照前文描述的方式创建你的.env文件,并在index.js中编写如下源代码:

代码语言:javascript代码运行次数:0运行复制
const {OpenAI} = require('openai');

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

async function main() {
 const client = new OpenAI();
 const completion = await client.chatpletions.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运行上述源代码:

代码语言:javascript代码运行次数:0运行复制
node --env-file .env --require @elastic/opentelemetry-node index.js

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

你可以在EDOT Node.js源代码库的这里找到此示例的工作副本。

如果你想尝试更全面的示例,可以查看使用OpenAI和Elasticsearch作为向量数据库的openai-embeddings。

结语

以上内容展示了如何使用Elastic OpenTelemetry分布(EDOT)在三种不同语言中监控官方OpenAI SDK。

需要注意的是,一些OpenAI SDK和OpenTelemetry关于生成式AI的规范仍在实验阶段。如果你发现这些有帮助,或者发现问题,请加入我们的Slack并告诉我们。

通过设置OPENAI_BASE_URL和选择相关模型,多个LLM平台接受来自OpenAI客户端SDK的请求。在开发期间,我们测试了OpenAI平台和Azure OpenAI服务。我们还对Ollama进行了集成测试,并在v0.5.12版本中发布了对其OpenAI支持的改进。无论你选择哪个OpenAI兼容平台,我们希望这一新工具能帮助你了解你的LLM使用情况。

最后,虽然首个使用EDOT监控的生成式AI SDK是OpenAI,但你将很快看到更多。我们已经在开发Bedrock,并与OpenTelemetry社区的其他成员合作,为其他平台提供支持。请继续关注本博客,获取更多令人兴奋的更新。

本文标签: 使用EDOT为你的PythonNodejs和Java应用程序进行OpenAI监控