تطبيق Streamlit للبحث الدلالي متعدد اللغات في أكثر من 10 ملايين مستند ويكيبيديا تم توجيهها في عمليات التضمين بواسطة Weaviate. يعتمد هذا التنفيذ على مدونة Cohere ´Using LLMs for Search´ والمفكرة المقابلة لها. فهو يتيح مقارنة أداء البحث عن الكلمات الرئيسية والاسترجاع الكثيف والبحث المختلط للاستعلام عن مجموعة بيانات ويكيبيديا. ويوضح كذلك استخدام Cohere Rerank لتحسين دقة النتائج، وCohere Generate لتوفير استجابة بناءً على النتائج المرتبة المذكورة.
يشير البحث الدلالي إلى خوارزميات البحث التي تأخذ في الاعتبار القصد والمعنى السياقي لعبارات البحث عند توليد النتائج، بدلاً من التركيز فقط على مطابقة الكلمات الرئيسية. فهو يوفر نتائج أكثر دقة وذات صلة من خلال فهم الدلالات أو المعنى وراء الاستعلام.
التضمين عبارة عن ناقل (قائمة) لأرقام الفاصلة العائمة التي تمثل بيانات مثل الكلمات أو الجمل أو المستندات أو الصور أو الصوت. التمثيل الرقمي المذكور يجسد سياق البيانات وتسلسلها الهرمي وتشابهها. يمكن استخدامها للمهام النهائية مثل التصنيف والتجميع والكشف الخارجي والبحث الدلالي.
تم تصميم قواعد بيانات المتجهات، مثل Weaviate، خصيصًا لتحسين إمكانات التخزين والاستعلام عن عمليات التضمين. من الناحية العملية، تستخدم قاعدة بيانات المتجهات مجموعة من الخوارزميات المختلفة التي تشارك جميعها في البحث عن أقرب جار تقريبي (ANN). تعمل هذه الخوارزميات على تحسين البحث من خلال التجزئة أو التكميم أو البحث القائم على الرسم البياني.
مطابقة الكلمات الرئيسية: تبحث عن الكائنات التي تحتوي على مصطلحات البحث في خصائصها. يتم تسجيل النتائج وفقًا لوظيفة BM25F:
@ retry ( wait = wait_random_exponential ( min = 1 , max = 5 ), stop = stop_after_attempt ( 5 ))
def with_bm25 ( self , query , lang = 'en' , top_n = 10 ) -> list :
"""
Performs a keyword search (sparse retrieval) on Wikipedia Articles using embeddings stored in Weaviate.
Parameters:
- query (str): The search query.
- lang (str, optional): The language of the articles. Default is 'en'.
- top_n (int, optional): The number of top results to return. Default is 10.
Returns:
- list: List of top articles based on BM25F scoring.
"""
logging . info ( "with_bm25()" )
where_filter = {
"path" : [ "lang" ],
"operator" : "Equal" ,
"valueString" : lang
}
response = (
self . weaviate . query . get ( "Articles" , self . WIKIPEDIA_PROPERTIES )
. with_bm25 ( query = query )
. with_where ( where_filter )
. with_limit ( top_n )
. do ()
)
return response [ "data" ][ "Get" ][ "Articles" ]
الاسترجاع الكثيف: ابحث عن الكائنات الأكثر تشابهًا مع النص الخام (غير المتجه):
@ retry ( wait = wait_random_exponential ( min = 1 , max = 5 ), stop = stop_after_attempt ( 5 ))
def with_neartext ( self , query , lang = 'en' , top_n = 10 ) -> list :
"""
Performs a semantic search (dense retrieval) on Wikipedia Articles using embeddings stored in Weaviate.
Parameters:
- query (str): The search query.
- lang (str, optional): The language of the articles. Default is 'en'.
- top_n (int, optional): The number of top results to return. Default is 10.
Returns:
- list: List of top articles based on semantic similarity.
"""
logging . info ( "with_neartext()" )
nearText = {
"concepts" : [ query ]
}
where_filter = {
"path" : [ "lang" ],
"operator" : "Equal" ,
"valueString" : lang
}
response = (
self . weaviate . query . get ( "Articles" , self . WIKIPEDIA_PROPERTIES )
. with_near_text ( nearText )
. with_where ( where_filter )
. with_limit ( top_n )
. do ()
)
return response [ 'data' ][ 'Get' ][ 'Articles' ]
البحث المختلط: ينتج نتائج بناءً على مجموعة مرجحة من النتائج من البحث عن كلمة رئيسية (bm25) والبحث المتجهي.
@ retry ( wait = wait_random_exponential ( min = 1 , max = 5 ), stop = stop_after_attempt ( 5 ))
def with_hybrid ( self , query , lang = 'en' , top_n = 10 ) -> list :
"""
Performs a hybrid search on Wikipedia Articles using embeddings stored in Weaviate.
Parameters:
- query (str): The search query.
- lang (str, optional): The language of the articles. Default is 'en'.
- top_n (int, optional): The number of top results to return. Default is 10.
Returns:
- list: List of top articles based on hybrid scoring.
"""
logging . info ( "with_hybrid()" )
where_filter = {
"path" : [ "lang" ],
"operator" : "Equal" ,
"valueString" : lang
}
response = (
self . weaviate . query . get ( "Articles" , self . WIKIPEDIA_PROPERTIES )
. with_hybrid ( query = query )
. with_where ( where_filter )
. with_limit ( top_n )
. do ()
)
return response [ "data" ][ "Get" ][ "Articles" ]
@ retry ( wait = wait_random_exponential ( min = 1 , max = 5 ), stop = stop_after_attempt ( 5 ))
def rerank ( self , query , documents , top_n = 10 , model = 'rerank-english-v2.0' ) -> dict :
"""
Reranks a list of responses using Cohere's reranking API.
Parameters:
- query (str): The search query.
- documents (list): List of documents to be reranked.
- top_n (int, optional): The number of top reranked results to return. Default is 10.
- model: The model to use for reranking. Default is 'rerank-english-v2.0'.
Returns:
- dict: Reranked documents from Cohere's API.
"""
return self . cohere . rerank ( query = query , documents = documents , top_n = top_n , model = model )
المصدر: كوهير
@ retry ( wait = wait_random_exponential ( min = 1 , max = 5 ), stop = stop_after_attempt ( 5 ))
def with_llm ( self , context , query , temperature = 0.2 , model = "command" , lang = "english" ) -> list :
prompt = f"""
Use the information provided below to answer the questions at the end. /
Include some curious or relevant facts extracted from the context. /
Generate the answer in the language of the query. If you cannot determine the language of the query use { lang } . /
If the answer to the question is not contained in the provided information, generate "The answer is not in the context".
---
Context information:
{ context }
---
Question:
{ query }
"""
return self . cohere . generate (
prompt = prompt ,
num_generations = 1 ,
max_tokens = 1000 ,
temperature = temperature ,
model = model ,
)
[email protected]:dcarpintero/wikisearch.git
Windows:
py -m venv .venv
.venvscriptsactivate
macOS/Linux
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
streamlit run ./app.py
تم نشر تطبيق الويب التجريبي على Streamlit Cloud وهو متاح على https://wikisearch.streamlit.app/