EAS中开启基于LLM应用链路追踪(Tracing)

本文为您介绍如何在部署服务时增加链路追踪功能。

背景信息

随着大语言模型(LLM)技术的广泛应用,企业在构建基于LLM的应用时,面临诸多挑战,例如输出不可预测、调用链路复杂、性能瓶颈难以发现以及缺乏细粒度的可观测性等。为应对这些挑战,EAS服务支持启用链路追踪功能。

链路追踪功能的核心目标是提升应用可观测性,帮助您更好地评估LLM应用。启用链路追踪功能后,EAS服务会自动接入阿里云的ARMS(应用实时监控服务),以实现以下功能:

  • 调用链可视化:提供清晰的调用链日志,帮助您直观了解请求的完整路径。

  • 性能监控:跟踪关键性能指标(如响应时间、Token消耗和错误数等),及时发现性能瓶颈。

  • 问题定位与根因分析:通过Trace ID快速定位问题,并结合上下文进行根因分析。

  • 评估工具:基于调用链数据提供评估工具,用于验证LLM应用输出结果的准确性和可靠性。

基本概念

  • 调用链(Trace)

    调用链是分布式系统中一次事务或请求的完整执行路径,记录了请求在各个服务或模块中的流转过程。调用链由多个Span组成。通过调用链,可以直观地了解请求的流转路径,快速定位性能瓶颈或错误来源。TraceID是调用链的唯一标识符。通过TraceID,可查询具体调用的详情和日志。

  • 跨度(Span)

    Span是调用链中的一个基本单元,表示某个具体操作的执行片段,用于记录每个操作的详细信息,包括操作名称、起始时间、结束时间等。

  • Python探针

    Python 探针是一种工具,用于自动采集 Python 应用的调用链数据和性能指标。在部署 EAS 服务时,通过安装 Python 探针启用链路追踪功能。

  • 评估

    针对用户提出的问题及LLM应用生成的答案,从多个维度进行综合评价。具体的评估维度名称可联系您的商务经理进行确认。

使用限制

本方案仅支持基于LangChain、Llama-indexDashscope开发的LLM应用类型。

前提条件

步骤一:准备工作

为完整说明从服务部署、服务调用到链路查看的全流程,本方案提供了一个简单的预测服务示例。

该代码是基于Dashscope API开发的一个简单预测服务。它使用了Flask框架来构建一个Web服务,并通过DashscopeGeneration.call方法调用模型来进行文本生成。在首次使用Dashscope前,请先完成开通流程并获取API-KEY,详情请参见首次调用通义千问API。随后,在部署服务时,将DASHSCOPE_API_KEY设置为环境变量,以便正确访问API服务。其代码文件app.py示例内容如下:

import os
import json
import flask
import dashscope

app = flask.Flask(__name__)

def run_query(query):
    """run a query."""

    response = dashscope.Generation.call(
        api_key=os.getenv('DASHSCOPE_API_KEY'),
        model="qwen-plus",
        messages=[
            {'role': 'system', 'content': 'You are a helpful assistant.'},
            {'role': 'user', 'content': query}
        ],
        result_format='message'
    )
    return response


@app.route('/api/trace_demo', methods=['POST'])
def query():
    """
    post data example:
    {
        "query": "capital of china"
    }
    """
    data = flask.request.get_data("utf-8")
    query = json.loads(data).get('query', '')
    response = run_query(query)
    return response.output.choices[0].message.content


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)  

步骤二:开启链路追踪

在部署EAS服务时,可在服务功能区域通过打开链路追踪开关来启用链路追踪功能,并根据提示信息判断所用镜像是否内置链路追踪采集组件,按需配置安装探针和使用ARMS Python探针启动应用的相关命令。如需了解更多配置详情,请参见手动安装Python探针

  • 选择已内置链路追踪采集组件的镜像:打开链路追踪开关后,即可一键启用链路追踪功能,无需额外配置参数。

  • 选择未内置链路追踪采集组件的镜像:打开链路追踪开关后,需根据提示信息配置三方库和运行命令:

    参数

    描述

    运行命令

    增加aliyun-bootstrap -a install && aliyun-instrument python app.py。该命令用于安装探针和使用ARMS Python探针启动应用,其中app.py是镜像里配置的用于提供预测服务的主文件。三方库配置需增加aliyun-bootstrap,用于从PyPI仓库下载探针安装器。

    三方库配置

    增加aliyun-bootstrap,用于从PyPI仓库下载探针安装器。

image

本方案以使用未内置链路追踪采集组件的镜像,并以运行示例代码为例进行说明。以下是自定义部署EAS服务时的关键参数配置说明,具体操作,请参见通过控制台部署。服务部署成功后,您可以:

参数

描述

环境信息

部署方式

选择镜像部署

镜像配置

本方案选择默认的官方镜像 > python-inference:3.9-ubuntu2004

您也可以在镜像地址页签,输入已准备的自定义镜像。

运行命令

本方案配置为aliyun-bootstrap -a install && aliyun-instrument python /mnt/data/app.py

其中/mnt/data/app.py为已挂载的示例代码文件。

代码配置

因未将示例代码文件集成到镜像中,需将其挂载到服务实例中。以OSS挂载为例,单击OSS,并配置以下参数:

  • Uri:选择示例代码文件所在的OSS目录。如何将代码文件上传到对象存储OSS目录中,请参见控制台快速入门

  • 挂载路径:配置为/mnt/data/。后续将从该路径读取代码文件。

如果您使用自定义镜像,并已在镜像中配置了提供预测服务的主文件,则可以忽略该配置。

环境变量

因示例代码会调用Dashscope API,需单击添加按钮,配置如下环境变量:

三方库配置

将三方库配置为aliyun-bootstrap flask dashscope

服务接入

专有网络(VPC)

使用链路追踪功能必须配置专有网络,请选择该地域下的专有网络(VPC)交换机安全组

EAS服务默认不通公网,运行示例代码需要调用Dashscope API,则需为EAS服务配置具备公网访问能力的专有网络,以确保其能够正常访问公网。具体操作,请参见配置公网连接

交换机

安全组名称

服务功能

链路追踪

打开链路追踪开关,并在环境信息区域,配置三方库和运行命令。

步骤三:查看链路追踪

基于Trace链路提供评估工具,可以帮助开发者验证LLM应用输出结果的准确性和可靠性。具体操作步骤如下:

调用EAS服务

以在线调试为例,您也可以通过API调用EAS服务,详情请参见API调用

  1. 模型在线服务(EAS)页面,单击目标服务操作列下的image>在线调试

  2. Body页签中,根据您定义的预测服务,向指定地址发送请求数据。

    本方案使用示例代码文件app.py中定义的服务接口,示例结果如下:

    image

查看链路信息

  1. 切换到链路追踪页签,查看Trace链路信息。image

  2. 单击目标Trace操作列下的查看链路,进入Trace详情页面。

    该页面提供的Trace数据支持您查看服务的输入、输出及相关日志信息。image

步骤四:评估应用效果

EAS基于Trace链路提供了评估工具,用于验证LLM应用输出结果的准确性和可靠性。具体操作步骤如下:

  1. 链路追踪页签,单击目标Trace操作列下的评估,然后在评估配置面板中,配置以下参数。image

    • 评估指标:为固定配置,暂不支持更改。从以下维度进行评估。

      评估指标

      描述

      正确性

      判断答案是否根据输入和参考文本正确回答问题。

      事实性

      判断答案是否基于输入和参考文本生成,是否存在幻觉。

      检索相关性

      判断检索内容是否与输入问题相关。

    • 模型配置:评估Trace链路使用的大语言模型(LLM)。初始设置后,再次评估时将默认回填。

      参数

      描述

      模型选择

      支持使用以下两种模型:

      • PAI裁判员模型

      • qwen-max(百炼模型)

        说明

      模型Token

      根据选择的模型,填写相应的Token:

    • 提取配置:分别在Query提取配置Answer提取配置Context提取配置区域通过配置下表参数来提取相应内容:

      • Query提取配置:提取用户查询内容(input)。

      • Answer提取配置:提取系统生成的回答信息(output)。

      • Context提取配置:提取提供给系统的文本或背景信息(documents)。

      参数

      描述

      SpanName

      用于查找与SpanName匹配的span。

      JsonPathInSpan

      格式为a.b.c,不允许为空。表示从已经匹配的span的指定元素上提取值。

      JsonPathInSpanValue

      格式为a.b.c,允许为空。表示在找到与JsonPathInSpan对应的元素后,如果该元素内容是JSON字符串格式,则进一步使用JsonPathInSpanValue来提取对应的值。

      您可以单击操作列下的查看链路,从Trace详情页面获取配置内容。配置示例如下表所示:

      提取配置

      如何获取

      示例值

      Query提取配置

      本方案示例为JsonPathInSpanValue无值情况:

      image

      JsonPathInSpanValue有值情况,请参考下图示例

      image

      • JsonPathInSpanValue无值

        • SpanName:LLM

        • JsonPathInSpan:attributes.input.value

        • JsonPathInSpanValue:因JsonPathInSpan元素内容非JSON字符串格式,此处为空。

      • JsonPathInSpanValue有值

        • SpanName:LLM

        • JsonPathInSpanattributes.input.value

        • JsonPathInSpanValue:因JsonPathInSpan元素内容为JSON字符串格式,此处填写text[0]

      Answer提取配置

      image

      • SpanName:LLM

      • JsonPathInSpanattributes.output.value

      • JsonPathInSpanValue:此处为空。

      Context提取配置

      本方案示例服务不包含Context提取配置。有关Context提取配置的示例,请参考下图:

      image

      • SpanName:retrieve

      • JsonPathInSpanattributes.retrieval.documents[*].document.content

        重要

        Context配置支持使用星号(*)。

      • JsonPathInSpanValue:因JsonPathInSpan元素内容非JSON字符串格式,此处为空。

  2. 参数配置完成后,单击确定

    评估结果列出现如下图示例结果时,表明评估成功,您可以单击评估结果查看详情。image