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.pyGanti 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 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.0Demo 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.0Demo 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
aiohttpDemo 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_communityDemo Dify
Anda dapat dengan cepat membangun aplikasi Dify dengan mengikuti petunjuk dalam Membangun asisten AI tanya jawab berbasis web yang disesuaikan menggunakan Dify.