维护测试监控LLM应用

大模型学习笔记七:LLM应用 1)管理一个 LLM 应用的全生命周期,需要用到以下工具:1、调试 Prompt 的 Playground2、测试/验证系统的相关指标3、数据集管理4、各种指标监控与统计:访问量、响应时长、Token费等等2)根据自己的技术栈,选择:1、LangFuse:开源平台,支持 LangChain 和原生 OpenAI API2、LangSmith: LangChain 的原始管理平台3、Prompt Flow:开源平台,支持 Semantic Kernel。 阅读详情

维护一个生产级的 LLM 应用,我们需要做什么?

  1. 各种指标监控与统计:访问记录、响应时长、Token 用量、计费等等
  2. 调试 Prompt
  3. 测试/验证系统的相关评估指标
  4. 数据集管理(便于回归测试)
  5. Prompt 版本管理(便于升级/回滚)

针对以上需求,我们介绍两个生产级 LLM App 维护平台

  1. LangFuse: 开源 + SaaS(免费/付费),LangSmith 平替,可集成 LangChain 也可直接对接 OpenAI API;
  2. LangSmith: LangChain 的官方平台,SaaS 服务(免费/付费),非开源,企业版支持私有部署;

1、LangFuse

开源,支持 LangChain 集成或原生 OpenAI API 集成

官方网站:https://langfuse.com/

项目地址:https://github.com/langfuse

文档地址:https://langfuse.com/docs

API文档:https://api.reference.langfuse.com/

  • Python SDK: https://python.reference.langfuse.com/

  • JS SDK: https://js.reference.langfuse.com/

  1. 通过官方云服务使用:
    • 注册: cloud.langfuse.com
    • 创建 API Key
LANGFUSE_SECRET_KEY="sk-lf-..."
LANGFUSE_PUBLIC_KEY="pk-lf-..."
LANGFUSE_HOST="https://cloud.langfuse.com" # EU 服务器
# LANGFUSE_HOST="https://us.cloud.langfuse.com" # US 服务器
  1. 通过 Docker 本地部署
# Clone repository
git clone https://github.com/langfuse/langfuse.git
cd langfuse

# Run server and db
docker compose up -d
# 在自己部署的系统中生成上述两个 KEY
# 并在环境变量中指定服务地址

LANGFUSE_SECRET_KEY="sk-lf-..."
LANGFUSE_PUBLIC_KEY="pk-lf-.."
LANGFUSE_HOST="http://localhost:3000"
# !pip install langfuse==2.43.2

1.1、通过装饰器记录

from langfuse.decorators import observe, langfuse_context
from langfuse.openai import openai  # OpenAI integration
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())


@observe()
def run():
    return openai.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {
   
   "role": "user", "content": "对我说Hello, World!"}
        ],
    ).choices[0].message.content


print(run())
langfuse_context.flush()
Hello, World! How are you today?

1.1.1、几个基本概念

  • Trace 一般表示用户与系统的一次交互,其中记录输入、输出,也包括自定义的 metadata 比如用户名、session id 等;
  • 一个 trace 内部可以包含多个子过程,这里叫 observarions;
  • Observation 可以是多个类型:
    • Event 是最基本的单元,用于记录一个 trace 中的每个事件;
    • Span 表一个 trace 中的一个"耗时"的过程;
    • Generation 是用于记录与 AI 模型交互的 span,例如:调用 embedding 模型、调用 LLM。
  • Observation 可以嵌套使用。
    在这里插入图片描述

1.1.2、observe() 装饰器的参数

def observe(
	self,
	*,
	name: Optional[str] = None, # Trace 或 Span 的名称,默认为函数名
	as_type: Optional[Literal['generation']] = None, # 将记录定义为 Observation (LLM 调用)
	capture_input: bool = True, # 记录输入
	capture_output: bool = True, # 记录输出
	transform_to_string: Optional[Callable[[Iterable], str]] = None # 将输出转为 string
) -> Callable[[~F], ~F]:
from langfuse.decorators import observe, langfuse_context
from langfuse.openai import openai
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())


@observe(name="HelloWorld")
def run():
    return openai.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {
   
   "role": "user", "content": "对我说Hello, World!"}
        ],
    ).choices[0].message.content


print(run())
langfuse_context.flush()
Hello, World! How can I assist you today?

1.1.3、通过 langfuse_context 记录 User ID、Metadata 等

from langfuse.decorators import observe, langfuse_context
from langfuse.openai import openai
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())


@observe()
def run():
    langfuse_context.update_current_trace(
        name="HelloWorld",
        user_id="rivers",
        tags=["test", "demo"]
    )
    return openai.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {
   
   "role": "user", "content": "对我说Hello, World!"}
        ],
    ).choices[0].message.content


print(run())
langfuse_context.flush()
Hello, World! Nice to meet you.

1.2、通过 LangChain 的回调集成

from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())


from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough

model = ChatOpenAI(model="gpt-3.5-turbo")

prompt = ChatPromptTemplate.from_messages([
    HumanMessagePromptTemplate.from_template("Say hello to {input}!")
])


# 定义输出解析器
parser = StrOutputParser()

chain = (
    {
   
   "input": RunnablePassthrough()}
    | prompt
    | model
    | parser
)

from langfuse.decorators import langfuse_context, observe


@observe()
def run():
    langfuse_context.update_current_trace(
        name="LangChainDemo",
        user_id="rivers",
    )

    # 获取当前 LangChain 回调处理器
    langfuse_handler = langfuse_context.get_current_langchain_handler()

    return chain.invoke(input="rivers", config={
   
   "callbacks": [langfuse_handler]})


print(run())
langfuse_context.flush()  # Langfuse 回传记录是异步的,可以通过 flush 强制更新
Hello rivers! You flow so gracefully, shaping landscapes and sustaining life. Thank you for your beauty and power.

1.3、构建一个实际应用

AGI 课堂跟课助手,根据课程内容,判断学生问题是否需要老师解答

  1. 判断该问题是否需要老师解答,回复’Y’或’N’
  2. 判断该问题是否已有同学问过

1.3.1、用 Trace 记录一个多次调用 LLM 的过程

TRACE (id: trace_id)
|
|-- SPAN: LLMCain (id: generated by Langfuse)
|   |
|   |-- GENERATION: OpenAI (id: generated by Langfuse)
|
|-- SPAN: LLMCain (id: generated by 'next_span_id')
|   |
|   |-- GENERATION: OpenAI (id: generated by Langfuse)
from dotenv import load_dotenv, find_dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

_ = load_dotenv(find_dotenv())

# 构建 PromptTemplate
from langchain.prompts import PromptTemplate

need_answer = PromptTemplate.from_template("""
*********
你是AIGC课程的助教,你的工作是从学员的课堂交流中选择出需要老师回答的问题,加以整理以交给老师回答。

课程内容:
{outlines}
*********
学员输入:
{user_input}
*********
如果这是一个需要老师答疑的问题,回复Y,否则回复N。
只回复Y或N,不要回复其他内容。""")

check_duplicated = PromptTemplate.from_template(
我的AI学习 ai维护工具之langfuse as_type: Optional[Literal[‘generation’]] = None, # 将记录定义为 Observation (LLM 调用)transform_to_string: Optional[Callable[[Iterable], str]] = None # 将输出转为 string。要用LangFuse的云服务,首先要在LangFuse官网上注册,注册完后将页面拉倒最后,点免费的SignUp,API文档:https://api.reference.langfuse.com/ 阅读详情

相关推荐

Channel Engineering:构建可靠LLM应用的工程化实践框架

在大型语言模型(LLM)应用开发中,工程纪律的缺失往往导致生产环境中的逻辑失控和输出不稳定问题。Channel Engineering作为一种工程实践框架,通过在LLM的输入输出通道上建立严格的验证机制来解决这一挑战。其核心原理是在数据处理流程中设置验证门(Validation Gates),对输入内容、上下文构建和模型输出进行系统性校验,确保数据流的可控性和安全性。这一方法的技术价值在于将软件工程的确定性要求与LLM的非确定性特性有效结合,显著提升应用的可靠性和可维护性。在实际应用场景中,Channel

weixin_33508411的博客 321

LLM通道工程:从提示词优化到系统化AI应用开发

大型语言模型(LLM)作为人工智能的核心技术,通过深度学习算法实现对自然语言的理解和生成。其原理基于Transformer架构,通过自注意力机制捕捉文本中的长距离依赖关系。在工程实践中,LLM的价值体现在能够自动化处理复杂语言任务,但实际应用需要系统的工程化方法支持。通道工程(Channel Engineering)正是将传统软件工程的成熟方法论引入LLM开发的关键技术,它涵盖从输入处理、上下文管理到输出解析的完整数据流优化。在AI应用开发场景中,通过标准化流程和模块化设计,通道工程能有效解决提示词工程(P

weixin_32830601的博客 298

不止于HTTPS请求:用VS2022编译的libcurl玩转文件上传和代理设置

本文详细介绍了如何使用VS2022编译的libcurl库实现文件上传和高级代理配置。通过实战代码示例,展示了多部分表单上传、二进制数据上传以及各种代理设置技巧,帮助C++开发者提升网络编程能力。

weixin_28595749的博客 201

历年北京理工大学复试专业综合题

。

A place to record sth. 2万+

wsl --install 不执行,显示帮助信息

在安装使用wsl的时候碰到了wsl --install 不执行,而显示帮助信息,提供了解决方案。

水滴爬呀爬 2754

Python无法拒绝的表白界面(完整代码)

Python制作一个无法拒绝的表白界面的完整代码。

AIGC 5万+

COSMO-RS理论:流体相热力学预测的核心模型与技术突破

摘要:COSMO-RS模型通过量子化学计算分子表面电荷分布,实现了从微观量子尺度到宏观化工过程的热力学预测。该模型基于介电连续介质理论,将分子表面片段化处理,通过σ-剖面描述电荷分布,并计算片段间的静电失配能和氢键能。其核心算法通过自洽化学势方程求解活度系数,克服了传统模型依赖实验参数的局限。随着技术进步,模型引入了高阶描述符和色散力修正,提升了预测精度。在药物研发、化工分离等领域广泛应用,但仍存在对长程有序结构预测不足等局限性。该模型为复杂体系的热力学性质预测提供了重要理论工具。

ASKCOS博客 966

机器学习的低代码与无代码平台:便捷入门之路

机器学习领域正涌现出大量低代码和无代码平台,使非技术人员也能轻松应用AI技术。低代码平台(如PyCaret、H2O AutoML)需少量编程但灵活性强,而无代码工具(如Google Cloud AutoML、Teachable Machine)则完全无需编程基础。这些平台覆盖图像识别、文本处理、业务预测等多种场景,适合快速部署简单项目。但专业人士仍需注意,这些工具无法替代复杂场景下的定制化开发。随着技术进步,低门槛AI工具正在改变各行业的创新方式。

2501_90323865的博客 151

Qt软件开发: 开发MQTT客户端软件,模拟硬件登录各大主流MQTT平台完成通信

此软件是使用QT编写MQTT客户端(根据mqtt官方文档3.1.1,自己实现过程代码,没有使用其他库,稳定,方便移植),模拟硬件登录各大主流的MQTT物联网服务器,完成主题订阅、发布等操作,实现数据通信交互。 已经测试OneNET、阿里云IOT、华为云IOT、百度IOT、电信IOT、原子云IOT等等常用的物联网云平台,都可以正常实现数据通信,只要云平台支持标准MQTT协议都可以使用此软件进行登录测试。 特别是大家没有硬件,想测试与MQTT物联网云服务器通信的,此软件是非常的方便。使用简单,比官方的软件操作

1万+

第9.3章 从CMake基础到自动驾驶实战:构建跨平台C/C++项目的全能指南

《CMake构建实战:项目开发卷》精要指南 本文系统梳理了许宏旭《CMake构建实战》核心内容,涵盖C++构建全流程: 基础构建:详解MSVC/GCC编译器使用、Makefile编写及静态/动态库构建方法 CMake核心:解析语法结构、变量控制、文件操作等关键命令,阐述项目全生命周期管理 实战应用:通过快速排序、手写数字识别项目演示现代CMake实践,特别针对自动驾驶领域给出多传感器融合、SLAM等场景的CMake配置方案 特色价值:本书填补了官方文档实例不足的空白,提供300+代码示例,是掌握工业级C++

行知SLAM 1335

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: LangChain
下一篇: 大模型Agent
SunnyRivers
SunnyRivers 领域专家: 大数据技术领域 领域专家: 大数据技术领域
博客等级 码龄10年 2万+粉丝 598原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值