Aplicativo Streamlit para pesquisa semântica multilíngue em mais de 10 milhões de documentos da Wikipedia vetorizados em embeddings pela Weaviate. Esta implementação é baseada no blog da Cohere ´Using LLMs for Search´ e seu caderno correspondente. Ele permite comparar o desempenho da pesquisa por palavras-chave , recuperação densa e pesquisa híbrida para consultar o conjunto de dados da Wikipedia. Ele demonstra ainda o uso do Cohere Rerank para melhorar a precisão dos resultados e do Cohere Generate para fornecer uma resposta com base nos referidos resultados classificados.
A pesquisa semântica refere-se a algoritmos de pesquisa que consideram a intenção e o significado contextual das frases de pesquisa ao gerar resultados, em vez de focar apenas na correspondência de palavras-chave. Ele fornece resultados mais precisos e relevantes ao compreender a semântica, ou significado, por trás da consulta.
Uma incorporação é um vetor (lista) de números de ponto flutuante que representa dados como palavras, frases, documentos, imagens ou áudio. A referida representação numérica captura o contexto, a hierarquia e a semelhança dos dados. Eles podem ser usados para tarefas posteriores, como classificação, clustering, detecção de valores discrepantes e pesquisa semântica.
Bancos de dados vetoriais, como o Weaviate, são desenvolvidos especificamente para otimizar recursos de armazenamento e consulta para incorporações. Na prática, um banco de dados vetorial usa uma combinação de diferentes algoritmos que participam da pesquisa por vizinho mais próximo aproximado (ANN). Esses algoritmos otimizam a pesquisa por meio de hashing, quantização ou pesquisa baseada em gráfico.
Keyword Matching: procura objetos que contenham os termos de pesquisa em suas propriedades. Os resultados são pontuados de acordo com a função 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" ]
Recuperação densa: encontre objetos mais semelhantes a um texto bruto (não vetorizado):
@ 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' ]
Pesquisa híbrida: produz resultados com base em uma combinação ponderada de resultados de uma pesquisa por palavra-chave (bm25) e uma pesquisa vetorial.
@ 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 )
Fonte: 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 implantado no Streamlit Cloud e disponível em https://wikisearch.streamlit.app/