Weaviate によって埋め込みでベクトル化された 1,000 万以上の Wikipedia ドキュメントに対する多言語セマンティック検索のための Streamlit アプリ。この実装は、Cohere のブログ「Using LLMs for Search」とそれに対応するノートブックに基づいています。これにより、Wikipedia データセットをクエリするためのキーワード検索、高密度検索、およびハイブリッド検索のパフォーマンスを比較できます。さらに、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
デモ Web アプリは Streamlit Cloud にデプロイされ、https://wikisearch.streamlit.app/ で入手できます。