Application Streamlit pour la recherche sémantique multilingue sur plus de 10 millions de documents Wikipédia vectorisés dans les intégrations par Weaviate. Cette implémentation est basée sur le blog de Cohere « Using LLMs for Search » et son notebook correspondant. Il permet de comparer les performances de la recherche par mots clés , de la récupération dense et de la recherche hybride pour interroger l'ensemble de données Wikipédia. Il démontre en outre l'utilisation de Cohere Rerank pour améliorer la précision des résultats, et de Cohere Generate pour fournir une réponse basée sur lesdits résultats classés.
La recherche sémantique fait référence à des algorithmes de recherche qui prennent en compte l'intention et la signification contextuelle des expressions de recherche lors de la génération de résultats, plutôt que de se concentrer uniquement sur la correspondance des mots clés. Il fournit des résultats plus précis et pertinents en comprenant la sémantique, ou la signification, derrière la requête.
Une intégration est un vecteur (liste) de nombres à virgule flottante représentant des données telles que des mots, des phrases, des documents, des images ou de l'audio. Ladite représentation numérique capture le contexte, la hiérarchie et la similarité des données. Ils peuvent être utilisés pour des tâches en aval telles que la classification, le clustering, la détection des valeurs aberrantes et la recherche sémantique.
Les bases de données vectorielles, telles que Weaviate, sont spécialement conçues pour optimiser les capacités de stockage et d'interrogation pour les intégrations. En pratique, une base de données vectorielles utilise une combinaison de différents algorithmes qui participent tous à la recherche du voisin le plus proche (ANN). Ces algorithmes optimisent la recherche grâce au hachage, à la quantification ou à la recherche basée sur des graphiques.
Keyword Matching : il recherche les objets qui contiennent les termes de recherche dans leurs propriétés. Les résultats sont notés selon la fonction 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" ]
Récupération dense : recherchez les objets les plus similaires à un texte brut (non vectorisé) :
@ 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' ]
Recherche hybride : produit des résultats basés sur une combinaison pondérée des résultats d'une recherche par mot clé (bm25) et d'une recherche vectorielle.
@ 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 )
Source : Cohérer
@ 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
Application Web de démonstration déployée sur Streamlit Cloud et disponible sur https://wikisearch.streamlit.app/