当前位置: 首页 > news >正文

【observability】【observability06】使用PostHog和Langfuse分析和调试LlamaIndex应用程序

1. 案例概述

本案例展示了如何使用LlamaIndex构建一个RAG(检索增强生成)应用程序,使用Langfuse追踪操作步骤,并在PostHog中分析数据。具体来说,我们将创建一个关于刺猬护理的聊天应用程序,使用Mistral模型处理查询,并通过Langfuse和PostHog进行监控和分析。

关键组件介绍
Langfuse

Langfuse是一个开源的LLM工程平台,旨在帮助工程师理解和优化用户与语言模型应用的交互。它提供跟踪、调试和改进LLM性能的工具,可用于真实世界的用例。Langfuse提供托管云解决方案和本地或自托管部署选项。

PostHog

PostHog是一个流行的产品分析选择。将Langfuse的LLM分析与PostHog的产品分析相结合,可以轻松实现:

  • 分析用户参与度:确定用户与特定LLM功能的交互频率,了解他们的整体活动模式
  • 关联反馈与行为:查看在Langfuse中捕获的用户反馈如何与PostHog中的用户行为相关联
  • 监控LLM性能:跟踪和分析模型成本、延迟和用户反馈等指标,以优化LLM性能
LlamaIndex

LlamaIndex是一个数据框架,旨在将LLM与外部数据源连接。它帮助有效地结构化、索引和查询数据,使开发人员更容易构建高级LLM应用程序。

2. 技术栈与核心依赖

核心依赖库
  • llama-index- LlamaIndex核心库,用于构建RAG应用
  • llama-index-llms-mistralai- Mistral AI模型集成
  • llama-index-embeddings-mistralai- Mistral AI嵌入模型集成
  • langfuse- Langfuse客户端,用于LLM追踪和分析
  • openinference-instrumentation-llama-index- OpenInference LlamaIndex工具,用于自动捕获操作
  • wget- 用于下载数据文件
  • nest_asyncio- 允许同步和异步代码一起使用

注意:本示例需要Mistral API密钥和Langfuse API密钥才能正常运行。

3. 环境配置

步骤1:安装依赖
%pip install llama-index llama-index-llms-mistralai llama-index-embeddings-mistralai nest_asyncio --upgrade %pip install langfuse openinference-instrumentation-llama-index wget
步骤2:配置API密钥
import os # 设置Mistral API密钥 os.environ["MISTRAL_API_KEY"] = "***" # 设置Langfuse API密钥 os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-..." os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-..." os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com" # 🇪🇺 欧洲区域 # os.environ["LANGFUSE_HOST"] = "https://us.cloud.langfuse.com" # 🇺🇸 美国区域
步骤3:导入必要的库
# 确保同步和异步代码可以一起使用 import nest_asyncio nest_asyncio.apply() # 导入并设置LlamaIndex from llama_index.llms.mistralai import MistralAI from llama_index.embeddings.mistralai import MistralAIEmbedding from llama_index.core import Settings # 导入Langfuse相关库 from langfuse import get_client, observe from openinference.instrumentation.llama_index import LlamaIndexInstrumentor # 其他工具 import wget from llama_index.core import SimpleDirectoryReader, VectorStoreIndex

4. 案例实现

步骤1:设置LlamaIndex和Mistral
# 定义LLM和嵌入模型 llm = MistralAI(model="open-mixtral-8x22b", temperature=0.1) embed_model = MistralAIEmbedding(model_name="mistral-embed") # 在Settings对象中设置LLM和嵌入模型 Settings.llm = llm Settings.embed_model = embed_model

这里我们使用Mistral的open-mixtral-8x22b模型作为语言模型,mistral-embed作为嵌入模型,并将它们设置为LlamaIndex的全局默认设置。

步骤2:初始化Langfuse
from langfuse import get_client langfuse = get_client() # 验证连接 if langfuse.auth_check(): print("Langfuse客户端已认证并准备就绪!") else: print("认证失败。请检查您的凭据和主机。") # 初始化LlamaIndex工具 LlamaIndexInstrumentor().instrument()

我们初始化Langfuse客户端并验证连接,然后使用OpenInference LlamaIndex工具自动捕获LlamaIndex操作并将OpenTelemetry (OTel) spans导出到Langfuse。

步骤3:下载数据
import wget # 下载刺猬护理指南PDF url = "https://www.pro-igel.de/downloads/merkblaetter_engl/wildtier_engl.pdf" wget.download(url, "./hedgehog.pdf") # 使用LlamaIndex SimpleDirectoryReader加载PDF hedgehog_docs = SimpleDirectoryReader( input_files=["./hedgehog.pdf"] ).load_data()

我们下载一个关于刺猬护理的PDF文件,并使用LlamaIndex的SimpleDirectoryReader加载它,作为我们RAG应用的数据源。

步骤4:构建刺猬文档的RAG
from llama_index.core import VectorStoreIndex # 创建向量索引 hedgehog_index = VectorStoreIndex.from_documents(hedgehog_docs) # 创建可查询引擎 hedgehog_query_engine = hedgehog_index.as_query_engine(similarity_top_k=5) # 查询引擎并打印响应 response = hedgehog_query_engine.query("哪些刺猬需要帮助?") print(response)

我们使用VectorStoreIndex创建刺猬文档的向量嵌入,然后将其转换为可查询引擎,以便基于查询检索信息。

步骤5:实现用户反馈(可选)
@observe() def hedgehog_helper(user_message): response = hedgehog_query_engine.query(user_message) trace_id = langfuse.get_current_trace_id() print(response) return trace_id # 调用函数并获取trace_id trace_id = hedgehog_helper("我可以把刺猬当作宠物养吗?") # 为trace评分,例如添加用户反馈 langfuse.create_score( trace_id=trace_id, name="user-explicit-feedback", value=0.9, data_type="NUMERIC", # 可选,如果未提供则推断 comment="很好知道!", # 可选 )

我们使用Langfuse的observe()装饰器自动为顶级函数创建trace,为任何嵌套函数创建spans。然后使用create_score()方法存储用户反馈(如赞/踩或评论),这些分数可以在PostHog中进行分析。

步骤6:在PostHog中查看数据

最后,我们将PostHog连接到我们的Langfuse账户。步骤如下:

  1. 注册免费的PostHog账户
  2. 从项目设置中复制项目API密钥和主机
  3. 在Langfuse仪表板中,点击设置并向下滚动到集成部分找到PostHog集成
  4. 点击配置并粘贴您的PostHog主机和项目API密钥
  5. 点击启用然后保存

Langfuse将开始每天将您的数据导出到PostHog一次。您可以使用仪表板模板快速设置相关洞察,分析模型成本、用户反馈和延迟。

5. 案例效果

通过本示例,您可以实现以下效果:

  • 全面的LLM追踪- 自动捕获LlamaIndex操作的所有步骤,包括查询、嵌入、检索和生成
  • 用户反馈收集- 使用Langfuse Scores收集用户反馈,如赞/踩或评论
  • 跨平台分析- 将Langfuse的LLM分析与PostHog的产品分析相结合,获得更全面的洞察
  • 性能监控- 跟踪和分析模型成本、延迟和用户反馈等指标
  • 可视化仪表板- 使用PostHog的仪表板模板可视化LLM指标和用户行为
集成架构

本示例的集成架构如下:

  • LlamaIndex处理查询并生成响应
  • OpenInference LlamaIndex工具自动捕获操作并导出到Langfuse
  • Langfuse收集、存储和分析LLM数据
  • PostHog从Langfuse导入数据,提供产品分析和可视化

6. 案例实现思路

本案例的实现基于以下思路:

  1. 分层集成- 通过多个层次的集成实现端到端的可观测性:LlamaIndex处理查询,Langfuse捕获LLM数据,PostHog提供产品分析
  2. 自动化追踪- 使用OpenInference LlamaIndex工具自动捕获LlamaIndex操作,无需手动添加追踪代码
  3. 标准化数据模型- 使用OpenTelemetry标准确保数据的一致性和互操作性
  4. 用户反馈循环- 通过Langfuse Scores收集用户反馈,并在PostHog中分析,形成反馈循环
  5. 可视化分析- 利用PostHog的仪表板功能提供直观的数据可视化和分析

这种设计使得开发者可以全面了解LLM应用的性能和用户交互,从而持续改进应用质量。

7. 扩展建议

基于本示例,您可以考虑以下扩展方向:

  • 多模型比较- 扩展应用以支持多个LLM模型,并在PostHog中比较它们的性能
  • 实时监控- 设置实时警报,当关键指标(如延迟、错误率)超过阈值时通知
  • A/B测试- 使用PostHog的A/B测试功能测试不同的提示策略或检索参数
  • 自定义评估指标- 实现自定义评估指标,如响应相关性、准确性等
  • 用户细分- 在PostHog中创建用户细分,分析不同用户群体的行为模式
  • 成本优化- 基于成本数据优化模型使用和查询策略

8. 总结

本案例展示了如何使用LlamaIndex、Langfuse和PostHog构建一个全面可观测的RAG应用程序。通过集成这三个平台,我们实现了从查询处理到性能监控再到用户行为分析的完整闭环。

这种多平台集成的优势在于:

  • 全面的可观测性- 从技术性能到用户行为的多维度监控
  • 数据驱动的优化- 基于实际使用数据和用户反馈持续改进应用
  • 灵活的分析能力- 结合LLM专业分析和通用产品分析的优点

这种方法为构建高质量、用户友好的LLM应用程序提供了强大的工具和洞察,帮助开发者在复杂的LLM应用开发过程中做出明智的决策。

http://www.cnnetsun.cn/news/2816656.html

相关文章:

  • Three.js项目避坑:Shader流光特效性能优化与常见问题排查指南
  • Overleaf新手必看:从编译报错到排版美化,我遇到的6个坑和填坑方法
  • Java 正则
  • 别再手动改价格了!SAP物料主数据维护BAPI:BAPI_MATERIAL_SAVEDATA参数详解与填表示例
  • 别再死记硬背了!用Python+NumPy可视化理解传输线方程与特性阻抗
  • 组件显示和隐藏的优雅过渡:TransitionEffect 在 HarmonyOS6 PC 端的实战
  • Weka数据预处理实战:用‘Discretize’滤镜搞定连续数据离散化,让模型更稳定(以Iris数据集为例)
  • Android启动安全实战:手把手教你用avbtool给dtbo分区镜像签名(附完整命令)
  • 手把手教你用纯C语言(只用stdio.h)实现SM4国密算法,附完整可运行代码
  • Protege新手避坑指南:用Cellfie插件从Excel导入OWL数据,我踩过的4个坑都在这了
  • Windows/Linux双系统下Kettle命令行工具(Pan.bat/Kitchen.sh)的完整配置与避坑手册
  • 别再让Flask开发服务器警告烦你了:手把手教你用Gunicorn+Gevent部署到生产环境
  • 别再死记硬背了!用这5个Meshlab高频场景,带你真正玩转快捷键和核心菜单
  • 新手画板必看:一个MCU复位脚引发的ESD血案与PCB布局避坑指南
  • STM32CubeMX串口调试避坑指南:从时钟树配置到串口助手收不到数据的5个常见问题
  • UVa1059/LA2395 Jacquard Circuits
  • TMC2209数据手册没细说的:串口读写通用寄存器的避坑实战(Linux C代码示例)
  • Vue项目里用Stimulsoft Reports.js做报表,从设计到打印的完整配置流程
  • 从Arduino项目反推:电路、模电、数电知识到底怎么用?
  • 从游戏角色到工业协议:一个有趣的比喻帮你彻底搞懂C#中的ModbusRTU主从通信
  • 汽车ECU开发避坑指南:LIN总线帧头(Header)解析与常见同步错误排查
  • 别再手动修音了!用Melodyne Studio 5.3一键分析人声,Adobe Audition内录素材导入全攻略
  • 从迭代器到结构化绑定:一文看懂C++ unordered_map遍历方式的演进与最佳实践
  • 用STM32CubeMX+Keil5快速配置RZ7886电机驱动(附完整代码包)
  • 【2027最新】基于SpringBoot+Vue的学生网上选课系统管理系统源码+MyBatis+MySQL
  • 码头船只货柜管理系统毕业设计源码
  • HLK-W806驱动ST7567 LCD避坑指南:从初始化失败到完美显示的调试全记录
  • 保姆级教程:手把手教你用OBC4为不同总账科目组(如资产、负债)设置差异化的字段必填规则
  • 别再手动配了!用这个技巧批量管理SAP Fiori静态磁贴和目录
  • 别只盯着单片机:用CD4511和共阴数码管,重温数字电路的‘硬核’显示逻辑