Streamlit-App für mehrsprachige semantische Suche in über 10 Millionen Wikipedia-Dokumenten, vektorisiert in Einbettungen von Weaviate. Diese Implementierung basiert auf Coheres Blog „Using LLMs for Search“ und dem dazugehörigen Notebook. Es ermöglicht den Vergleich der Leistung der Stichwortsuche , des Dense Retrieval und der Hybridsuche zur Abfrage des Wikipedia-Datensatzes. Darüber hinaus wird die Verwendung von Cohere Rerank zur Verbesserung der Genauigkeit der Ergebnisse und von Cohere Generate zur Bereitstellung einer Antwort auf der Grundlage der Rangfolgeergebnisse demonstriert.
Semantische Suche bezieht sich auf Suchalgorithmen, die bei der Generierung von Ergebnissen die Absicht und kontextuelle Bedeutung von Suchphrasen berücksichtigen, anstatt sich ausschließlich auf die Keyword-Übereinstimmung zu konzentrieren. Es liefert genauere und relevantere Ergebnisse, indem es die Semantik oder Bedeutung hinter der Abfrage versteht.
Eine Einbettung ist ein Vektor (eine Liste) von Gleitkommazahlen, die Daten wie Wörter, Sätze, Dokumente, Bilder oder Audio darstellen. Diese numerische Darstellung erfasst den Kontext, die Hierarchie und die Ähnlichkeit der Daten. Sie können für nachgelagerte Aufgaben wie Klassifizierung, Clustering, Ausreißererkennung und semantische Suche verwendet werden.
Vektordatenbanken wie Weaviate wurden speziell zur Optimierung der Speicher- und Abfragefunktionen für Einbettungen entwickelt. In der Praxis verwendet eine Vektordatenbank eine Kombination verschiedener Algorithmen, die alle an der Suche nach dem Approximate Nearest Neighbor (ANN) beteiligt sind. Diese Algorithmen optimieren die Suche durch Hashing, Quantisierung oder graphbasierte Suche.
Keyword-Matching: Es wird nach Objekten gesucht, deren Eigenschaften die Suchbegriffe enthalten. Die Ergebnisse werden gemäß der BM25F-Funktion bewertet:
@ 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" ]
Dense Retrieval: Finden Sie Objekte, die einem rohen (nicht vektorisierten) Text am ähnlichsten sind:
@ 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' ]
Hybridsuche: Erstellt Ergebnisse basierend auf einer gewichteten Kombination von Ergebnissen aus einer Stichwortsuche (bm25) und einer Vektorsuche.
@ 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 )
Quelle: Cohere
@ 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
Demo-Web-App, bereitgestellt in Streamlit Cloud und verfügbar unter https://wikisearch.streamlit.app/