แอป Streamlit สำหรับ การค้นหาความหมายหลายภาษา ในเอกสาร Wikipedia มากกว่า 10 ล้านฉบับที่ฝังเวกเตอร์โดย Weaviate การใช้งานนี้อิงตามบล็อกของ Cohere 'การใช้ LLM สำหรับการค้นหา' และสมุดบันทึกที่เกี่ยวข้อง ช่วยให้สามารถเปรียบเทียบประสิทธิภาพของ การค้นหาคำหลัก การดึงข้อมูลแบบหนาแน่น และ การค้นหาแบบไฮบริด เพื่อสืบค้นชุดข้อมูล 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 )
ที่มา: 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 ที่ปรับใช้กับ Streamlit Cloud และมีอยู่ที่ https://wikisearch.streamlit.app/