पाठ 20 / 31
Vector Index और Retriever बनाना
Nodes embed करें और सबसे समान वाले retrieve करें।
कुछ पंक्तियों में VectorStoreIndex
VectorStoreIndex.from_documents(docs) Documents को nodes में parse करता है, configured embedding model से embed करता है और उन्हें रखता है (डिफ़ॉल्ट रूप से memory में, या बाहरी vector store में)। LLM और embedding model के वैश्विक डिफ़ॉल्ट Settings में रहते हैं; व्यवहार स्पष्ट रखने को उन्हें स्पष्ट रूप से सेट करें। index.as_retriever(similarity_top_k=2) ऐसा retriever देता है जिसका retrieve(query) NodeWithScore ऑब्जेक्ट्स देता है: node और similarity score। अलग query पैटर्न के लिए अन्य index प्रकार हैं (summary, keyword table, knowledge graph, property graph)।
खिलौना embedding से retrieval, चलाकर
मैंने यह Python virtual environment में langchain-core 1.6.6, langchain-text-splitters 1.1.2 और llama-index-core 0.14.25 के साथ ऑफ़लाइन चलाया। किसी API key या network call की ज़रूरत नहीं क्योंकि असली मॉडल की जगह fake मॉडल या खिलौना embedding है। Custom BaseEmbedding शब्दों को 16 buckets में hash करता है (कोई अर्थ नहीं, इसलिए सिर्फ़ साझा शब्द मिलते हैं)। Leave सवाल leave दस्तावेज़ से 0.647 और hotel दस्तावेज़ से 0.316 पाता है, जो शब्द "per" साझा करता है। असली embedding मॉडल पर्यायवाची भी मिलाता।
from llama_index.core import Document, VectorStoreIndex, Settings
from llama_index.core.embeddings import BaseEmbedding
from llama_index.core.llms import MockLLM
import hashlib, math
class HashEmbedding(BaseEmbedding):
"""Toy deterministic embedding: hashes words into 16 buckets (no meaning, like a bag of words)."""
def _vec(self, text):
v = [0.0] * 16
for w in text.lower().split():
v[int(hashlib.md5(w.strip(".,?").encode()).hexdigest(), 16) % 16] += 1
n = math.sqrt(sum(x * x for x in v)) or 1
return [x / n for x in v]
def _get_query_embedding(self, query): return self._vec(query)
def _get_text_embedding(self, text): return self._vec(text)
async def _aget_query_embedding(self, query): return self._vec(query)
Settings.llm = MockLLM()
Settings.embed_model = HashEmbedding()
docs = [Document(text="Employees get 24 days of paid leave per year."),
Document(text="Hotels are capped at 6000 rupees per night."),
Document(text="Report lost laptops within 24 hours.")]
index = VectorStoreIndex.from_documents(docs)
retriever = index.as_retriever(similarity_top_k=2)
for r in retriever.retrieve("how many days of leave per year"):
print(round(r.score, 3), "|", r.node.get_content())
Output:
0.647 | Employees get 24 days of paid leave per year. 0.316 | Hotels are capped at 6000 rupees per night.
Settings स्पष्ट रूप से सेट करें
डिफ़ॉल्ट पर निर्भर रहें तो library hosted मॉडल बुलाने और API key माँगने की कोशिश कर सकती है। Settings.llm और Settings.embed_model सेट करने से आपका app अनुमेय बनता है।
त्वरित जाँच: Node पाठ के अलावा retriever के परिणाम में क्या शामिल है?
- GPU temperature
- Similarity score
- Password
- नया मॉडल
Answer
Similarity score — NodeWithScore हर node को उसके मिलान की गुणवत्ता से जोड़ता है।