全部产品
Search
文档中心

Application Real-Time Monitoring Service:Menghubungkan aplikasi LLM atau layanan inferensi ke ARMS

更新时间:Nov 10, 2025

Agen Python adalah pengumpul data observabilitas untuk Python yang dikembangkan oleh Alibaba Cloud. Agen ini menyediakan instrumentasi otomatis berdasarkan standar OpenTelemetry dan mendukung pelacakan untuk aplikasi LLM.

Informasi latar belakang

Aplikasi LLM adalah aplikasi yang dikembangkan berdasarkan model bahasa besar (LLM). LLM dilatih menggunakan data dan parameter dalam jumlah sangat besar, sehingga mampu menjawab pertanyaan dengan cara yang menyerupai bahasa alami manusia. Akibatnya, LLM banyak digunakan di berbagai bidang seperti pemrosesan bahasa alami, generasi teks, dan dialog cerdas. Seiring meningkatnya popularitas aplikasi LLM, penyediaan layanan inferensi yang efisien telah menjadi tantangan signifikan. Kerangka kerja layanan tradisional sering menghadapi hambatan kinerja dan manajemen memori yang tidak efisien saat memproses permintaan konkuren. Untuk mengatasi tantangan tersebut, kerangka kerja layanan inferensi LLM seperti vLLM telah dirancang.

Keluaran dari LLM sering kali sulit diprediksi. Beberapa faktor yang tidak dapat dikendalikan—seperti deviasi kinerja antara pelatihan dan produksi, degradasi kinerja akibat deviasi distribusi data, kualitas data yang buruk, serta ketergantungan pada data eksternal yang tidak andal—dapat memengaruhi kinerja keseluruhan aplikasi LLM dan layanan inferensi. Oleh karena itu, penting untuk segera mendeteksi penurunan kualitas keluaran model.

ARMS mendukung instrumentasi otomatis untuk aplikasi LLM melalui agen Python. Setelah Anda menghubungkan aplikasi LLM ke ARMS, Anda dapat melihat rantai panggilannya, yang membantu menganalisis informasi seperti masukan/keluaran dari berbagai jenis operasi dan konsumsi token. Untuk informasi selengkapnya, lihat Analisis rantai panggilan LLM.

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

Instal agen Python

Pilih metode instalasi berdasarkan lingkungan penerapan aplikasi LLM Anda:

Jalankan aplikasi dengan agen Python

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

  • Agen Python ARMS secara otomatis mendeteksi jenis aplikasi Anda berdasarkan dependensi yang telah Anda instal:

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

      • openai

      • dashscope

      • llama_index

      • langchain

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

      • vllm

      • sglang

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

      • microservice: Aplikasi layanan mikro biasa

      • app: Aplikasi LLM

      • model: Layanan LLM

Hasil

Koneksi berhasil jika, setelah sekitar satu menit, aplikasi Python muncul di halaman LLM Application Monitoring > Application List di Konsol ARMS dan melaporkan data.

2025-01-07_11-44-13

Konfigurasi

Pengumpulan konten masukan/keluaran

Nilai default: True. Pengumpulan diaktifkan secara default.

Efek saat dinonaktifkan: Jika fitur ini dinonaktifkan, hanya ukuran bidang detail—seperti masukan/keluaran model, alat, dan basis pengetahuan—yang dikumpulkan. Konten bidang-bidang tersebut tidak dikumpulkan.

Plugin yang berlaku: Konfigurasi ini hanya didukung oleh Dify dan LangChain.

Konfigurasi: Atur variabel lingkungan OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False.

Pemisahan aplikasi LLM

Nilai default: False. Pemisahan aplikasi dinonaktifkan secara default.

Efek saat diaktifkan: Data yang dilaporkan dibagi menjadi sub-aplikasi LLM. Setiap aplikasi LLM—seperti Dify Workflow, Agent, atau Chat App—akan sesuai dengan aplikasi ARMS terpisah.

Plugin yang berlaku: Konfigurasi ini hanya didukung oleh Dify.

Konfigurasi: Atur variabel lingkungan PROFILER_GENAI_SPLITAPP_ENABLE=True.

Wilayah yang didukung: Heyuan dan Singapura.

Batas panjang bidang konten pesan

Nilai default: 4.096 karakter.

Efek saat diaktifkan: Pengaturan ini membatasi panjang konten pesan LLM, seperti konten bidang pesan masukan/keluaran. Konten yang melebihi batas karakter yang ditentukan akan dipotong.

Plugin yang berlaku: Konfigurasi ini hanya didukung oleh Dify dan LangChain.

Konfigurasi: Jika versi agen Anda adalah 1.8.3 atau lebih baru, atur variabel lingkungan OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>. Ganti <integer_value> dengan bilangan bulat yang menentukan batas panjang karakter yang diinginkan.

Batas panjang nilai atribut rentang

Nilai default: Tidak diatur. Tidak ada batasan secara default.

Efek saat diaktifkan: Pengaturan ini membatasi panjang nilai atribut rentang yang dilaporkan, seperti `gen_ai.agent.description`. Nilai atribut yang melebihi batas karakter yang ditentukan akan dipotong.

Plugin yang berlaku: Konfigurasi ini berlaku untuk semua plugin yang mendukung OpenTelemetry, seperti LangChain, DashScope, dan Dify.

Konfigurasi: Atur variabel lingkungan OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>. Ganti <integer_value> dengan bilangan bulat yang menentukan batas panjang karakter yang diinginkan.

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

Simpan dokumen basis pengetahuan dalam format teks, seperti PDF, TXT, dan DOC, di direktori `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 generate answers based on 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=["Saya akan menghubungi nanti.", "Anda 'console' mereka!"])

template = """Pertanyaan: {question}

Jawaban: Mari kita pikirkan langkah demi langkah."""

prompt = PromptTemplate(template=template, input_variables=["question"])

llm_chain = LLMChain(prompt=prompt, llm=llm)

question = "Tim NFL mana yang memenangkan Super Bowl pada tahun Justin Beiber lahir?"

@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

Untuk membangun aplikasi Dify dengan cepat, lihat Bangun asisten tanya jawab AI khusus untuk halaman web menggunakan Dify.