Todos os produtos
Search
Central de documentação

Application Real-Time Monitoring Service:Integrar aplicações LLM ou serviços de inferência com o ARMS

Última atualização: Jun 27, 2026

O agente Python é um coletor de dados de observabilidade desenvolvido pela Alibaba Cloud para aplicações Python. Baseado no padrão OpenTelemetry, ele oferece instrumentação automática e suporta rastreamento para aplicações LLM.

Informações gerais

Uma aplicação LLM (large language model) refere-se a qualquer software construído com base em um modelo de linguagem grande. Treinados com conjuntos massivos de dados e parâmetros, os LLMs respondem a perguntas em linguagem natural de forma semelhante à humana. Eles são amplamente utilizados em processamento de linguagem natural, geração de texto e sistemas de diálogo inteligente. Com a popularização dessas aplicações, fornecer serviços de inferência eficientes tornou-se um grande desafio. Frameworks de serviço tradicionais frequentemente enfrentam gargalos de desempenho e gerenciamento ineficiente de memória ao lidar com requisições simultâneas. Frameworks de inferência LLM — como o vLLM — foram projetados especificamente para resolver esses problemas críticos.

As saídas dos LLMs costumam ser difíceis de prever com precisão. Além disso, fatores como discrepâncias entre resultados de treinamento e produção, desvio na distribuição de dados causando degradação de desempenho, qualidade de dados obsoleta e dependências externas não confiáveis podem impactar negativamente o desempenho geral da aplicação LLM e do serviço de inferência. Por isso, é crucial detectar quedas na qualidade da saída do modelo assim que ocorrerem.

O ARMS suporta instrumentação automática de aplicações LLM por meio do agente Python. Após integrar sua aplicação LLM ao ARMS, visualize o rastreamento e analise intuitivamente os detalhes de entrada/saída e o consumo de tokens nos diferentes tipos de operação. Para mais informações, consulte Análise de rastreamento de LLM.

Para obter uma lista dos frameworks de inferência e aplicação LLM suportados pelo ARMS, consulte Componentes e frameworks Python suportados pelo Monitoramento de Aplicações do ARMS.

Instale o agente Python

Escolha um método de instalação conforme o ambiente de implantação da sua aplicação LLM:

Execute sua aplicação com o agente Python

aliyun-instrument python llm_app.py
Nota
  • Substitua llm_app.py pelo arquivo real da sua aplicação. Caso ainda não tenha uma aplicação LLM para integrar, utilize a aplicação de demonstração fornecida no Apêndice.

  • O agente Python do ARMS detecta automaticamente o tipo da sua aplicação com base nas dependências instaladas:

    • A instalação de qualquer uma das dependências abaixo identifica sua aplicação como uma aplicação LLM:

      • openai

      • dashscope

      • llama_index

      • langchain

    • A instalação de qualquer uma das dependências abaixo identifica sua aplicação como um serviço LLM:

      • vllm

      • sglang

    • Para forçar um tipo específico de aplicação, defina a variável de ambiente APSARA_APM_APP_TYPE. Valores válidos:

      • microservice: aplicação de microsserviço padrão

      • app: aplicação LLM

      • model: serviço LLM

Resultado da execução

Cerca de um minuto após a inicialização, se sua aplicação Python aparecer no console do ARMS em LLM Application Monitoring > Application List e estiver reportando dados, a integração foi bem-sucedida.

Configure

Coleta de conteúdo de entrada/saída

Padrão: True (ativado por padrão).

Quando desativado: Ao enviar consultas, o sistema coleta apenas o tamanho de campos como entrada/saída de modelos, ferramentas e bases de conhecimento, sem registrar o conteúdo real.

Plugins compatíveis: Apenas Dify e LangChain suportam esta configuração.

Configuração: Defina a variável de ambiente OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False.

Dividir aplicações LLM

Padrão: False (divisão de aplicação desativada por padrão).

Quando ativado: Os dados reportados são divididos em subaplicações LLM. Cada aplicação LLM — como um Workflow, Agente ou Chat App do Dify — aparece como uma aplicação separada no ARMS.

Plugins compatíveis: Apenas o Dify suporta esta configuração.

Configuração: Defina a variável de ambiente PROFILER_GENAI_SPLITAPP_ENABLE=True.

Regiões suportadas: Heyuan, Singapura.

Limite de comprimento do conteúdo da mensagem

Padrão: 8 mil caracteres.

Quando ativado: Limita o comprimento de cada campo de conteúdo da mensagem (como mensagens de entrada/saída). O conteúdo que exceder o limite de caracteres especificado será truncado.

Plugins compatíveis: Esta configuração aplica-se a todos os plugins compatíveis com OpenTelemetry (como LangChain, DashScope, Dify, etc.).

Configuração: Se a versão do seu agente for >= 1.8.3, defina a variável de ambiente OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>, substituindo <integer_value> pelo limite de caracteres desejado como um número inteiro.

Limite de comprimento do valor do atributo Span

Padrão: Não definido (sem limite por padrão).

Quando ativado: Limita o comprimento dos valores de atributos Span reportados (como gen_ai.agent.description). Valores que excederem o limite de caracteres especificado serão truncados.

Plugins compatíveis: Esta configuração aplica-se a todos os plugins compatíveis com OpenTelemetry (como LangChain, DashScope, Dify, etc.).

Configuração: Defina a variável de ambiente OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>, substituindo <integer_value> pelo limite de caracteres desejado como um número inteiro.

Comprimir Spans

Padrão: Não definido (compressão desativada por padrão).

Quando ativado: Múltiplos Spans idênticos gerados no mesmo nível são comprimidos em um só, retendo apenas as informações principais.

Plugins compatíveis: Esta configuração aplica-se a todos os plugins compatíveis com OpenTelemetry (como LangChain, DashScope, Dify, etc.).

Configuração: Defina a variável de ambiente APSARA_APM_INSTRUMENTER_SPAN_COMPRESS_ENABLED

=true.

Apêndice

Demo OpenAI

llm_app.py

import openai
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def call_openai():
    client = openai.OpenAI(api_key="sk-xxx")
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": "Write a haiku."}],
        max_tokens=20,
    )
    return {"data": f"{response}"}
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)    

requirements.txt

fastapi
uvicorn
openai >= 1.0.0

Demo DashScope

llm_app.py

from http import HTTPStatus
import dashscope
from dashscope import Generation
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def call_dashscope():
    dashscope.api_key = 'YOUR-DASHSCOPE-API-KEY'
    responses = Generation.call(model=Generation.Models.qwen_turbo,
                                prompt='How is the weather today?')
    resp = ""
    if responses.status_code == HTTPStatus.OK:
        resp = f"Result is: {responses.output}"
    else:
        resp = f"Failed request_id: {responses.request_id}, status_code: {responses.status_code}, code: {responses.code}, message: {responses.message}"
    return {"data": f"{resp}"}
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

requirements.txt

fastapi
uvicorn
dashscope >= 1.0.0

Demo LlamaIndex

Coloque os documentos da base de conhecimento (em PDF, TXT, DOC ou outros formatos de texto) na pasta data.

llm_app.py

import time
from fastapi import FastAPI
import uvicorn
import aiohttp
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
from llama_index.embeddings.dashscope import DashScopeEmbedding
import chromadb
import dashscope
import os
from dotenv import load_dotenv
from llama_index.core.llms import ChatMessage
from llama_index.core import VectorStoreIndex, get_response_synthesizer
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels
import random
load_dotenv()
os.environ["DASHSCOPE_API_KEY"] = 'sk-xxxxxx'
dashscope.api_key = 'sk-xxxxxxx'
api_key = 'sk-xxxxxxxx'
llm = DashScope(model_name=DashScopeGenerationModels.QWEN_MAX,api_key=api_key)
# create client and a new collection
chroma_client = chromadb.EphemeralClient()
chroma_collection = chroma_client.create_collection("chapters")
# define embedding function
embed_model = DashScopeEmbedding(model_name="text-embedding-v1", api_key=api_key)
# load documents
filename_fn = lambda filename: {"file_name": filename}
# automatically sets the metadata of each document according to filename_fn
documents = SimpleDirectoryReader(
    "./data/", file_metadata=filename_fn
).load_data()
# set up ChromaVectorStore and load in data
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
    documents, storage_context=storage_context, embed_model=embed_model
)
retriever = VectorIndexRetriever(
    index=index,
    similarity_top_k=4,
    verbose=True
)
# configure response synthesizer
response_synthesizer = get_response_synthesizer(llm=llm, response_mode="refine")
# assemble query engine
query_engine = RetrieverQueryEngine(
    retriever=retriever,
    response_synthesizer=response_synthesizer,
)
SYSTEM_PROMPT = """
You are a general-knowledge chatbot for children. Your task is to answer user questions by combining the most relevant content found in the knowledge base. Do not answer subjective questions.
"""
# Initialize the conversation with a system message
messages = [ChatMessage(role="system", content=SYSTEM_PROMPT)]
app = FastAPI()
async def fetch(question):
    url = "https://www.aliyun.com"
    call_url = os.environ.get("LLM_INFRA_URL")
    if call_url is None or call_url == "":
        call_url = url
    else:
        call_url = f"{call_url}?question={question}"
    print(call_url)
    async with aiohttp.ClientSession() as session:
        async with session.get(call_url) as response:
            print(f"GET Status: {response.status}")
            data = await response.text()
            print(f"GET Response JSON: {data}")
            return data
@app.get("/heatbeat")
def heatbeat():
    return {"msg", "ok"}
cnt = 0
@app.get("/query")
async def call(question: str = None):
    global cnt
    cnt += 1
    if cnt == 20:
        cnt = 0
        raise BaseException("query is over limit,20 ", 401)
    # Add user message to the conversation history
    message = ChatMessage(role="user", content=question)
    # Convert messages into a string
    message_string = f"{message.role}:{message.content}"
    search = await fetch(question)
    print(f"search:{search}")
    resp = query_engine.query(message_string)
    print(resp)
    return {"data": f"{resp}".encode('utf-8').decode('utf-8')}
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

requirements.txt

fastapi
uvicorn
numpy==1.23.5
llama-index==0.10.62
llama-index-core==0.10.28
llama-index-embeddings-dashscope==0.1.3
llama-index-llms-dashscope==0.1.2
llama-index-vector-stores-chroma==0.1.6
aiohttp

Demo LangChain

llm_app.py

from fastapi import FastAPI
from langchain.llms.fake import FakeListLLM
import uvicorn
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
app = FastAPI()
llm = FakeListLLM(responses=["I'll callback later.", "You 'console' them!"])
template = """Question: {question}
Answer: Let's think step by step."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = "What NFL team won the Super Bowl in the year Justin Beiber was born?"
@app.get("/")
def call_langchain():
    res = llm_chain.run(question)
    return {"data": res}
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

requirements.txt

fastapi
uvicorn
langchain
langchain_community

Demo Dify

Crie rapidamente uma aplicação Dify seguindo as instruções em Criar um assistente de perguntas e respostas de IA baseado na web personalizado usando o Dify.