आज की सूचना-समृद्ध दुनिया में, प्रासंगिक दस्तावेजों को जल्दी से ढूंढना महत्वपूर्ण है। पारंपरिक कीवर्ड-आधारित खोज प्रणाली अक्सर शब्दार्थ अर्थ से निपटने के दौरान कम हो जाती है। यह ट्यूटोरियल दर्शाता है कि एक शक्तिशाली दस्तावेज़ खोज इंजन का निर्माण कैसे करें:
- समृद्ध वेक्टर अभ्यावेदन में पाठ को परिवर्तित करने के लिए चेहरे के एम्बेडिंग मॉडल को गले लगाना
- कुशल समानता खोज के लिए हमारे वेक्टर डेटाबेस के रूप में क्रोमा डीबी
- उच्च गुणवत्ता वाले पाठ एम्बेडिंग के लिए वाक्य ट्रांसफार्मर
यह कार्यान्वयन सिमेंटिक खोज क्षमताओं को सक्षम बनाता है – केवल कीवर्ड मिलान के बजाय अर्थ के आधार पर दस्तावेज़ ढूंढना। इस ट्यूटोरियल के अंत तक, आपके पास एक कार्य दस्तावेज़ खोज इंजन होगा जो कर सकता है:
- प्रक्रिया और पाठ दस्तावेज एम्बेड करें
- इन एम्बेडिंग को कुशलता से स्टोर करें
- किसी भी क्वेरी के लिए सबसे समान रूप से समान दस्तावेजों को पुनः प्राप्त करें
- विभिन्न प्रकार के दस्तावेज़ प्रकार और खोज आवश्यकताओं को संभालें
कृपया Docsearchagent को लागू करने के लिए अनुक्रम में नीचे दिए गए विस्तृत चरणों का पालन करें।
सबसे पहले, हमें आवश्यक पुस्तकालयों को स्थापित करने की आवश्यकता है।
!pip install chromadb sentence-transformers langchain datasets
आइए हम उन पुस्तकालयों को आयात करें जो हम उपयोग करेंगे:
import os
import numpy as np
import pandas as pd
from datasets import load_dataset
import chromadb
from chromadb.utils import embedding_functions
from sentence_transformers import SentenceTransformer
from langchain.text_splitter import RecursiveCharacterTextSplitter
import time
इस ट्यूटोरियल के लिए, हम हगिंग फेस डेटासेट लाइब्रेरी से विकिपीडिया लेखों के एक सबसेट का उपयोग करेंगे। यह हमें काम करने के लिए दस्तावेजों का एक विविध सेट देता है।
dataset = load_dataset("wikipedia", "20220301.en", split="train(:1000)")
print(f"Loaded {len(dataset)} Wikipedia articles")
documents = ()
for i, article in enumerate(dataset):
doc = {
"id": f"doc_{i}",
"title": article("title"),
"text": article("text"),
"url": article("url")
}
documents.append(doc)
df = pd.DataFrame(documents)
df.head(3)
अब, आइए हमारे दस्तावेजों को अधिक दानेदार खोज के लिए छोटे विखंडन में विभाजित करें:
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
chunks = ()
chunk_ids = ()
chunk_sources = ()
for i, doc in enumerate(documents):
doc_chunks = text_splitter.split_text(doc("text"))
chunks.extend(doc_chunks)
chunk_ids.extend((f"chunk_{i}_{j}" for j in range(len(doc_chunks))))
chunk_sources.extend((doc("title")) * len(doc_chunks))
print(f"Created {len(chunks)} chunks from {len(documents)} documents")
हम अपने एम्बेडिंग बनाने के लिए चेहरे को गले लगाने से एक पूर्व-प्रशिक्षित वाक्य ट्रांसफार्मर मॉडल का उपयोग करेंगे:
model_name = "sentence-transformers/all-MiniLM-L6-v2"
embedding_model = SentenceTransformer(model_name)
sample_text = "This is a sample text to test our embedding model."
sample_embedding = embedding_model.encode(sample_text)
print(f"Embedding dimension: {len(sample_embedding)}")
अब, चलो हमारे खोज इंजन के लिए एकदम सही एक हल्के वेक्टर डेटाबेस क्रोमा डीबी सेट करते हैं:
chroma_client = chromadb.Client()
embedding_function = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=model_name)
collection = chroma_client.create_collection(
name="document_search",
embedding_function=embedding_function
)
batch_size = 100
for i in range(0, len(chunks), batch_size):
end_idx = min(i + batch_size, len(chunks))
batch_ids = chunk_ids(i:end_idx)
batch_chunks = chunks(i:end_idx)
batch_sources = chunk_sources(i:end_idx)
collection.add(
ids=batch_ids,
documents=batch_chunks,
metadatas=({"source": source} for source in batch_sources)
)
print(f"Added batch {i//batch_size + 1}/{(len(chunks)-1)//batch_size + 1} to the collection")
print(f"Total documents in collection: {collection.count()}")
अब रोमांचक हिस्सा आता है – हमारे दस्तावेजों के माध्यम से खोज:
def search_documents(query, n_results=5):
"""
Search for documents similar to the query.
Args:
query (str): The search query
n_results (int): Number of results to return
Returns:
dict: Search results
"""
start_time = time.time()
results = collection.query(
query_texts=(query),
n_results=n_results
)
end_time = time.time()
search_time = end_time - start_time
print(f"Search completed in {search_time:.4f} seconds")
return results
queries = (
"What are the effects of climate change?",
"History of artificial intelligence",
"Space exploration missions"
)
for query in queries:
print(f"\nQuery: {query}")
results = search_documents(query)
for i, (doc, metadata) in enumerate(zip(results('documents')(0), results('metadatas')(0))):
print(f"\nResult {i+1} from {metadata('source')}:")
print(f"{doc(:200)}...")
आइए एक बेहतर उपयोगकर्ता अनुभव प्रदान करने के लिए एक सरल फ़ंक्शन बनाएं:
def interactive_search():
"""
Interactive search interface for the document search engine.
"""
while True:
query = input("\nEnter your search query (or 'quit' to exit): ")
if query.lower() == 'quit':
print("Exiting search interface...")
break
n_results = int(input("How many results would you like? "))
results = search_documents(query, n_results)
print(f"\nFound {len(results('documents')(0))} results for '{query}':")
for i, (doc, metadata, distance) in enumerate(zip(
results('documents')(0),
results('metadatas')(0),
results('distances')(0)
)):
relevance = 1 - distance
print(f"\n--- Result {i+1} ---")
print(f"Source: {metadata('source')}")
print(f"Relevance: {relevance:.2f}")
print(f"Excerpt: {doc(:300)}...")
print("-" * 50)
interactive_search()
आइए मेटाडेटा द्वारा हमारे खोज परिणामों को फ़िल्टर करने की क्षमता जोड़ें:
def filtered_search(query, filter_source=None, n_results=5):
"""
Search with optional filtering by source.
Args:
query (str): The search query
filter_source (str): Optional source to filter by
n_results (int): Number of results to return
Returns:
dict: Search results
"""
where_clause = {"source": filter_source} if filter_source else None
results = collection.query(
query_texts=(query),
n_results=n_results,
where=where_clause
)
return results
unique_sources = list(set(chunk_sources))
print(f"Available sources for filtering: {len(unique_sources)}")
print(unique_sources(:5))
if len(unique_sources) > 0:
filter_source = unique_sources(0)
query = "main concepts and principles"
print(f"\nFiltered search for '{query}' in source '{filter_source}':")
results = filtered_search(query, filter_source=filter_source)
for i, doc in enumerate(results('documents')(0)):
print(f"\nResult {i+1}:")
print(f"{doc(:200)}...")
निष्कर्ष में, हम प्रदर्शित करते हैं कि कैसे एक सिमेंटिक डॉक्यूमेंट सर्च इंजन का निर्माण किया जाए, जो हगिंग फेस एम्बेडिंग मॉडल और CHROMADB का उपयोग करके। सिस्टम पाठ को वेक्टर अभ्यावेदन में बदलकर केवल कीवर्ड के बजाय अर्थ के आधार पर दस्तावेजों को पुनः प्राप्त करता है। कार्यान्वयन प्रक्रिया विकिपीडिया लेख उन्हें ग्रैन्युलैरिटी के लिए काट देती है, उन्हें वाक्य ट्रांसफॉर्मर का उपयोग करके एम्बेड करती है, और उन्हें कुशल पुनर्प्राप्ति के लिए एक वेक्टर डेटाबेस में संग्रहीत करती है। अंतिम उत्पाद में इंटरैक्टिव खोज, मेटाडेटा फ़िल्टरिंग और प्रासंगिकता रैंकिंग है।
यह रहा कोलैब नोटबुक। इसके अलावा, हमें फॉलो करना न भूलें ट्विटर और हमारे साथ जुड़ें तार -चैनल और लिंक्डइन जीआरओयूपी। हमारे साथ जुड़ने के लिए मत भूलना 80K+ एमएल सब्रेडिट।

Asif Razzaq MarkTechPost Media Inc के सीईओ हैं .. एक दूरदर्शी उद्यमी और इंजीनियर के रूप में, ASIF सामाजिक अच्छे के लिए कृत्रिम बुद्धिमत्ता की क्षमता का उपयोग करने के लिए प्रतिबद्ध है। उनका सबसे हालिया प्रयास एक आर्टिफिशियल इंटेलिजेंस मीडिया प्लेटफॉर्म, मार्कटेकपोस्ट का शुभारंभ है, जो मशीन लर्निंग और डीप लर्निंग न्यूज के अपने गहन कवरेज के लिए खड़ा है, जो तकनीकी रूप से ध्वनि और आसानी से एक व्यापक दर्शकों द्वारा समझ में आता है। मंच 2 मिलियन से अधिक मासिक विचारों का दावा करता है, दर्शकों के बीच अपनी लोकप्रियता को दर्शाता है।