โมเดลและแพลตฟอร์ม AI
การติดตามโมเดลภาษาขนาดใหญ่ (LLM) โดยใช้ MLflow: คู่มือที่สมบูรณ์
โมเดลภาษาขนาดใหญ่ (LLM) มีการเติบโตในด้านความซับซ้อนและขนาด ทำให้การติดตามผลการทำงาน การทดลอง และการนำไปใช้变得ท้าทายมากขึ้น นี่คือจุดที่ MLflow เข้ามาเป็นแพลตฟอร์มที่ครอบคลุมสำหรับการจัดการวงจรชีวิตของโมเดลการเรียนรู้ของเครื่อง รวมถึง LLM
ในคู่มือที่ลึกซึ้งนี้ เราจะสำรวจวิธีการใช้ MLflow สำหรับการติดตาม การประเมิน และการนำ LLM ไปใช้ เราจะครอบคลุมทุกอย่างตั้งแต่การตั้งค่าสภาพแวดล้อมไปจนถึงเทคนิคการประเมินที่ขั้นสูง พร้อมด้วยตัวอย่างโค้ดและแนวทางปฏิบัติที่ดีที่สุดตลอดทาง
การตั้งค่าสภาพแวดล้อมของคุณ
ก่อนที่เราจะดูการติดตาม LLM โดยใช้ MLflow มาทำการตั้งค่าสภาพแวดล้อมพัฒนาของเรากันก่อน เราต้องติดตั้ง MLflow และไลบรารีสำคัญอื่นๆ:
pip install mlflow>=2.8.1 pip install openai pip install chromadb==0.4.15 pip install langchain==0.0.348 pip install tiktoken pip install 'mlflow[genai]' pip install databricks-sdk --upgrade
หลังการติดตั้ง เป็นความคิดที่ดีที่จะรีสตาร์ทสภาพแวดล้อม Python ของคุณเพื่อให้แน่ใจว่าไลบรารีทั้งหมดโหลดอย่างถูกต้อง ใน Jupyter Notebook คุณสามารถใช้:
import mlflow
import chromadb
<p>print(f"MLflow version: {mlflow.__version__}")
print(f"ChromaDB version: {chromadb.__version__}")
สิ่งนี้จะยืนยันเวอร์ชันของไลบรารีหลักที่เราจะใช้
การเข้าใจความสามารถในการติดตาม LLM ของ MLflow
ระบบการติดตาม LLM ของ MLflow สร้างขึ้นจากความสามารถในการติดตามที่มีอยู่แล้ว โดยเพิ่มคุณลักษณะที่ออกแบบมาเฉพาะสำหรับด้านที่ไม่เหมือนใครของ LLM มาทำความเข้าใจส่วนประกอบหลัก:
การทำงานและทดลอง
ใน MLflow “การทำงาน” แสดงถึงการดำเนินการโค้ดโมเดลของคุณครั้งเดียว ในขณะที่ “การทดลอง” คือการรวบรวมการทำงานที่เกี่ยวข้อง สำหรับ LLM การทำงานอาจแสดงถึงการค้นหาคำถามเดียวหรือชุดคำถามที่ประมวลผลโดยโมเดล
ส่วนประกอบหลักในการติดตาม
- พารามิเตอร์: สิ่งเหล่านี้คือการกำหนดค่าเข้าสำหรับ LLM ของคุณ เช่น อุณหภูมิ top_k หรือ max_tokens คุณสามารถบันทึกสิ่งเหล่านี้โดยใช้
mlflow.log_param()หรือmlflow.log_params() - เมตริก: การวัดเชิงปริมาณของประสิทธิภาพ LLM ของคุณ เช่น ความแม่นยำ ความหน่วง หรือคะแนนแบบกำหนดเอง ใช้
mlflow.log_metric()หรือmlflow.log_metrics()เพื่อติดตามสิ่งเหล่านี้ - การคาดการณ์: สำหรับ LLM มันเป็นสิ่งสำคัญที่จะต้องบันทึกทั้งคำถามที่ส่งเข้าและผลลัพธ์ที่สอดคล้องกัน MLflow จัดเก็บสิ่งเหล่านี้เป็นอาร์ติแฟคต์ในรูปแบบ CSV โดยใช้
mlflow.log_table() - อาร์ติแฟคต์: ไฟล์หรือข้อมูลเอาต์พุตอื่นๆ ที่เกี่ยวข้องกับการทำงานของ LLM ใช้
mlflow.log_artifact()เพื่อจัดเก็บสิ่งเหล่านี้
มาทำตัวอย่างพื้นฐานของการบันทึกการทำงานของ LLM:
ตัวอย่างนี้แสดงการบันทึกพารามิเตอร์ เมตริก และคำถาม/คำตอบเป็นอาร์ติแฟคต์แบบตาราง
import mlflow
import openai
<p>def query_llm(prompt, max_tokens=100):
response = openai.Completion.create(
engine="text-davinci-002",
prompt=prompt,
max_tokens=max_tokens
)
return response.choices[0].text.strip()</p>
<p>with mlflow.start_run():
prompt = "อธิบายแนวคิดของการเรียนรู้ของเครื่องในคำพูดที่ง่าย"</p>
<p># บันทึกพารามิเตอร์
mlflow.log_param("model", "text-davinci-002")
mlflow.log_param("max_tokens", 100)</p>
<p># ค้นหา LLM และบันทึกผลลัพธ์
result = query_llm(prompt)
mlflow.log_metric("response_length", len(result))</p>
<p># บันทึกคำถามและคำตอบ
mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})</p>
<p>print(f"คำตอบ: {result}")
การนำ LLM ไปใช้โดยใช้ MLflow
MLflow มีความสามารถที่แข็งแกร่งสำหรับการนำ LLM ไปใช้ ทำให้ง่ายต่อการเสิร์ฟโมเดลของคุณในproduction environments มาทำความเข้าใจวิธีการนำ LLM ไปใช้โดยใช้ความสามารถในการนำไปใช้ของ MLflow
การสร้างจุดสิ้นสุด
ก่อนอื่นเราจะสร้างจุดสิ้นสุดสำหรับ LLM ของเราโดยใช้ไคลเอ็นต์การนำไปใช้ของ MLflow:
import mlflow
from mlflow.deployments import get_deploy_client
<p># เริ่มต้นไคลเอ็นต์การนำไปใช้
client = get_deploy_client("databricks")</p>
<p># กำหนดค่าจุดสิ้นสุด
endpoint_name = "llm-endpoint"
endpoint_config = {
"served_entities": [{
"name": "gpt-model",
"external_model": {
"name": "gpt-3.5-turbo",
"provider": "openai",
"task": "llm/v1/completions",
"openai_config": {
"openai_api_type": "azure",
"openai_api_key": "{{secrets/scope/openai_api_key}}",
"openai_api_base": "{{secrets/scope/openai_api_base}}",
"openai_deployment_name": "gpt-35-turbo",
"openai_api_version": "2023-05-15",
},
},
}],
}</p>
<p># สร้างจุดสิ้นสุด
client.create_endpoint(name=endpoint_name, config=endpoint_config)
โค้ดนี้ตั้งค่าจุดสิ้นสุดสำหรับโมเดล GPT-3.5-turbo โดยใช้ Azure OpenAI โปรดทราบการใช้ Databricks secrets สำหรับการจัดการ API key อย่างปลอดภัย
การทดสอบจุดสิ้นสุด
เมื่อจุดสิ้นสุดถูกสร้างแล้ว เราสามารถทดสอบได้:
<div class="relative flex flex-col rounded-lg">
<p>response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "อธิบายแนวคิดของเครือข่ายประสาทเทียมอย่างง่าย", "max_tokens": 100,},)</p>
print(response)
สิ่งนี้จะส่งคำถามไปยังโมเดลที่เราเสิร์ฟและคืนคำตอบที่สร้างขึ้น
การประเมิน LLM โดยใช้ MLflow
การประเมินเป็นสิ่งสำคัญสำหรับการทำความเข้าใจประสิทธิภาพและพฤติกรรมของ LLM ของคุณ MLflow มีเครื่องมือที่ครอบคลุมสำหรับการประเมิน LLM รวมถึงเมตริกที่มีอยู่และแบบกำหนดเอง
การเตรียม LLM สำหรับการประเมิน
เพื่อประเมิน LLM ของคุณโดยใช้ mlflow.evaluate() โมเดลของคุณต้องอยู่ในรูปแบบต่อไปนี้:
- อินสแตนซ์
mlflow.pyfunc.PyFuncModelหรือ URI ที่ชี้ไปยังโมเดล MLflow ที่บันทึกไว้ - ฟังก์ชัน Python ที่รับข้อมูลเข้าเป็นข้อความและคืนค่าข้อความเดียว
- URI ของจุดสิ้นสุด MLflow Deployments
- ตั้งค่า
model=Noneและรวมเอาต์พุตของโมเดลไว้ในข้อมูลการประเมิน
มาทำตัวอย่างโดยใช้โมเดล MLflow ที่บันทึกไว้:
import mlflow
import openai
<p>with mlflow.start_run():
system_prompt = "ตอบคำถามต่อไปนี้อย่างสั้น"
logged_model_info = mlflow.openai.log_model(
model="gpt-3.5-turbo",
task=openai.chat.completions,
artifact_path="model",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "{question}"},
],
)</p>
<p># เตรียมข้อมูลการประเมิน
eval_data = pd.DataFrame({
"question": ["อะไรคือการเรียนรู้ของเครื่อง?", "อธิบายเครือข่ายประสาทเทียม"],
"ground_truth": [
"การเรียนรู้ของเครื่องเป็นส่วนหนึ่งของ AI ที่ช่วยให้ระบบสามารถเรียนรู้และปรับปรุงจากประสบการณ์โดยไม่ต้องเขียนโปรแกรมอย่างชัดเจน",
"เครือข่ายประสาทเทียมเป็นระบบการประมวลผลที่ได้รับแรงบันดาลใจจากเครือข่ายประสาททางชีววิทยา ประกอบด้วยโหนดที่เชื่อมต่อกันซึ่งประมวลผลและถ่ายทอดข้อมูล",
]
})</p>
<p># ประเมินโมเดล
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
)</p>
<p>print(f"เมตริกการประเมิน: {results.metrics}")
ตัวอย่างนี้บันทึกโมเดล OpenAI เตรียมข้อมูลการประเมิน จากนั้นประเมินโมเดลโดยใช้เมตริกที่มีอยู่ของ MLflow สำหรับการตอบคำถาม
การสร้างเมตริกแบบกำหนดเอง
MLflow ช่วยให้คุณสามารถกำหนดเมตริกแบบกำหนดเองสำหรับการประเมิน LLM ได้ มาทำตัวอย่างการสร้างเมตริกแบบกำหนดเองสำหรับการประเมินความเป็นมืออาชีพของคำตอบ:
from mlflow.metrics.genai import EvaluationExample, make_genai_metric
<p>professionalism = make_genai_metric(
name="professionalism",
definition="การวัดระดับของการสื่อสารที่เป็นทางการและเหมาะสม",
grading_prompt=(
"ให้คะแนนความเป็นมืออาชีพของคำตอบตามมาตราส่วน 0-4:\n"
"0: มากเกินไปหรือไม่เหมาะสม\n"
"1: ไม่ทางการแต่ให้ความเคารพ\n"
"2: มoderately เป็นทางการ\n"
"3: มืออาชีพและเหมาะสม\n"
"4: มืออาชีพและสร้างสรรค์"
),
examples=[
EvaluationExample(
input="อะไรคือการเรียนรู้ของเครื่อง?",
output="การเรียนรู้ของเครื่องเป็นเครื่องมือที่ยอดเยี่ยมสำหรับโครงการ ML",
score=1,
justification="คำตอบไม่ทางการและใช้ภาษาไม่เหมาะสม",
),
EvaluationExample(
input="อะไรคือการเรียนรู้ของเครื่อง?",
output="การเรียนรู้ของเครื่องเป็นส่วนหนึ่งของ AI ที่ช่วยให้ระบบสามารถเรียนรู้และปรับปรุงจากประสบการณ์โดยไม่ต้องเขียนโปรแกรมอย่างชัดเจน",
score=4,
justification="คำตอบเป็นทางการ สั้นและเขียนด้วยภาษาที่มืออาชีพ",
)
],
model="openai:/gpt-3.5-turbo-16k",
parameters={"temperature": 0.0},
aggregations=["mean", "variance"],
greater_is_better=True,
)</p>
<p># ใช้เมตริกแบบกำหนดเองในการประเมิน
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[professionalism]
)</p>
<p>print(f"คะแนนความเป็นมืออาชีพ: {results.metrics['professionalism_mean']}")
เมตริกแบบกำหนดเองนี้ใช้ GPT-3.5-turbo เพื่อประเมินความเป็นมืออาชีพของคำตอบ โดยแสดงให้เห็นว่าคุณสามารถใช้ LLM เองในการประเมินได้อย่างไร
เทคนิคการประเมิน LLM ขั้นสูง
เมื่อ LLM มีความซับซ้อนมากขึ้น เทคนิคการประเมินก็เช่นกัน มาทำความเข้าใจเทคนิคการประเมินที่ขั้นสูงโดยใช้ MLflow
การประเมิน Retrieval-Augmented Generation (RAG)
ระบบ RAG รวมพลังของโมเดลการค้นหาและการสร้างข้อความ การประเมินระบบ RAG ต้องประเมินส่วนการค้นหาและการสร้างข้อความทั้งสองส่วน มาทำความเข้าใจวิธีการตั้งค่าระบบ RAG และประเมินโดยใช้ MLflow:
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
<p># โหลดและประมวลผลเอกสาร
loader = WebBaseLoader(["https://mlflow.org/docs/latest/index.html"])
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>
<p># สร้าง vector store
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)</p>
<p># สร้าง RAG chain
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
return_source_documents=True
)</p>
<p># ฟังก์ชันการประเมิน
def evaluate_rag(question):
result = qa_chain({"query": question})
return result["result"], [doc.page_content for doc in result["source_documents"]]</p>
<p># เตรียมข้อมูลการประเมิน
eval_questions = [
"อะไรคือการเรียนรู้ของเครื่อง?",
"การเรียนรู้ของเครื่องช่วยให้ทำอะไรได้บ้าง?",
"ส่วนประกอบหลักของการเรียนรู้ของเครื่องคืออะไร?",
]</p>
<p># ประเมินโดยใช้ MLflow
with mlflow.start_run():
for question in eval_questions:
answer, sources = evaluate_rag(question)</p>
<p>mlflow.log_param(f"question", question)
mlflow.log_metric("num_sources", len(sources))
mlflow.log_text(answer, f"answer_{question}.txt")</p>
<p>for i, source in enumerate(sources):
mlflow.log_text(source, f"source_{question}_{i}.txt")</p>
<p># บันทึกเมตริกแบบกำหนดเอง
mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))
ตัวอย่างนี้ตั้งค่าระบบ RAG โดยใช้ LangChain และ Chroma จากนั้นประเมินโดยการบันทึกคำถาม คำตอบ แหล่งที่มา และเมตริกแบบกำหนดเองไปยัง MLflow
การประเมินกลยุทธ์การแบ่งชิ้น
วิธีการแบ่งเอกสารสามารถส่งผลกระทบอย่างมากต่อประสิทธิภาพของ RAG MLflow ช่วยให้คุณสามารถประเมินกลยุทธ์การแบ่งชิ้นต่างๆ ได้:
import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter
<p>def evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class):
splitter = splitter_class(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
chunks = splitter.split_documents(documents)</p>
<p>with mlflow.start_run():
mlflow.log_param("chunk_size", chunk_size)
mlflow.log_param("chunk_overlap", chunk_overlap)
mlflow.log_param("splitter_class", splitter_class.__name__)</p>
<p>mlflow.log_metric("num_chunks", len(chunks))
mlflow.log_metric("avg_chunk_length", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))</p>
<p># ประเมินประสิทธิภาพการค้นหา (แบบง่าย)
correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks))
mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)</p>
<p># ประเมินกลยุทธ์ต่างๆ
for chunk_size in [500, 1000, 1500]:
for chunk_overlap in [0, 50, 100]:
for splitter_class in [CharacterTextSplitter, TokenTextSplitter]:
evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class)</p>
<p># เปรียบเทียบผลลัพธ์
best_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]
print(f"กลยุทธ์การแบ่งชิ้นที่ดีที่สุด: {best_run['params.splitter_class']} โดยมีขนาด {best_run['params.chunk_size']} และการซ้อนทับ {best_run['params.chunk_overlap']}")
สคริปต์นี้ประเมินชุดค่าผสมต่างๆ ของขนาดชิ้น การซ้อนทับ และวิธีการแบ่งชิ้น โดยบันทึกผลลัพธ์ไปยัง MLflow สำหรับการเปรียบเทียบที่ง่ายดาย
การแสดงภาพผลการประเมิน LLM
MLflow มีหลายวิธีในการแสดงภาพผลการประเมิน LLM ของคุณ:
การใช้ UI ของ MLflow
หลังจากรันการประเมิน คุณสามารถใช้ UI ของ MLflow เพื่อดูผลลัพธ์:
- เริ่มต้น UI ของ MLflow:
mlflow ui - เปิดเว็บเบราว์เซอร์และไปยัง
http://localhost:5000 - เลือกการทดลองและรันของคุณเพื่อดูเมตริก พารามิเตอร์ และอาร์ติแฟคต์
การแสดงภาพแบบกำหนดเอง
คุณสามารถสร้างการแสดงภาพแบบกำหนดเองของผลการประเมินได้โดยใช้ไลบรารีเช่น Matplotlib หรือ Plotly จากนั้นบันทึกเป็นอาร์ติแฟคต์:
import matplotlib.pyplot as plt
import mlflow
<p>def plot_metric_comparison(metric_name, run_ids):
plt.figure(figsize=(10, 6))
for run_id in run_ids:
run = mlflow.get_run(run_id)
metric_values = mlflow.get_metric_history(run_id, metric_name)
plt.plot([m.step for m in metric_values], [m.value for m in metric_values], label=run.data.tags.get("mlflow.runName", run_id))</p>
<p>plt.title(f"Comparison of {metric_name}")
plt.xlabel("Step")
plt.ylabel(metric_name)
plt.legend()</p>
<p># บันทึกและบันทึกการแสดงภาพ
plt.savefig(f"{metric_name}_comparison.png")
mlflow.log_artifact(f"{metric_name}_comparison.png")</p>
<p># การใช้งาน
with mlflow.start_run():
plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])
ฟังก์ชันนี้สร้างการแสดงภาพเส้นเปรียบเทียบของเมตริกเฉพาะระหว่างรันหลายๆ รัน และบันทึกเป็นอาร์ติแฟคต์














