随着LLM应用程序的不断发展和改进,实现强大的可观测性对于确保最佳性能和可靠性至关重要。然而,由于其复杂性和规模,跟踪和存储 LLM 应用程序的运行时事件是具有挑战性的。
为了应对这些挑战,我们很高兴发布 MyScale Telemetry,它与 LangChain Callbacks 集成。
MyScale Telemetry 无缝地捕获基于 LangChain 的 LLM 应用程序的跟踪数据,并将其存储在MyScale 中,使诊断问题、优化性能和理解模型行为变得容易。
你可以将 MyScale Telemetry 看作是 LangSmith 的开源替代品,它提供与 LangSmith 类似的功能,包括跟踪和评估 LLM 应用程序。MyScale Telemetry 通过使用多功能强大的 MyScale SQL向量数据库和广泛使用的 Grafana 仪表板,减少了系统复杂性并提高了数据安全性。此外,由于MyScaleDB 与 ClickHouse 兼容,MyScale Telemetry 可以直接与 ClickHouse 一起使用。
让我们在以下部分中详细查看 MyScale Telemetry 系统的工作原理和用法。
将 MyScale Telemetry 与 LangChain 集成是直接的。回调处理程序会自动为你的 LangChain 应用程序中的每个运行时事件创建一个嵌套跟踪,包括:
on_chain_starton_chain_endon_llm_starton_llm_endon_chat_model_starton_retriever_starton_retriever_endon_tool_starton_tool_endon_tool_erroron_chain_erroron_retriever_erroron_llm_error然后收集的运行时事件数据被组织成跟踪数据,类似于 OpenTelemetry 跟踪数据,并存储在MyScale 数据库中的专用跟踪数据表中。请参阅以下 SQL 脚本,了解此跟踪数据表结构和CREATE TABLE语句。
CREATETABLEyour_database_name.your_table_name
(
`TraceId`StringCODEC(ZSTD(1)),
`SpanId`StringCODEC(ZSTD(1)),
`ParentSpanId`StringCODEC(ZSTD(1)),
`StartTime`DateTime64(9)CODEC(Delta(8),ZSTD(1)),
`EndTime`DateTime64(9)CODEC(Delta(8),ZSTD(1)),
`Duration`Int64CODEC(ZSTD(1)),
`SpanName`LowCardinality(String)CODEC(ZSTD(1)),
`SpanKind`LowCardinality(String)CODEC(ZSTD(1)),
`ServiceName`LowCardinality(String)CODEC(ZSTD(1)),
`SpanAttributes`Map(LowCardinality(String),String)CODEC(ZSTD(1)),
`ResourceAttributes`Map(LowCardinality(String),String)CODEC(ZSTD(1)),
`StatusCode`LowCardinality(String)CODEC(ZSTD(1)),
`StatusMessage`StringCODEC(ZSTD(1)),
INDEXidx_trace_idTraceIdTYPEbloom_filter(0.001)GRANULARITY1,
INDEXidx_res_attr_keymapKeys(ResourceAttributes)TYPEbloom_filter(0.01)GRANULARITY1,
INDEXidx_res_attr_valuemapValues(ResourceAttributes)TYPEbloom_filter(0.01)GRANULARITY1,
INDEXidx_span_attr_keymapKeys(SpanAttributes)TYPEbloom_filter(0.01)GRANULARITY1,
INDEXidx_span_attr_valuemapValues(SpanAttributes)TYPEbloom_filter(0.01)GRANULARITY1,
INDEXidx_durationDurationTYPEminmaxGRANULARITY1
)
ENGINE=MergeTree()
PARTITIONBYtoDate(StartTime)
ORDERBY(SpanName,toUnixTimestamp(StartTime),TraceId);
MyScale Telemetry 自动将用户与 LLM 应用程序交互生成的所有跟踪数据记录到 MyScale Cloud或 MyScaleDB 中。然后,开发人员可以在 Grafana 仪表板中可视化这些存储的跟踪数据,从而全面调试和分析 LLM 应用程序。这些跟踪数据还可以输入到像 Ragas 这样的评估框架中进行进一步分析,帮助优化应用程序。
因此,MyScale Telemetry 对开发人员来说是非常有价值的。它提供了一个强大的工具,可以以最小的性能影响调试和增强 LLM 应用程序。它提供了全面的可观测性洞察,允许开发人员深入理解他们的应用程序的行为和性能。
让我们通过考虑以下完整示例开始使用 MyScale Telemetry:设置 MyScaleDB 和 Grafana 仪表板(用于存储和监控跟踪数据)—使用Ragas评估这些数据。
按照以下步骤有效设置和使用 MyScale Telemetry:
首先,使用 Docker Compose 启动 MyScaleDB 和 Grafana 实例。你可以在此文件夹中找到docker-compose.yml文件。运行以下命令启动容器:
gitclonehttps://github.com/myscale/myscale-telemetry.git
cdmyscale-telemetry/deploy/
docker-composeup-d
或者,你可以在 MyScale Cloud 上启动一个托管的 MyScaleDB 实例。如果你选择此选项,请使用以下命令禁用本地 MyScaleDB 实例启动:
docker-composeup--scalemyscaledb=0-d
接下来,使用 pip 安装 MyScale Telemetry 包以及 LangChain,LangChain OpenAI 集成和Ragas:
pipinstallmyscale-telemetrylangchain_openairagas
下一步是构建一个简单的 LangChain 链,并将其与MyScaleCallbackHandler集成以收集跟踪数据,如下所示:
importos
frommyscale_telemetry.handlerimportMyScaleCallbackHandler
fromoperatorimportitemgetter
fromlangchain_core.output_parsersimportStrOutputParser
fromlangchain_core.promptsimportChatPromptTemplate
fromlangchain_openaiimportChatOpenAI,OpenAIEmbeddings
fromlangchain_community.vectorstoresimportMyScale
fromlangchain_community.vectorstores.myscaleimportMyScaleSettings
fromlangchain_core.runnablesimportRunnableConfig
#setuptheenvironmentvariablesforOpenAIandMyScaleCloud/MyScaleDB:
os.environ["OPENAI_API_KEY"]="YOUR_OPENAI_KEY"
os.environ["MYSCALE_HOST"]="YOUR_MYSCALE_HOST"
os.environ["MYSCALE_PORT"]="YOUR_MYSCALE_HOST"
os.environ["MYSCALE_USERNAME"]="YOUR_MYSCALE_USERNAME"
os.environ["MYSCALE_PASSWORD"]="YOUR_MYSCALE_PASSWORD"
#createavectorstoreandretrieverusingMyScaleandOpenAIembeddings:
texts=[
"HarrisonworkedatKensho.",
"Aliceisasoftwareengineer.",
"Bobenjoyshikingonweekends.",
"Claireisstudyingdatascience.",
"Davidworksatatechstartup.",
"Evalovesplayingthepiano.",
"Frankisagraphicdesigner.",
"Graceisanartificialintelligenceresearcher.",
"Henryisafreelancewriter.",
"Isabelislearningmachinelearning."
]
myscale_settings=MyScaleSettings()
myscale_settings.index_type='SCANN'
vectorstore=MyScale.from_texts(texts,embedding=OpenAIEmbeddings(),config=myscale_settings)
retriever=vectorstore.as_retriever()
#setupthellmandprompttemplate:
model=ChatOpenAI()
template="""Answerthequestionbasedonlyonthefollowingcontext:
{context}
Question:{question}
"""
prompt=ChatPromptTemplate.from_template(template)
#createthechain
chain=(
{
"context":itemgetter("question")|retriever,
"question":itemgetter("question"),
}
|prompt
|model
|StrOutputParser()
)
#integrateMyScaleCallbackHandlertocapturetracedataduringthechainexecution:
chain.invoke({"question":"wheredidharrisonwork"},config=RunnableConfig(
callbacks=[
MyScaleCallbackHandler()
]
))
成功运行后,你将在 MyScaleDB 中的otel.otel_traces表中找到相应的跟踪数据。
请参阅 MyScale Telemetry 自定义参数文档以自定义MyScaleCallbackHandler。
为了从 LLM 应用程序运行时轻松清晰地显示通过 MyScale Telemetry 收集的跟踪数据,我们还提供了 Grafana 跟踪仪表板。仪表板允许用户监控LLM应用程序的状态,类似于 LangSmith,使调试和改进其性能变得更加容易。Docker Compose 示例在 http://localhost:3000 启动了一个 Grafana 实例。使用用户名admin和密码admin登录。
在使用 MyScale Telemetry 处理程序收集跟踪数据后,请按照以下步骤在 Grafana中 设置 MyScale 跟踪仪表板:
myscaledb9000defaultdefaultMyScale 跟踪仪表板,类似于 LangSmith,提供了对 LLM 应用程序运行时行为的全面洞察。它显示了有助于调试、优化和理解应用程序性能的关键信息。
仪表板显示LangChain应用程序中每个函数的执行时间,帮助您识别性能瓶颈。
仪表板提供了链的总体输入和输出的详细视图,使跟踪应用程序中的数据流变得容易。
它显示数据库检索器返回的特定数据,允许您验证是否正在获取和使用正确的数据。
你可以查看生成并发送到 LLM 的确切提示,这对于确保所提出问题的准确性和相关性至关重要。
还显示了 ChatOpenAI 生成的输出,提供了LLM对提示的响应的清晰度。此外,显示了令牌使用详情,以帮助您监控和优化与LLM API调用相关的成本。
存储在 MyScaleDB 中的跨度数据可以用来分析和评估 RAG pipeline 与 Ragas,这是一个流行的开源 RAG 评估框架。
以下 Python 代码演示了如何通过评估检索的上下文和生成的答案来使用 Ragas 评分跟踪:
importos
fromdatasetsimportDataset
fromragasimportevaluate
fromragas.metricsimportfaithfulness,answer_relevancy,context_utilization
fromclickhouse_connectimportget_client
defscore_with_ragas(query,chunks,answer):
test_dataset=Dataset.from_dict({"question":[query],"contexts":[chunks],"answer":[answer]})
result=evaluate(test_dataset,metrics=[faithfulness,answer_relevancy,context_utilization])
returnresult
defevaluate_trace(question,topk,client,database_name,table_name):
trace_id,answer=client.query(
f"SELECTTraceId,SpanAttributes['output']asAnswerFROM{database_name}.{table_name}WHERESpanAttributes['question']='{question}'ANDParentSpanId=''"
).result_rows[0]
span_dict=client.query(
f"SELECTSpanAttributesFROM{database_name}.{table_name}WHERETraceId='{trace_id}'ANDSpanKind='retriever'"
).result_rows[0][0]
contexts=[span_dict.get(f"documents.{i}.content")foriinrange(topk)]
print(score_with_ragas(question,contexts,answer))
test_question="wheredidharrisonwork"
client=get_client(
host=os.getenv("MYSCALE_HOST"),
port=int(os.getenv("MYSCALE_PORT")),
username=os.getenv("MYSCALE_USERNAME"),
password=os.getenv("MYSCALE_PASSWORD"),
)
evaluate_trace(test_question,4,client,"otel","otel_traces")
运行示例后,你可以使用 Ragas 提供的分数评估你的 RAG pipeline 性能。
MyScale Telemetry 为改善 LLM 应用程序的可观测性和评估提供了一个强大、开源的解决方案。通过与 LangChain Callbacks 无缝集成,它捕获详细的跟踪数据并将其存储在 MyScaleDB 中,使诊断问题、优化性能和理解应用程序行为变得更加容易。
Grafana 中的 MyScale 跟踪仪表板提供了这些跟踪数据的清晰可视化,帮助您有效地监控和调试你的 LLM 应用程序。关键洞察包括函数执行时间、输入和输出跟踪、DB 检索器返回、提示信息、ChatOpenAI 输出和令牌使用情况。
此外,将 Ragas 与 MyScale Telemetry 集成允许全面评估 RAG pipeline。使用存储在 MyScaleDB 中的跟踪数据,Ragas 可以评估指标,如忠实度、答案相关性和上下文利用,确保高质量的结果和持续改进。
为什么不尝试使用 MyScale Telemetry 和 Grafana 仪表板,充分利用这些强大的工具呢?如果有任何问题或需要进一步的帮助,请随时联系我们的 MyScale Discord支持团队。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |