Семантический поиск по тексту
Строим поисковик по отзывам на продукты: embed запроса → cosine similarity со всеми документами → топ-N результатов. Полный рабочий пример на датасете Amazon Fine Food Reviews.
Реализуйте search_reviews на собственном небольшом датасете (≥20 записей). Протестируйте запросы, которые не содержат ни одного слова из документов, но семантически релевантны.
Скопируйте и адаптируйте под свой контекст. Текст в треугольных скобках — то, что нужно заменить.
import pandas as pd
import numpy as np
from ast import literal_eval
from openai import OpenAI
client = OpenAI()
def get_embedding(text, model="text-embedding-3-small"):
return client.embeddings.create(
input=[text], model=model
).data[0].embedding
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def search_docs(df, query, n=3):
q_emb = get_embedding(query)
df["sim"] = df["embedding"].apply(lambda x: cosine_similarity(x, q_emb))
return df.sort_values("sim", ascending=False).head(n)Не нормализовать эмбеддинги перед dot product — cosine_similarity уже делает это внутри. Пересчитывать эмбеддинги документов при каждом поиске — кешируйте их один раз.
Для датасетов >100k документов используйте FAISS или pgvector вместо brute-force cosine. Предвычислите матрицу эмбеддингов как np.vstack и делайте matrix @ query_vec для векторизованного поиска.
Поиск по базе знаний, FAQ, документации — где пользователи формулируют запросы своими словами.
Поиск по точным идентификаторам, артикулам, кодам — там нужен полнотекстовый индекс.