بناء RAG مع Llama Stack مع Milvus
Llama Stack هو نهج مكدسLlama Stack هو نهج موجه نحو الخدمة يعتمد على واجهة برمجة التطبيقات أولاً لبناء تطبيقات الذكاء الاصطناعي للإنتاج. وهو يوفر مكدسًا عالميًا يسمح للمطورين بالتطوير في أي مكان، والنشر في كل مكان، والاستفادة من وحدات البناء الجاهزة للإنتاج مع استقلالية حقيقية للمزود. تركز حزمة Llama Stack على نماذج Llama الخاصة ب Meta، وقابلية التركيب، والجاهزية للإنتاج، والنظام البيئي للشراكة.
سنقدم في هذا البرنامج التعليمي كيفية إنشاء خادم Llama Stack المكدس الذي تم تكوينه باستخدام Milvus، مما يتيح لك استيراد بياناتك الخاصة لتكون بمثابة قاعدة معرفية. سنقوم بعد ذلك بإجراء استعلامات على الخادم، وإنشاء تطبيق RAG كامل.
إعداد البيئة
هناك العديد من الطرق لبدء تشغيل خادم Llama Stack، مثل مكتبة أو بناء توزيع، إلخ. لكل مكوّن في Llama Stack، يمكن أيضًا اختيار مزودين مختلفين. لذلك، هناك العديد من الطرق لبدء تشغيل خادم Llama Stack.
يستخدم هذا البرنامج التعليمي التكوين التالي كمثال لبدء تشغيل الخدمة. إذا كنت ترغب في بدء تشغيله بطريقة أخرى، يرجى الرجوع إلى بدء تشغيل خادم Llama Stack.
- نستخدم كوندا لبناء توزيع مخصص مع تكوين ميلفوس.
- نستخدم Together AI كموفر LLM.
- نستخدم الافتراضي
all-MiniLM-L6-v2كنموذج التضمين.
يشير هذا البرنامج التعليمي بشكل أساسي إلى دليل التثبيت الرسمي لوثائق Llama Stack. إذا وجدت أي أجزاء قديمة في هذا البرنامج التعليمي، يمكنك إعطاء الأولوية لاتباع الدليل الرسمي وإنشاء مشكلة لنا.
بدء تشغيل خادم لاما ستاك
إعداد البيئة
نظرًا لأننا نحتاج إلى استخدام الذكاء الاصطناعي معًا كخدمة LLM، يجب علينا أولاً تسجيل الدخول إلى الموقع الرسمي لتقديم طلب للحصول على مفتاح API وتعيين مفتاح API TOGETHER_API_KEY كمتغير بيئة.
استنساخ كود مصدر Llama Stack
$ git clone https://github.com/meta-llama/llama-stack.git
$ cd llama-stack
إنشاء بيئة كوندا وتثبيت التبعيات
$ conda create -n stack python=3.10
$ conda activate stack
$ pip install -e .
قم بتعديل المحتوى في llama_stack/llama_stack/template/together/run.yaml ، وتغيير قسم vector_io إلى تكوين ميلفوس ذي الصلة. على سبيل المثال، أضف:
vector_io:
- provider_id: milvus
provider_type: inline::milvus
config:
db_path: ~/.llama/distributions/together/milvus_store.db
# - provider_id: milvus
# provider_type: remote::milvus
# config:
# uri: http://localhost:19530
# token: root:Milvus
في Llama Stack، يمكن تكوين Milvus بطريقتين: التكوين المحلي، وهو inline::milvus ، والتكوين عن بعد، وهو remote::milvus.
أبسط طريقة هي التكوين المحلي، والتي تتطلب تعيين
db_path، وهو مسار لتخزين ملفات Milvus-Lite محليًا.التكوين عن بعد مناسب لتخزين البيانات الكبيرة.
- إذا كان لديك كمية كبيرة من البيانات، يمكنك إعداد خادم Milvus فعال على Docker أو Kubernetes. في هذا الإعداد، يرجى استخدام URI الخادم URI، على سبيل المثال،
http://localhost:19530، كـuri. الافتراضيtokenهوroot:Milvus. - إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، فاضبط
uriوtoken، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
- إذا كان لديك كمية كبيرة من البيانات، يمكنك إعداد خادم Milvus فعال على Docker أو Kubernetes. في هذا الإعداد، يرجى استخدام URI الخادم URI، على سبيل المثال،
بناء التوزيع من القالب
قم بتشغيل الأمر التالي لبناء التوزيع:
$ llama stack build --template together --image-type conda
سيتم إنشاء ملف على ~/.llama/distributions/together/together-run.yaml. بعد ذلك، قم بتشغيل هذا الأمر لبدء تشغيل الخادم:
$ llama stack run --image-type conda ~/.llama/distributions/together/together-run.yaml
إذا سار كل شيء بسلاسة، يجب أن ترى خادم Llama Stack يعمل بنجاح على المنفذ 8321.
تنفيذ RAG من العميل
بمجرد بدء تشغيل الخادم، يمكنك كتابة كود العميل للوصول إليه. إليك عينة من الشيفرة البرمجية:
import uuid
from llama_stack_client.types import Document
from llama_stack_client.lib.agents.agent import Agent
from llama_stack_client.types.agent_create_params import AgentConfig
# See https://www.together.ai/models for all available models
INFERENCE_MODEL = "meta-llama/Llama-3.3-70B-Instruct-Turbo"
LLAMA_STACK_PORT = 8321
def create_http_client():
from llama_stack_client import LlamaStackClient
return LlamaStackClient(
base_url=f"http://localhost:{LLAMA_STACK_PORT}" # Your Llama Stack Server URL
)
client = create_http_client()
# Documents to be used for RAG
urls = ["chat.rst", "llama3.rst", "memory_optimizations.rst", "lora_finetune.rst"]
documents = [
Document(
document_id=f"num-{i}",
content=f"https://raw.githubusercontent.com/pytorch/torchtune/main/docs/source/tutorials/{url}",
mime_type="text/plain",
metadata={},
)
for i, url in enumerate(urls)
]
# Register a vector database
vector_db_id = f"test-vector-db-{uuid.uuid4().hex}"
client.vector_dbs.register(
vector_db_id=vector_db_id,
embedding_model="all-MiniLM-L6-v2",
embedding_dimension=384,
provider_id="milvus",
)
print("inserting...")
# Insert the documents into the vector database
client.tool_runtime.rag_tool.insert(
documents=documents, vector_db_id=vector_db_id, chunk_size_in_tokens=1024,
)
agent_config = AgentConfig(
model=INFERENCE_MODEL,
# Define instructions for the agent ( aka system prompt)
instructions="You are a helpful assistant",
enable_session_persistence=False,
# Define tools available to the agent
toolgroups=[{"name": "builtin::rag", "args": {"vector_db_ids": [vector_db_id]}}],
)
rag_agent = Agent(client, agent_config)
session_id = rag_agent.create_session("test-session")
print("finish init agent...")
user_prompt = (
"What are the top 5 topics that were explained? Only list succinct bullet points."
)
# Get the final answer from the agent
response = rag_agent.create_turn(
messages=[{"role": "user", "content": user_prompt}],
session_id=session_id,
stream=False,
)
print(f"Response: ")
print(response.output_message.content)
قم بتشغيل هذا الرمز لتنفيذ استعلام RAG. إذا كان كل شيء يعمل بشكل صحيح، يجب أن يبدو الإخراج هكذا:
inserting...
finish init agent...
Response:
* Fine-Tuning Llama3 with Chat Data
* Evaluating fine-tuned Llama3-8B models with EleutherAI's Eval Harness
* Generating text with our fine-tuned Llama3 model
* Faster generation via quantization
* Fine-tuning on a custom chat dataset