在接下来的文章中,我们将讨论 Elastic 为基于 OpenAI 的应用添加了 EDOT 的监控。最常见使用大型语言模型(LLM)的应用是聊天机器人。这些聊天机器人不仅使用 LLM,还使用诸如 LangChain 和搜索等框架,以在对话过程中改进上下文信息,即 RAG(检索增强生成)。Elastic 的示例 基于 RAG 的聊天机器人应用 展示了如何使用 Elasticsearch 结合包含嵌入的数据,使搜索能够在与 LLM 连接的聊天机器人查询时正确提取最相关的信息。这是一个如何使用 Elasticsearch 构建基于 RAG 应用的绝佳示例。
现在这个应用也使用了 EDOT 进行监控,您可以可视化聊天机器人对 OpenAI 的追踪,以及来自应用的相关日志和指标。按照 GitHub 仓库中的 Docker 说明运行应用,您可以在本地堆栈中看到这些追踪。那么,如何在无服务器、Elastic 云甚至 Kubernetes 上运行它呢?
在这篇博客中,我们将介绍如何使用 Elastic 云和 Kubernetes 设置 Elastic 的基于 RAG 的聊天机器人应用。
为了跟上进度,您需要以下前提条件:
首先,您需要启动 ChatBotApp,启动后您应看到以下内容:
在选择一些问题后,您会看到基于应用初始化时在 Elasticsearch 中创建的索引生成的响应。此外,还会有对 LLM 的查询。
当您在 Kubernetes 集群或 Docker 上运行应用,并且 Elastic 云也在运行时,您应该看到以下内容:
在 Discover 中,您会看到 Chatbotapp 的日志,并能够分析应用日志和特定的日志模式,从而节省分析时间。
在 Elastic Observability APM 中,您还可以看到聊天机器人的详细信息,包括事务、依赖关系、日志、错误等。
查看追踪时,您将看到聊天机器人的交互记录:
您还可以获取追踪的详细信息,并查看与该追踪相关的日志和指标。
除了日志和追踪,任何仪表化的指标也会被导入到 Elastic 中。
为了在 Docker 上正确设置 Chatbot-app 并将遥测数据发送到 Elastic,需要设置以下内容:
使用您的 Elastic 云的
OTEL_EXPORTER_OTLP_ENDPOINT
和
OTEL_EXPORTER_OTLP_HEADERS
您可以在 Elastic 云的
integrations->APM
中找到这些信息。
发送 OTel 仪表化数据的环境变量如下:
OTEL_EXPORTER_OTLP_ENDPOINT="https://123456789.apm.us-west-2.aws.cloud.es.io:443"
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20xxxxx"
请注意
%20
在标头中,这是为了处理凭据中的空格。
OTEL_SDK_DISABLED=false
在这个例子中,我们使用 OpenAI,因此只需要三个变量。
LLM_TYPE=openai
OPENAI_API_KEY=XXXX
CHAT_MODEL=gpt-4o-mini
docker compose up --build --force-recreate
localhost:4000
访问应用为了设置此应用,您可以按照 Observability-examples 仓库中的说明进行操作,里面包含了用于 Kubernetes 的 yaml 文件。这些文件也将指向 Elastic 云。
docker buildx build --platform linux/amd64 -t chatbot-rag-app .
OTEL_EXPORTER_OTLP_ENDPOINT/HEADER
变量基本上,您只需要用您的值替换以下红色部分,然后运行
kubectl create -f k8s-deployment.yaml
kubectl create -f init-index-job.yaml
应用需要先运行,然后我们使用应用来初始化 Elasticsearch 的索引。
Init-index-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: init-elasticsearch-index-test
spec:
template:
spec:
containers:
- name: init-index
image: yourimagelocation:latest
workingDir: /app/api
command: ["python3", "-m", "flask", "--app", "app", "create-index"]
env:
- name: FLASK_APP
value: "app"
- name: LLM_TYPE
value: "openai"
- name: CHAT_MODEL
value: "gpt-4o-mini"
- name: ES_INDEX
value: "workplace-app-docs"
- name: ES_INDEX_CHAT_HISTORY
value: "workplace-app-docs-chat-history"
- name: ELASTICSEARCH_URL
valueFrom:
secretKeyRef:
name: chatbot-regular-secrets
key: ELASTICSEARCH_URL
- name: ELASTICSEARCH_USER
valueFrom:
secretKeyRef:
name: chatbot-regular-secrets
key: ELASTICSEARCH_USER
- name: ELASTICSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: chatbot-regular-secrets
key: ELASTICSEARCH_PASSWORD
envFrom:
- secretRef:
name: chatbot-regular-secrets
restartPolicy: Never
backoffLimit: 4
k8s-deployment.yaml
apiVersion: v1
kind: Secret
metadata:
name: chatbot-regular-secrets
type: Opaque
stringData:
ELASTICSEARCH_URL: "https://yourelasticcloud.es.us-west-2.aws.found.io"
ELASTICSEARCH_USER: "elastic"
ELASTICSEARCH_PASSWORD: "elastic"
OTEL_EXPORTER_OTLP_HEADERS: "Authorization=Bearer%20xxxx"
OTEL_EXPORTER_OTLP_ENDPOINT: "https://12345.apm.us-west-2.aws.cloud.es.io:443"
OPENAI_API_KEY: "YYYYYYYY"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: chatbot-regular
spec:
replicas: 2
selector:
matchLabels:
app: chatbot-regular
template:
metadata:
labels:
app: chatbot-regular
spec:
containers:
- name: chatbot-regular
image: yourimagelocation:latest
ports:
- containerPort: 4000
env:
- name: LLM_TYPE
value: "openai"
- name: CHAT_MODEL
value: "gpt-4o-mini"
- name: OTEL_RESOURCE_ATTRIBUTES
value: "service.name=chatbot-regular,service.version=0.0.1,deployment.environment=dev"
- name: OTEL_SDK_DISABLED
value: "false"
- name: OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
value: "true"
- name: OTEL_EXPERIMENTAL_RESOURCE_DETECTORS
value: "process_runtime,os,otel,telemetry_distro"
- name: OTEL_EXPORTER_OTLP_PROTOCOL
value: "http/protobuf"
- name: OTEL_METRIC_EXPORT_INTERVAL
value: "3000"
- name: OTEL_BSP_SCHEDULE_DELAY
value: "3000"
envFrom:
- secretRef:
name: chatbot-regular-secrets
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: chatbot-regular-service
spec:
selector:
app: chatbot-regular
ports:
- port: 80
targetPort: 4000
type: LoadBalancer
使用 LoadBalancer URL 打开应用
运行 kubectl get services
命令并获取聊天机器人应用的 URL
% kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
chatbot-regular-service LoadBalancer 10.100.130.44 xxxxxxxxx-1515488226.us-west-2.elb.amazonaws.com 80:30748/TCP 6d23h
使用 Elastic 的 Chatbot-rag-app,您可以构建一个基于 OpenAI 驱动的 RAG 聊天应用的示例。然而,您仍然需要了解其性能如何,是否正常工作等。使用 OTel 和 Elastic 的 EDOT 可以帮助您实现这一点。此外,您通常会在 Kubernetes 上运行此应用。希望这篇博客提供了如何实现这一目标的概述。以下是其他关于追踪的博客:
应用可观测性与 LLM(追踪):
LLM 可观测性:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。