mirror of
https://github.com/Shubhamsaboo/awesome-llm-apps.git
synced 2026-09-21 05:10:55 +08:00
Merge pull request #1156 from midasstack/fix/beifong-faiss-similarity-threshold
Fix Beifong FAISS search to convert L2 distance to cosine similarity
This commit is contained in:
+7
-1
@@ -12,6 +12,12 @@ EMBEDDING_MODEL = "text-embedding-3-small"
|
||||
FAISS_INDEX_PATH, FAIS_MAPPING_PATH = get_faiss_db_path()
|
||||
|
||||
|
||||
def l2_distance_to_cosine_similarity(distance: float) -> float:
|
||||
"""Convert FAISS L2 distance to cosine similarity for unit-normalized embeddings."""
|
||||
similarity = 1.0 - (float(distance) ** 2) / 2.0
|
||||
return float(max(0.0, min(1.0, similarity)))
|
||||
|
||||
|
||||
def generate_query_embedding(client, query_text, model=EMBEDDING_MODEL):
|
||||
try:
|
||||
response = client.embeddings.create(input=query_text, model=model)
|
||||
@@ -93,7 +99,7 @@ def search_articles(
|
||||
results = get_article_details(tracking_db_path, result_article_ids)
|
||||
for i, result in enumerate(results):
|
||||
distance = float(distances[0][i])
|
||||
similarity = float(np.exp(-distance))
|
||||
similarity = l2_distance_to_cosine_similarity(distance)
|
||||
result["distance"] = distance
|
||||
result["similarity"] = similarity
|
||||
result["score"] = similarity
|
||||
|
||||
+12
-1
@@ -12,6 +12,17 @@ import json
|
||||
EMBEDDING_MODEL = "text-embedding-3-small"
|
||||
|
||||
|
||||
def l2_distance_to_cosine_similarity(distance: float) -> float:
|
||||
"""Convert FAISS L2 distance to cosine similarity for unit-normalized embeddings.
|
||||
|
||||
OpenAI text-embedding-3 vectors are length-1, so:
|
||||
||a - b||^2 = 2 - 2 * cos(a, b)
|
||||
cos(a, b) = 1 - ||a - b||^2 / 2
|
||||
"""
|
||||
similarity = 1.0 - (float(distance) ** 2) / 2.0
|
||||
return float(max(0.0, min(1.0, similarity)))
|
||||
|
||||
|
||||
def generate_query_embedding(query_text, model=EMBEDDING_MODEL):
|
||||
try:
|
||||
api_key = load_api_key("OPENAI_API_KEY")
|
||||
@@ -116,7 +127,7 @@ def embedding_search(agent: Agent, prompt: str) -> str:
|
||||
for i, idx in enumerate(indices[0]):
|
||||
if idx >= 0 and idx < len(id_map):
|
||||
distance = float(distances[0][i])
|
||||
similarity = float(np.exp(-distance)) if distance > 0 else 0
|
||||
similarity = l2_distance_to_cosine_similarity(distance)
|
||||
if similarity >= similarity_threshold:
|
||||
article_id = id_map[idx]
|
||||
results_with_metrics.append((idx, distance, similarity, article_id))
|
||||
|
||||
Reference in New Issue
Block a user