本文为您介绍如何在部署服务时增加链路追踪功能。
背景信息
随着大语言模型(LLM)技术的广泛应用,企业在构建基于LLM的应用时,面临诸多挑战,例如输出不可预测、调用链路复杂、性能瓶颈难以发现以及缺乏细粒度的可观测性等。为应对这些挑战,EAS服务支持启用链路追踪功能。
链路追踪功能的核心目标是提升应用可观测性,帮助您更好地评估LLM应用。启用链路追踪功能后,EAS服务会自动接入阿里云的ARMS(应用实时监控服务),以实现以下功能:
调用链可视化:提供清晰的调用链日志,帮助您直观了解请求的完整路径。
性能监控:跟踪关键性能指标(如响应时间、Token消耗和错误数等),及时发现性能瓶颈。
问题定位与根因分析:通过Trace ID快速定位问题,并结合上下文进行根因分析。
评估工具:基于调用链数据提供评估工具,用于验证LLM应用输出结果的准确性和可靠性。
基本概念
调用链(Trace)
调用链是分布式系统中一次事务或请求的完整执行路径,记录了请求在各个服务或模块中的流转过程。调用链由多个Span组成。通过调用链,可以直观地了解请求的流转路径,快速定位性能瓶颈或错误来源。TraceID是调用链的唯一标识符。通过TraceID,可查询具体调用的详情和日志。
跨度(Span)
Span是调用链中的一个基本单元,表示某个具体操作的执行片段,用于记录每个操作的详细信息,包括操作名称、起始时间、结束时间等。
Python探针
Python 探针是一种工具,用于自动采集 Python 应用的调用链数据和性能指标。在部署 EAS 服务时,通过安装 Python 探针启用链路追踪功能。
评估
针对用户提出的问题及LLM应用生成的答案,从多个维度进行综合评价。具体的评估维度名称可联系您的商务经理进行确认。
使用限制
本方案仅支持基于LangChain、Llama-index或Dashscope开发的LLM应用类型。
前提条件
步骤一:准备工作
为完整说明从服务部署、服务调用到链路查看的全流程,本方案提供了一个简单的预测服务示例。
该代码是基于Dashscope API开发的一个简单预测服务。它使用了Flask框架来构建一个Web服务,并通过Dashscope的Generation.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仓库下载探针安装器。
本方案以使用未内置链路追踪采集组件的镜像,并以运行示例代码为例进行说明。以下是自定义部署EAS服务时的关键参数配置说明,具体操作,请参见通过控制台部署。服务部署成功后,您可以:
在模型在线服务(EAS)页面,查看服务部署状态。
在ARMS控制台应用列表页面,查看接入的应用。应用名称与EAS服务名称相同。
参数 | 描述 | |
环境信息 | 部署方式 | 选择镜像部署。 |
镜像配置 | 本方案选择默认的 。您也可以在镜像地址页签,输入已准备的自定义镜像。 | |
运行命令 | 本方案配置为 其中 | |
代码配置 | 因未将示例代码文件集成到镜像中,需将其挂载到服务实例中。以OSS挂载为例,单击OSS,并配置以下参数:
如果您使用自定义镜像,并已在镜像中配置了提供预测服务的主文件,则可以忽略该配置。 | |
环境变量 | 因示例代码会调用Dashscope API,需单击添加按钮,配置如下环境变量:
| |
三方库配置 | 将三方库配置为 | |
服务接入 | 专有网络(VPC) | 使用链路追踪功能必须配置专有网络,请选择该地域下的专有网络(VPC)、交换机和安全组。 因EAS服务默认不通公网,运行示例代码需要调用Dashscope API,则需为EAS服务配置具备公网访问能力的专有网络,以确保其能够正常访问公网。具体操作,请参见配置公网连接。 |
交换机 | ||
安全组名称 | ||
服务功能 | 链路追踪 | 打开链路追踪开关,并在环境信息区域,配置三方库和运行命令。 |
步骤三:查看链路追踪
基于Trace链路提供评估工具,可以帮助开发者验证LLM应用输出结果的准确性和可靠性。具体操作步骤如下:
调用EAS服务
以在线调试为例,您也可以通过API调用EAS服务,详情请参见API调用。
在模型在线服务(EAS)页面,单击目标服务操作列下的
>在线调试。
在Body页签中,根据您定义的预测服务,向指定地址发送请求数据。
本方案使用示例代码文件app.py中定义的服务接口,示例结果如下:
查看链路信息
切换到链路追踪页签,查看Trace链路信息。
单击目标Trace操作列下的查看链路,进入Trace详情页面。
该页面提供的Trace数据支持您查看服务的输入、输出及相关日志信息。
步骤四:评估应用效果
EAS基于Trace链路提供了评估工具,用于验证LLM应用输出结果的准确性和可靠性。具体操作步骤如下:
在链路追踪页签,单击目标Trace操作列下的评估,然后在评估配置面板中,配置以下参数。
评估指标:为固定配置,暂不支持更改。从以下维度进行评估。
评估指标
描述
正确性
判断答案是否根据输入和参考文本正确回答问题。
事实性
判断答案是否基于输入和参考文本生成,是否存在幻觉。
检索相关性
判断检索内容是否与输入问题相关。
模型配置:评估Trace链路使用的大语言模型(LLM)。初始设置后,再次评估时将默认回填。
参数
描述
模型选择
支持使用以下两种模型:
PAI裁判员模型
qwen-max(百炼模型)
模型Token
根据选择的模型,填写相应的Token:
裁判员模型:前往裁判员模型页面,开通PAI裁判员模型并获取Token。
qwen-max:如何获取百炼qwen-max模型Token,请参见首次调用通义千问API。
提取配置:分别在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无值情况:
JsonPathInSpanValue有值情况,请参考下图示例
JsonPathInSpanValue无值
SpanName:LLM
JsonPathInSpan:attributes.input.value
JsonPathInSpanValue:因JsonPathInSpan元素内容非JSON字符串格式,此处为空。
JsonPathInSpanValue有值
SpanName:LLM
JsonPathInSpan:
attributes.input.value
JsonPathInSpanValue:因JsonPathInSpan元素内容为JSON字符串格式,此处填写
text[0]
。
Answer提取配置
SpanName:LLM
JsonPathInSpan:
attributes.output.value
JsonPathInSpanValue:此处为空。
Context提取配置
本方案示例服务不包含Context提取配置。有关Context提取配置的示例,请参考下图:
SpanName:retrieve
JsonPathInSpan:
attributes.retrieval.documents[*].document.content
重要仅Context配置支持使用星号(*)。
JsonPathInSpanValue:因JsonPathInSpan元素内容非JSON字符串格式,此处为空。
参数配置完成后,单击确定。
当评估结果列出现如下图示例结果时,表明评估成功,您可以单击评估结果查看详情。