admin管理员组文章数量:1446760
使用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回答的深奥问题的示例:
我们的示例应用程序将简单地提出这个预定义问题并打印结果。我们将用三种语言编写它:Python、JavaScript和Java。
我们将使用“无代码”(agent)方法执行每个示例,以便在配置了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
默认情况下,监控不会捕获发送到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流量:
选择日志选项卡以查看发送给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.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
。
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,我们将使用它来加载环境变量。
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运行它:
./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
中编写如下源代码:
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监控
版权声明:本文标题:使用EDOT为你的Python、Node.js和Java应用程序进行OpenAI监控 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1748250106a2832287.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论