نحوه استفاده از LlamaIndex: یک راهنمای عملی از صفر تا تولید
اگر تا به حال سعی کردهاید یک برنامه تولید با کمک بازیابی (RAG) بسازید و فکر کردهاید، «چرا سیمکشی embeddingها، ذخیرهسازی برداری و prompts اینقدر دشوار است؟»، شما تنها نیستید. LlamaIndex وجود دارد تا این خط لوله را سریع، منطقی و آماده تولید کند. در این راهنمای عملی و راه حل محور، ما نحوه استفاده از LlamaIndex را به صورت end to end بررسی خواهیم کرد—دریافت داده، فهرستبندی، پرس و جو، ارزیابی و استقرار—بنابراین میتوانید چیزی قابل اعتماد را بدون گم شدن در کد چسبنده ارسال کنید.
ما از یک ساختار سوال محور با مراحل پیشرونده، قطعههای قابل اجرا و نکات دنیای واقعی استفاده خواهیم کرد. چه در حال نمونهسازی یک chatbot برای اسناد داخلی باشید و چه در حال استقرار یک دستیار دانش برای مشتریان، یادگیری نحوه استفاده موثر از LlamaIndex باعث صرفهجویی در وقت شما میشود.
: LlamaIndex یک چارچوب است که به شما کمک میکند دادههای خود را با ابزارهای فهرستبندی، بازیابی و هماهنگسازی به مدلهای زبانی بزرگ متصل کنید—ایدهآل برای RAG، agents و خروجیهای ساختاریافته.
LlamaIndex چیست و چرا باید از آن استفاده کرد؟
- LlamaIndex یک چارچوب داده برای برنامههای LLM است. این چارچوب بلوکهای ساختمانی را برای موارد زیر فراهم میکند:
- دریافت: بارگیری فایلها، صفحات وب، پایگاههای داده و APIها.
- تکهتکه کردن و فهرستبندی: تبدیل محتوای خام به ساختارهای قابل پرس و جو (بردار، کلمه کلیدی، فهرستهای گراف).
- بازیابی: بازیابی متن با استراتژیهای انعطافپذیر (BM25، ترکیبی، رتبهبندی مجدد).
- موتورهای پرس و جو و Agents: ترکیب بازیابی، ابزارها و prompts در یک تجربه QA منسجم.
- ارزیابی و نظارت: قضاوت در مورد کیفیت بازیابی و ارتباط پاسخ.
- چه زمانی از LlamaIndex استفاده کنیم:
- شما یک پشته RAG قوی بدون اختراع مجدد تکهتکه کردن، embeddingها و بازیابی میخواهید.
- شما نیاز به ترکیب چندین منبع داده (PDFها + Notion + SQL) دارید.
- شما میخواهید با بازیابی ترکیبی، رتبهبندی مجدد یا خروجیهای ساختاریافته آزمایش کنید.
- مدل ذهنی اصلی هنگام یادگیری نحوه استفاده از LlamaIndex:
- داده → Nodes → Index → Retriever → Query Engine → App
شروع سریع: حداقل حلقه RAG
این سریعترین مسیر برای یک نمونه اولیه کارآمد است. ما اسناد را بارگیری میکنیم، یک فهرست برداری میسازیم و سوال میپرسیم.
# 1) نصب
# pip install llama-index llama-index-embeddings-openai llama-index-llms-openai
import os
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
# 2) مدل + embeddingهای خود را پیکربندی کنید
os.environ["OPENAI_API_KEY"] = "YOUR_KEY" # or use any supported LLM/embedding provider
llm = OpenAI(model="gpt-4o-mini")
embed_model = OpenAIEmbedding(model="text-embedding-3-small")
# 3) بارگیری اسناد (به عنوان مثال، ./data/*.pdf، .md، .txt)
docs = SimpleDirectoryReader("./data").load_data
# 4) ساخت یک فهرست
index = VectorStoreIndex.from_documents(docs, embed_model=embed_model)
# 5) ایجاد یک موتور پرس و جو و پرسیدن یک سوال
query_engine = index.as_query_engine(llm=llm)
response = query_engine.query("What are the key security practices mentioned in the docs?")
print(response)
این جوهره کار است. از اینجا، برنامههای واقعی تکهتکه کردن بهتر، رتبهبندی مجدد، prompts ساختاریافته و قابلیت مشاهده را اضافه میکنند.
دریافت: دادههای خود را به روش صحیح (BYOD) بیاورید
هنگامی که تصمیم میگیرید چگونه از LlamaIndex برای دادههای واقعی استفاده کنید، لودرهایی را انتخاب کنید که با منابع شما مطابقت داشته باشند و ساختار را حفظ کنند.
- فایلها:
SimpleDirectoryReader، خوانندههای PDF/HTML/Markdown
- وب:
BeautifulSoupWebReader، خوانندههای sitemap
- SaaS: Notion، Confluence، Slack، Google Drive (از طریق کانکتورها)
- پایگاههای داده: SQL و DBهای برداری (Pinecone، Weaviate، Chroma، Elasticsearch)
- نکته: فراداده (عنوان، نویسنده، URL، created_at) را عادی کنید. فراداده خوب بعداً رتبهبندی مجدد و فیلتر کردن را فوقالعاده میکند.
from llama_index.core import SimpleDirectoryReader
from llama_index.readers.web import SimpleWebPageReader
file_docs = SimpleDirectoryReader("./policies").load_data
web_docs = SimpleWebPageReader(html_to_text=True).load_data
all_docs = file_docs + web_docs
تکهتکه کردن و تجزیهکنندههای Node: آشغال وارد شود، آشغال خارج میشود
درست کردن تکهتکه کردن یکی از مهمترین مراحل هنگام یادگیری نحوه استفاده موثر از LlamaIndex است.
- چرا تکهتکه کردن مهم است: خیلی بزرگ → تورم توکن و بازیابی نامربوط. خیلی کوچک → تکهتکه شدن متن.
- پیشفرضها: برای بسیاری از موارد معقول است، اما برای نوع محتوای خود تنظیم کنید.
- اسناد فنی: تکههای 512–1024 توکنی با 10–20٪ همپوشانی.
- سوالات متداول: تکههای کوچکتر (256–512) برای حفظ جفتهای پرسش/پاسخ دست نخورده.
- حقوقی/سیاست: تکههای بزرگتر (1024–1536) برای حفظ تعاریف + بندها.
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core import Document
parser = SentenceSplitter(chunk_size=800, chunk_overlap=100)
nodes = []
for d in all_docs:
nodes.extend(parser.get_nodes_from_documents([Document(text=d.text, metadata=d.metadata)]))
استراتژیهای فهرست: برداری، کلمه کلیدی یا ترکیبی؟
انتخاب فهرست مناسب بسیار مهم است. خبر خوب: LlamaIndex به شما امکان میدهد آنها را ترکیب کنید.
- فهرست برداری: برای جستجوی معنایی عالی است. بهترین برای «توضیح X» یا پرس و جوهای فازی.
- کلمه کلیدی (BM25): قوی برای اصطلاحات دقیق، شناسهها، کدهای خطا، گزارشها.
- ترکیبی: هر دو را ترکیب کنید؛ کاندیداهای برتر را با یک LLM یا cross‑encoder رتبهبندی مجدد کنید.
from llama_index.core import VectorStoreIndex, SummaryIndex
from llama_index.core.retrievers import BM25Retriever
from llama_index.core.query_engine import RetrieverQueryEngine
# Vector index from pre-parsed nodes
v_index = VectorStoreIndex(nodes)
# BM25 keyword retriever
bm25_retriever = BM25Retriever.from_defaults(nodes=nodes, similarity_top_k=6)
# Hybrid: merge candidates, then rerank
from llama_index.core.retrievers import RouterRetriever
from llama_index.retrievers.merge import MergerRetriever
v_retriever = v_index.as_retriever(similarity_top_k=6)
hybrid = MergerRetriever(retrievers=[v_retriever, bm25_retriever], top_k=8)
query_engine = RetrieverQueryEngine.from_args(retriever=hybrid)
رتبهبندی مجدد و فیلترها: افزایش دقت بدون پرداخت بیش از حد
رتبهبندی مجدد با مرتبسازی مجدد تکههای بازیابی شده بر اساس ارتباط، کیفیت پاسخ را بهبود میبخشد.
- چه زمانی رتبهبندی مجدد کنیم: اگر کاربران استنادهای خارج از موضوع یا متنهای طولانی و پر شده را گزارش دهند.
- Cross‑encoders (جستجوی embedding دو رمزگذار → رتبهبندی مجدد cross‑encoder)
- رتبهبندی مجدد مبتنی بر LLM (هزینهبرتر، گاهی اوقات هوشمندتر در متنهای ظریف)
- فیلترهای فراداده (به عنوان مثال،
source == 'handbook'، created_at > 2024-01-01)
from llama_index.postprocessor.flag_embedding_reranker import FlagEmbeddingReranker
from llama_index.core.query_engine import RetrieverQueryEngine
reranker = FlagEmbeddingReranker(top_n=5, model="BAAI/bge-reranker-base")
query_engine = v_index.as_query_engine(
similarity_top_k=12,
node_postprocessors=[reranker]
)
Prompting و موتورهای پرس و جو: از جستجو تا پاسخ
یک موتور پرس و جو جایی است که بازیابی با تولید ملاقات میکند. برای تسلط بر نحوه استفاده از LlamaIndex در تولید، prompts و ترکیب پاسخ را با دقت طراحی کنید.
- «stuff» ساده (الحاق) برای متنهای کوچک
- درخت یا کاهش نقشه برای متنهای طولانیتر
- حالت استناد برای نشان دادن منابع
from llama_index.core.response_synthesizers import get_response_synthesizer
from llama_index.core import ServiceContext
synth = get_response_synthesizer(response_mode="tree_summarize")
query_engine = v_index.as_query_engine(response_synthesizer=synth)
ans = query_engine.query("Summarize the onboarding steps and cite sources.")
print(ans)
- Prompts سفارشی: لحن، خروجیهای ساختاریافته یا guardrails را تنظیم کنید.
from llama_index.core.prompts import PromptTemplate
qa_tmpl = PromptTemplate(
"""
You are a terse, evidence-first assistant. Use only the provided context.
If unsure, say you don't know. Return JSON with keys: answer, sources.
Question: {query_str}
Context: {context_str}
"""
)
query_engine = v_index.as_query_engine(text_qa_template=qa_tmpl)
Agents و ابزارها: وقتی بازیابی کافی نیست
گاهی اوقات پاسخها نیاز به اقدام دارند: اجرای SQL، فراخوانی APIها یا مرور. LlamaIndex agents ابزارها و استدلال را با خط لوله بازیابی شما هماهنگ میکنند.
- موارد استفاده: داشبوردهای KPI (ابزار SQL)، رباتهای پشتیبانی (API جستجوی بلیط)، agents تحقیقاتی (وب + RAG).
from llama_index.core.agent import ReActAgent
from llama_index.tools.sql import SQLQueryEngineTool
from sqlalchemy import create_engine
engine = create_engine("sqlite:///analytics.db")
sql_tool = SQLQueryEngineTool.from_engine(engine)
agent = ReActAgent.from_tools([sql_tool], llm=llm, verbose=True)
agent.chat("What was monthly churn in Q2 2025? If needed, query the DB.")
ارزیابی: کورکورانه ارسال نکنید
یادگیری نحوه استفاده مسئولانه از LlamaIndex به معنای اعتبارسنجی بازیابی و پاسخها قبل از راهاندازی است.
- ارزیابی آفلاین: فراخوانی/دقت بازیابی را در یک مجموعه برچسبگذاری شده قضاوت کنید.
- ارزیابی آنلاین: prompts کاربر را ثبت کنید، رضایت، نرخهای انحراف و توهمات را اندازهگیری کنید.
- ساخته شده‑ins: LlamaIndex کمککنندههای ارزیابی را برای وفاداری و ارتباط پاسخ ارائه میدهد.
from llama_index.core.evaluation import FaithfulnessEvaluator, RelevancyEvaluator
faith = FaithfulnessEvaluator(llm=llm)
rel = RelevancyEvaluator(llm=llm)
pred = query_engine.query("List SOC 2 control families in our policy.")
print("faithful?", faith.evaluate_response(pred))
print("relevant?", rel.evaluate_response(pred))
- نوار عملی: برای دستیاران داخلی، قبل از راهاندازی گسترده، >80% رتبهبندی «مفید» را در پرس و جوهای برتر هدف قرار دهید.
ماندگاری و ذخیرهسازی برداری: آن را مقیاسپذیر کنید
فهرستهای ساخته شده در حافظه برای حجم کاری واقعی کافی نیستند. در یک DB برداری ذخیره کنید و بهروزرسانیهای افزایشی را فعال کنید.
- بکاندهای محبوب: Pinecone، Weaviate، Chroma، Elasticsearch/OpenSearch، Qdrant.
- نکته: از namespaces به ازای هر مستاجر یا بخش استفاده کنید؛ فراداده را غنی نگه دارید.
# مثال: Chroma
# pip install chromadb llama-index-vector-stores-chroma
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
import chromadb
chroma_client = chromadb.PersistentClient(path="./chroma_store")
collection = chroma_client.get_or_create_collection("company_knowledge")
vector_store = ChromaVectorStore(chroma_collection=collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(all_docs, storage_context=storage_context)
امنیت و حکمرانی: بخشی که همه فراموش میکنند
- مدیریت PII: فیلدهای حساس را در طول دریافت ویرایش یا هش کنید.
- کنترلهای دسترسی: با محدودیتهای فراداده، بر اساس نقشهای کاربر فیلتر کنید.
- تازگی محتوا: دریافت مجدد را زمانبندی کنید؛ نسخهها را علامتگذاری کنید.
- ایمنی: سیاستهای امتناع و محدودیتهای فقط منبع را در prompts اضافه کنید.
# مثال: فیلتر کردن مبتنی بر فراداده در زمان پرس و جو
retriever = index.as_retriever(similarity_top_k=8)
retriever.metadata_filters = {"department": ["legal", "security"], "published": [True]}
از نمونه اولیه تا تولید: الگوهای استقرار
- الگوی سرور: یک endpoint
/query را در معرض دید قرار دهید؛ فهرست را در حافظه گرم نگه دارید.
- Serverless gotcha: شروع سرد + مدلهای بزرگ میتوانند به تأخیر آسیب برسانند؛ استنتاج مدیریت شده را در نظر بگیرید.
- ذخیرهسازی در حافظه پنهان: embeddingها و نتایج پرس و جوهای مکرر را ذخیره کنید؛ بهروزرسانیهای جزئی را فعال کنید.
- قابلیت مشاهده: گرههای بازیابی شده، میزان استفاده از توکن، طول پاسخ و بازخورد کاربر را ثبت کنید.
# حداقل بستهبندی FastAPI
# pip install fastapi uvicorn
from fastapi import FastAPI
app = FastAPI
qe = index.as_query_engine(llm=llm)
@app.post("/query")
async def query(payload: dict):
q = payload.get("q", "")
resp = qe.query(q)
return {"answer": str(resp), "sources": [s.node.metadata for s in resp.source_nodes]}
طرحهای واقعی‑World: مسیر خود را انتخاب کنید
- فهرست: ترکیبی (BM25 + برداری) با رتبهبندی مجدد
- Guardrails: حالت فقط منبع؛ «من نمیدانم» fallback
- KPI: نرخ وضوح برای سوالات سیاست
- فهرست: اسناد محصول + یادداشتهای انتشار + بلیطها
- Agents: ابزار API برای بررسی وضعیت سفارش/بلیط
- KPI: وضوح تماس اول، انحراف، CSAT
- فهرست: وب + PDFها + یادداشتها؛ حذف تکراری قوی
- رتبهبندی مجدد: Cross‑encoder; ترکیب: کاهش نقشه
- KPI: زمان بینش؛ دقت استناد
- ابزارها: موتور SQL + RAG در تعاریف متریک
- حکمرانی: سیاستهای سطح ردیف؛ ممیزی پرس و جو
- KPI: صحت در مقابل حقیقت زمینی
هزینه و تأخیر: آن را سریع (و ارزان) نگه دارید
- Embeddings: در صورت امکان دستهای کنید؛ از مدلهای کوچکتر برای فراخوانی استفاده کنید، به طور انتخابی رتبهبندی مجدد کنید.
- اندازه متن: 1–2k توکن از مرتبطترین تکهها را هدف قرار دهید.
- ذخیرهسازی در حافظه پنهان: بازیابی top‑K را برای پرس و جوهای داغ ذخیره کنید؛ فراخوانیهای LLM را با prompts هش شده به خاطر بسپارید.
- موازیسازی: Fan‑out بازیابی → fan‑in رتبهبندی مجدد برای کاهش تأخیر دم.
اشتباهات رایج هنگام یادگیری نحوه استفاده از LlamaIndex
- تکهتکه کردن بیش از حد، منجر به بازیابی سطحی و پر سر و صدا میشود
- بدون فیلترهای فراداده، باعث میشود منابع نامربوط وارد شوند
- تکیه بر یک نوع فهرست واحد برای همه محتوا
- رد شدن از ارزیابی؛ ارسال بدون نوار کیفیت
- اجازه دادن به کهنه شدن فهرستها؛ بدون تازهسازی برنامهریزی شده
به هر حال: سرعت بخشیدن به گردش کار خود در ویرایشگر
همانطور که روی prompts، chunkers و تنظیمات بازیابی تکرار میکنید، شایان ذکر است که یک نوار کناری کدنویسی و تحقیق هوش مصنوعی مانند Sider.ai میتواند حلقه را تسریع کند. میتوانید قطعهها، prompts و یادداشتهای ارزیابی را در دسترس داشته باشید، diffهای تغییرات prompt را ایجاد کنید و به سرعت تغییرات را بدون خروج از مرورگر خود آزمایش کنید. این امر به ویژه زمانی مفید است که در حال تنظیم نحوه استفاده از LlamaIndex در استراتژیهای مختلف بازیابی هستید. چک لیست گام به گام: از صفر تا تولید
- منابع را دریافت کنید و فراداده را عادی کنید
- اندازههای تکه را بر اساس نوع محتوا تنظیم کنید
- فهرستهای برداری + BM25 بسازید؛ بازیابی ترکیبی را فعال کنید
- رتبهبندی مجدد و فیلترهای فراداده را اضافه کنید
- Prompts را سفارشی کنید؛ استنادها و سیاست امتناع را فعال کنید
- وفاداری و ارتباط را در یک مجموعه آزمایشی ارزیابی کنید
- در یک ذخیرهسازی برداری پایدار ذخیره کنید؛ بهروزرسانیهای افزایشی را فعال کنید
- قابلیت مشاهده، ذخیرهسازی در حافظه پنهان و فیلترهای RBAC را اضافه کنید
- در یک API بپیچید و SLAها را تنظیم کنید؛ حالتهای خرابی را مستند کنید
نکات کلیدی
- اگر یک برنامه RAG قوی میخواهید، یادگیری نحوه استفاده از LlamaIndex هفتهها مهندسی چسب را نجات میدهد.
- ساده شروع کنید، سپس بازیابی ترکیبی، رتبهبندی مجدد و prompts ساختاریافته را لایه بندی کنید.
- قبل از مقیاسبندی ارزیابی کنید؛ فهرستها را حفظ کنید و کیفیت را در تولید نظارت کنید.
- از روز اول برای حکمرانی طراحی کنید—امنیت یک bolt‑on نیست.
مراحل بعدی
- نمونه اولیه شروع سریع را در یک مجموعه اسناد کوچک بسازید.
- با بازیابی ترکیبی و یک رتبهبندی مجدد آزمایش کنید.
- ارزیابی و استنادها را اضافه کنید؛ معیارهای کیفیت را پیگیری کنید.
- به یک ذخیرهسازی برداری پایدار بروید و یک API مستقر کنید.
سوالات متداول
Q1: LlamaIndex در برنامههای RAG برای چه مواردی استفاده میشود؟
LlamaIndex به شما کمک میکند دادههای خود را با اجزای دریافت، فهرستبندی و بازیابی به LLMها متصل کنید. این سیستم ساخت سیستمهای RAG را با مدیریت تکهتکه کردن، فهرستهای برداری/کلمه کلیدی و هماهنگسازی پرس و جو ساده میکند.
Q2: چگونه نوع فهرست مناسب را در LlamaIndex انتخاب کنم؟
از یک فهرست برداری برای پرس و جوهای معنایی، BM25 برای مطابقتهای دقیق مانند شناسهها یا کدها و یک رویکرد ترکیبی برای بهترین فراخوانی و دقت کلی استفاده کنید. بسیاری از تیمها هر دو را ترکیب میکنند و رتبهبندی مجدد را برای نتایج top‑K اضافه میکنند.
سوال 3: چگونه میتوانم دقت را هنگام استفاده از LlamaIndex افزایش دهم؟
اندازه قطعات را تنظیم کنید، فرادادههای غنی را وارد کنید، بازیابی ترکیبی را فعال کنید و یک رتبهبند (reranker) اضافه کنید. همچنین ارزیابی را برای صحت و ارتباط پیادهسازی کنید و از حالت استناد (citation mode) برای نشان دادن منابع استفاده کنید.
سوال 4: آیا LlamaIndex میتواند با پایگاه داده برداری موجود من کار کند؟
بله. LlamaIndex با فروشگاههای برداری محبوب مانند Pinecone، Weaviate، Chroma، Qdrant و Elasticsearch ادغام میشود. برای مقیاسپذیری و بهروزرسانیهای تدریجی، فهرستها را ذخیره کنید.
سوال 5: چگونه یک برنامه LlamaIndex را در محیط عملیاتی (production) مستقر کنم؟
موتور جستجوی خود را در یک API (به عنوان مثال، FastAPI) بپیچید، دادهها را در یک فروشگاه برداری ذخیره کنید، قابلیت ذخیرهسازی موقت (caching) و قابلیت مشاهده (observability) را اضافه کنید و کیفیت را به طور مداوم ارزیابی کنید. فیلترهای فراداده و کنترل دسترسی را برای امنیت اعمال کنید.