Weaviate가 임베딩으로 벡터화한 천만 개 이상의 Wikipedia 문서에 대한 다국어 의미 검색을 위한 Streamlit 앱입니다. 이 구현은 Cohere의 블로그 'Using LLMs for Search'와 해당 노트북을 기반으로 합니다. Wikipedia 데이터 세트를 쿼리하기 위해 키워드 검색 , 밀집 검색 및 하이브리드 검색 의 성능을 비교할 수 있습니다. 또한 Cohere Rerank를 사용하여 결과의 정확성을 높이고 Cohere Generate를 사용하여 순위가 매겨진 결과를 기반으로 응답을 제공하는 방법을 보여줍니다.
의미 검색은 키워드 일치에만 초점을 맞추는 것이 아니라 결과를 생성할 때 검색 문구의 의도와 문맥적 의미를 고려하는 검색 알고리즘을 말합니다. 쿼리 이면의 의미를 이해하여 보다 정확하고 관련성이 높은 결과를 제공합니다.
임베딩은 단어, 문장, 문서, 이미지 또는 오디오와 같은 데이터를 나타내는 부동 소수점 숫자의 벡터(목록)입니다. 상기 수치 표현은 데이터의 맥락, 계층 구조 및 유사성을 포착합니다. 분류, 클러스터링, 이상치 감지 및 의미 검색과 같은 다운스트림 작업에 사용할 수 있습니다.
Weaviate와 같은 벡터 데이터베이스는 임베딩을 위한 저장 및 쿼리 기능을 최적화하기 위해 특별히 구축되었습니다. 실제로 벡터 데이터베이스는 ANN(Approximate Nearest Neighbor) 검색에 모두 참여하는 다양한 알고리즘의 조합을 사용합니다. 이러한 알고리즘은 해싱, 양자화 또는 그래프 기반 검색을 통해 검색을 최적화합니다.
키워드 일치: 속성에 검색어가 포함된 개체를 찾습니다. 결과는 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/에서 사용 가능한 데모 웹 앱