大规模语言模子(LLM)的可观测 性
随着大规模语言模子(LLM)在各个范畴的广泛应用,确保这些模子的稳固性和性能变得至关紧张。为了实现这一目标,可观测 性(Observability)成为了一个关键因素。OpenTelemetry 作为一个开源的可观测 性框架,提供了强大的工具来监控 和诊断 LLM 的运行状态。通过使用 OpenTelemetry,观测云可以轻松集成多种语言和框架,实现同一的数据网络、处置惩罚和实时监控 。
可观测性是指体系可以或许通过其外部输出(如日记、指标和追踪数据)来推断其内部状态的本领。对于 LLM 来说,可观测性可以资助我们相识模子的推理过程、性能瓶颈以及潜伏的错误。通过网络和分析这些数据,我们可以更好地优化模子并确保其在生产情况中的稳固性。
观测云
观测云( www.guance.com )是一个提供数据可视化和监控 服务的平台。它通常用于网络、处置惩罚和展示来自各种数据源的信息,资助用户实时监控业务指标、体系性能和网络状态等。观测云通过图表、仪表板和报警体系,使得用户可以或许快速辨认和相应数据厘革,从而优化业务流程和进步服从。它支持多种数据集成方式,包罗API、数据库、日记文件等,而且可以自界说仪表板,以满足差别用户的需求。观测云的界面友好,易于设置和使用,是企业数据监控和管理的有力工具。
OpenTelemetry
OpenTelemetry 是一个由 CNCF 托管的开源项目,旨在提供同一的 API 和 SDK 来网络和传输遥测数据(如日记、指标和追踪)。它支持多种编程语言,而且与各种后端体系兼容。对于 LLM,OpenTelemetry 可以资助我们:
- 网络具体的追踪数据:通过追踪每个推理哀求的实行路径,我们可以辨认出哪些部分是性能瓶颈。
- 记录关键指标:比方推理时间、内存使用情况等,这些指标可以资助我们评估模子的性能。
- 捕获日记信息:当出现题目时,日记可以提供宝贵的调试信息。
LLM 关键信号
在应用步伐中使用大规模语言模子(LLM)与传统呆板学习(ML)模子有所差别。紧张区别在于,LLM 通常通过外部 API 调用访问,而不是在当地或内部运行。因此,捕获变乱序列(通过追踪)尤为紧张,特殊是在基于 RAG(检索增强天生)的应用步伐中,LLM 使用前后大概会有多个变乱。别的,分析聚合数据(通过指标)可以快速提供关于哀求、令牌和资本的概览,这对于优化性能和管理资本非常紧张。以下是必要监控的关键信号:
追踪(Tracing)
1、哀求元数据:在 LLM 的上下文中,哀求元数据非常紧张,由于各种参数(如温度和 top_p)会明显影响相应质量和资本。具体必要监控的方面包罗:
- Temperature:表现盼望从模子输出中得到的创造力或随机性水平。调解此参数会明显影响天生内容的性子。
- top_p:决定模子的选择性,即从最有大概的词汇中选择肯定比例的词。较高的 top_p 值意味着模子思量的词汇范围更广,使文本更加多样化。
- 模子名称或版本:对于跟踪随时间的厘革至关紧张,由于 LLM 的更新大概会影响性能或相应特性。
- 提示词:发送给 LLM 简直切输入。与内部 ML 模子差别,LLM 的输入大概厘革很大,这会影响输出复杂性和资本。
2、相应元数据:由于 LLM 是通过 API 举行交互的,因此跟踪相应的具体细节对于资本管理和质量评估至关紧张:
- Token:直接影响资本,而且是相应长度和复杂性的度量。
- Cost:对于预算规划至关紧张,由于基于 API 的资本会随着哀求数量和每个哀求的复杂性而增长。
- 相应详情:类似于提示详情,但从相应的角度提供对模子输出特性的洞察,以及潜伏的服从低下或不测资本领域。
指标(Metric)
- 哀求量:发送到 LLM 服务的总哀求数。这有助于相识需求模式,并辨认使用中的任何非常情况,比方突然的激增或降落。
- 哀求时长:从发出哀求到吸收到 LLM 相应所需的时间。这包罗网络延长和 LLM 天生相应所需的时间,可以或许提供关于 LLM 服务性能和可靠性的洞察。
- 资本和令牌计数:跟踪随时间累积的总资本和斲丧的令牌数量对于预算规划和资本优化计谋至关紧张。监控这些指标可以提示你是否存在不测增长的情况,这大概表明 LLM 的使用服从低下或必要举行优化。
OpenLIT
OpenLIT 是一个基于 OpenTelemetry 的库,旨在通过为各种大规模语言模子(LLM)和向量数据库(VectorDB)提供主动 instrumentation 来简化 LLM 底子应用步伐的监控。
它遵照由 OpenTelemetry 社区创建的 GenAI 语义约定,并通过不依靠于供应商特定的跨度或变乱属性以及 OTLP 端点设置的情况变量,确保了平滑的集成过程,提供了一个标准的办理方案。
具体来说:
- 主动 instrumentation:OpenLIT 可以主动为多种 LLM 和 VectorDB 添加监控代码,淘汰了手动设置的工作量。
- 遵照语义约定:确保与 OpenTelemetry 社区的标准保持同等,便于数据的同一管理和分析。
- 标准化集成:无需使用供应商特定的设置项,使得集成过程更加简朴和通用,实用于差别的情况宁静台。
通过使用 OpenLIT,您可以更轻松地实现对 LLM 应用步伐的全面监控,从而更好地管理和优化这些复杂体系。
实行步调
要为 LLM 实现可观测性,以下是几个关键步调:
- 集成 OpenTelemetry SDK:起首,在你的 LLM 应用中集成 OpenTelemetry SDK。这可以通过安装相应的库并设置数据网络器来完成。
- 界说追踪范围:确定你盼望追踪的具体操纵,比方每次推理哀求的开始和竣事。
- 设置指标收罗:选择必要监控的关键性能指标,并设置相应的收罗器。
- 设置日记记录:确保全部紧张的变乱都被记录下来,以便后续分析。
- 可视化和报警:使用 Grafana 或其他工具将网络到的数据举行可视化展示,并设置报警机制以实时发现非常情况。
实践
为了更好地明白怎样应用这些概念,让我们来看一个具体的案例。假设我们有一个基于 Python 的 LLM 应用步伐。通过集成 OpenTelemetry SDK,我们可以轻松地为每个推理哀求添加追踪上下文,并记录干系的性能指标和日记信息。然后,我们可以将这些数据发送到观测云举行存储和查询,通过构建场景模板举行实时监控。
DataKit
DataKit 是一个开源的、跨平台的数据网络和监控工具,由观测云开辟并维护。它旨在资助用户网络、处置惩罚和分析各种数据源,如日记、指标和变乱,以便举行有用的监控和故障排查。DataKit 支持多种数据输入和输特别式,可以轻松集成到现有的监控体系中。
安装 DataKit
登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式,当前采取 Linux 主机摆设 DataKit。
将安装下令复制到服务器上实行,服务器会主动下载和安装 DataKit 服务。
开启 OpenTelemetry 收罗器
- cd /usr/local/datakit/conf.d/opentelemetry/
- cp opentelemetry.conf.sample opentelemetry.conf
复制代码 修改 opentelemetry.conf 的 customer_tags,提取关键 tag。
- customer_tags = ["gen_ai.application_name","gen_ai.request.model","gen_ai.prompt","gen_ai.completion","gen_ai.request.temperature","gen_ai.usage.input_tokens","gen_ai.usage.output_tokens","gen_ai.usage.total_tokens","gen_ai.endpoint","gen_ai.system"]
复制代码 重启 DataKit
LLM 应用
安装 OpenLIT
用以下下令安装 OpenLIT 的 Python 库:
调解代码
在 LLM 应用上添加以下代码:
- import openlit
- # 初始化 OpenLit
- openlit.init(
- otlp_endpoint="http://127.0.0.1:9529/otel",
- application_name="kimi_openlit_flask"
- )
复制代码 运行
正常运行 LLM 应用即可。
观测云效果
登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “OpenLIT”, 选择 “OpenLIT 监控视图”,点击 “确定” 即可添加视图。
通过观测云可以分析 Token 的斲丧、调用模子的分布、资本、哀求等数据。
也可以直接通过链路分析实际模子调用的汗青记录。
通过查察链路详情,可以看到模子 input 和 output。
参考代码
该代码是基于 OpenAI 调用 Kimi 大模子并通过接口方式对外提供服务。
- import os
- import httpx
- from flask import Flask, request, Response,jsonify,stream_with_context
- import openlit
- from openai import OpenAI
- from opentelemetry.instrumentation.flask import FlaskInstrumentor
- app = Flask(__name__)
- # 使用FlaskInstrumentor自动插桩Flask应用
- FlaskInstrumentor().instrument_app(app)
- # 初始化 OpenLit
- openlit.init(
- otlp_endpoint="http://127.0.0.1:9529/otel",
- application_name="kimi_openlit_flask"
- )
- # 从环境变量中获取 API Key
- api_key = os.getenv("MOONSHOT_API_KEY")
- if not api_key:
- raise ValueError("请设置 MOONSHOT_API_KEY 环境变量")
- client = OpenAI(
- api_key=api_key,
- base_url="https://api.moonshot.cn/v1",
- )
- def estimate_token_count(input_messages) -> int:
- """
- 计算输入消息的 Tokens 数量。
- """
- try:
- header = {
- "Authorization": f"Bearer {api_key}",
- }
- data = {
- "model": "moonshot-v1-128k",
- "messages": input_messages,
- }
- with httpx.Client() as client:
- print("请求接口")
- r = client.post("https://api.moonshot.cn/v1/tokenizers/estimate-token-count", headers=header, json=data)
- r.raise_for_status()
- response_data = r.json()
- print(response_data["data"]["total_tokens"])
- return response_data["data"]["total_tokens"]
- except httpx.RequestError as e:
- print(f"请求失败: {e}")
- raise
- except (KeyError, ValueError) as e:
- print(f"解析响应失败: {e}")
- raise
- def select_model(input_messages, max_tokens=1024) -> str:
- """
- 根据输入的上下文消息和预期的 max_tokens 值选择合适的模型。
- """
- if not isinstance(max_tokens, int) or max_tokens <= 0:
- raise ValueError("max_tokens 必须是正整数")
- prompt_tokens = estimate_token_count(input_messages)
- total_tokens = prompt_tokens + max_tokens
- if total_tokens <= 8 * 1024:
- return "moonshot-v1-8k"
- elif total_tokens <= 32 * 1024:
- return "moonshot-v1-32k"
- elif total_tokens <= 128 * 1024:
- return "moonshot-v1-128k"
- else:
- raise ValueError("tokens 数量超出限制 ?")
- @app.route('/ask', methods=['POST'])
- def ask():
- data = request.json
- messages = data.get('messages')
- max_tokens = data.get('max_tokens', 2048)
- if not messages:
- return jsonify({"error": "messages 字段不能为空"}), 400
- try:
- model = select_model(messages, max_tokens)
- completion = client.chat.completions.create(
- model=model,
- messages=messages,
- max_tokens=max_tokens,
- temperature=0.3,
- stream=True # 启用流式生成
- )
- def generate():
- for chunk in completion:
- # yield chunk.choices[0].delta.content or ''
- delta = chunk.choices[0].delta
- if delta.content:
- print(delta.content, end="")
- yield delta.content or ''
- return Response(stream_with_context(generate()), content_type='text/event-stream')
- except Exception as e:
- return jsonify({"error": str(e)}), 500
- # export MOONSHOT_API_KEY=sk-xxxxxxxx
- # python3 kimi_openlit_stream_flask.py
- # 请求接口
- # curl -X POST http://127.0.0.1:5000/ask -H "Content-Type: application/json" -H "Accept-Charset: UTF-8" -d '{
- # "messages": [
- # {"role": "system", "content": "你是 Kimi"},
- # {"role": "user", "content": "你好,请给我讲一个童话故事。"}
- # ],
- # "max_tokens": 2048
- # }'
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 结论
通过引入 OpenTelemetry,我们可以明显进步 LLM 的可观测性,从而更好地管理和优化这些复杂的体系。同时联合观测云的本领,能实时快速的对体系举行监控和分析,无论你是开辟者还是运维职员,把握这些技能都将为你带来巨大的代价。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|