All Products
Search
Document Center

Application Real-Time Monitoring Service:Integrasikan aplikasi LLM atau layanan inferensi dengan ARMS

Last Updated:Jun 14, 2026

Python agent adalah agen pengumpulan data observabilitas yang dikembangkan oleh Alibaba Cloud untuk aplikasi Python. Dibangun di atas standar OpenTelemetry, agen ini menyediakan instrumentasi otomatis dan mendukung tracing untuk aplikasi LLM.

Informasi latar belakang

Aplikasi LLM (large language model) mengacu pada aplikasi apa pun yang dibangun menggunakan model bahasa besar. Dilatih pada dataset dan parameter dalam skala sangat besar, LLM mampu menjawab pertanyaan dalam bahasa alami yang menyerupai cara manusia. LLM banyak digunakan dalam pemrosesan bahasa alami, generasi teks, dan sistem dialog cerdas. Seiring semakin umumnya penggunaan aplikasi LLM, penyediaan layanan inferensi yang efisien menjadi tantangan utama. Framework layanan tradisional sering mengalami bottleneck performa dan manajemen memori yang tidak efisien saat menangani permintaan konkuren. Framework inferensi LLM—seperti vLLM—dirancang khusus untuk mengatasi tantangan kritis tersebut.

Output LLM sering kali sulit diprediksi secara akurat. Selain itu, faktor-faktor seperti perbedaan antara hasil pelatihan dan produksi, deviasi distribusi data yang menyebabkan degradasi performa, kualitas data yang kedaluwarsa, serta ketergantungan eksternal yang tidak andal dapat berdampak negatif terhadap performa keseluruhan aplikasi LLM dan layanan inferensinya. Oleh karena itu, sangat penting untuk segera mendeteksi penurunan kualitas output model.

ARMS mendukung instrumentasi otomatis aplikasi LLM melalui Python agent. Setelah mengintegrasikan aplikasi LLM Anda dengan ARMS, Anda dapat melihat visualisasi jejaknya dan menganalisis secara intuitif detail input/output serta konsumsi token di berbagai jenis operasi. Untuk informasi lebih lanjut, lihat Analisis jejak LLM.

Untuk daftar framework inferensi dan aplikasi LLM yang didukung oleh ARMS, lihat Komponen dan framework Python yang didukung oleh Pemantauan Aplikasi ARMS.

Instal Python agent

Pilih metode instalasi berdasarkan lingkungan penerapan aplikasi LLM Anda:

Jalankan aplikasi Anda dengan Python agent

aliyun-instrument python llm_app.py
Catatan
  • Ganti llm_app.py dengan file aplikasi aktual Anda. Jika Anda belum memiliki aplikasi LLM untuk diintegrasikan, Anda dapat menggunakan aplikasi demo yang tersedia di Lampiran.

  • Python agent ARMS secara otomatis mendeteksi jenis aplikasi Anda berdasarkan dependensi yang terinstal:

    • Jika Anda menginstal salah satu dependensi berikut, aplikasi Anda diidentifikasi sebagai aplikasi LLM:

      • openai

      • dashscope

      • llama_index

      • langchain

    • Jika Anda menginstal salah satu dependensi berikut, aplikasi Anda diidentifikasi sebagai layanan LLM:

      • vllm

      • sglang

    • Untuk memaksa jenis aplikasi tertentu, atur variabel lingkungan APSARA_APM_APP_TYPE. Nilai yang valid adalah:

      • microservice: aplikasi layanan mikro standar

      • app: aplikasi LLM

      • model: layanan LLM

Hasil eksekusi

Sekitar satu menit setelah startup, jika aplikasi Python Anda muncul di Konsol ARMS di bawah LLM Application Monitoring > Application List dan melaporkan data, integrasi telah berhasil.

Konfigurasi

Input/output koleksi konten

Bawaan: True (diaktifkan secara default).

Jika dinonaktifkan: Saat pengguna mengirimkan kueri, hanya ukuran bidang seperti input/output dari model, tools, dan basis pengetahuan yang dikumpulkan—bukan konten aktualnya.

Plugin yang saat ini berlaku: Hanya Dify dan LangChain yang mendukung pengaturan ini.

Cara mengonfigurasi: Atur variabel lingkungan OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False.

Pemisahan aplikasi LLM

Bawaan: False (pemisahan aplikasi dinonaktifkan secara default).

Jika diaktifkan: Data yang dilaporkan dipisah menjadi sub-aplikasi LLM. Setiap aplikasi LLM—seperti Dify Workflow, Agent, atau Chat App—muncul sebagai aplikasi ARMS terpisah.

Plugin yang saat ini berlaku: Hanya Dify yang mendukung pengaturan ini.

Cara mengonfigurasi: Atur variabel lingkungan PROFILER_GENAI_SPLITAPP_ENABLE=True.

Wilayah yang didukung: Heyuan, Singapura.

Batas panjang konten pesan

Bawaan: 8K karakter.

Jika diaktifkan: Membatasi panjang setiap bidang konten pesan (seperti pesan input/output). Konten yang melebihi batas karakter yang ditentukan akan dipotong.

Plugin yang saat ini berlaku: Pengaturan ini berlaku untuk semua plugin yang kompatibel dengan OpenTelemetry (seperti LangChain, DashScope, Dify, dll.).

Cara mengonfigurasi: Jika versi agent Anda >= 1.8.3, atur variabel lingkungan OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>, ganti <integer_value> dengan batas karakter yang diinginkan dalam bentuk bilangan bulat.

Batas panjang nilai atribut Span

Bawaan: Tidak diatur (tidak ada batas secara default).

Jika diaktifkan: Membatasi panjang nilai atribut Span yang dilaporkan (seperti gen_ai.agent.description). Nilai yang melebihi batas karakter yang ditentukan akan dipotong.

Plugin yang saat ini berlaku: Pengaturan ini berlaku untuk semua plugin yang kompatibel dengan OpenTelemetry (seperti LangChain, DashScope, Dify, dll.).

Cara mengonfigurasi: Atur variabel lingkungan OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>, ganti <integer_value> dengan batas karakter yang diinginkan dalam bentuk bilangan bulat.

Kompresi Span

Bawaan: Tidak diatur (kompresi dinonaktifkan secara default).

Jika diaktifkan: Beberapa Span identik yang dihasilkan pada level yang sama dikompresi menjadi satu, hanya menyimpan informasi kunci.

Plugin yang saat ini berlaku: Pengaturan ini berlaku untuk semua plugin yang kompatibel dengan OpenTelemetry (seperti LangChain, DashScope, Dify, dll.).

Konfigurasikan dengan mengatur variabel lingkungan APSARA_APM_INSTRUMENTER_SPAN_COMPRESS_ENABLED

=true.

Lampiran

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

Letakkan dokumen basis pengetahuan (dalam format PDF, TXT, DOC, atau format teks lainnya) di folder 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

Anda dapat dengan cepat membangun aplikasi Dify dengan mengikuti petunjuk dalam Membangun asisten AI tanya jawab berbasis web yang disesuaikan menggunakan Dify.