Код: Выделить всё
node1 - [relationship] -> node2
- Оценка на основе узлов: в этом подходе для каждого запроса я определяю набор желаемых узлов (содержащих правильный ответ). Полученные узлы конвейера затем сравниваются с этими желаемыми узлами для вычисления таких показателей, как точность @k, MRR и nDCG.
- Текстовая оценка с использованием LLM. Здесь я планирую преобразовать тройки графов в текстовые предложения с использованием языковой модели (например, all-MiniLM-L6-v2). Желаемые ответы также будут в текстовой форме. Затем я бы сравнил полученные тексты с нужными текстами, используя косинусное сходство их вложений. Например:
Код: Выделить всё
def compute_similarity(text1, text2):
embeddings = get_embeddings([text1, text2])
cosine_sim = np.dot(embeddings[0], embeddings[1]) / (np.linalg.norm(embeddings[0]) * np.linalg.norm(embeddings[1]))
return cosine_sim
def precision_at_k(retrieved_texts, relevant_texts, k):
retrieved_at_k = retrieved_texts[:k]
relevant_scores = [max(compute_similarity(text, relevant_text) for relevant_text in relevant_texts) for text in retrieved_at_k]
relevant_at_k = [1 if score >= 0.5 else 0 for score in relevant_scores]
return precision_score([1] * len(relevant_at_k), relevant_at_k)