介绍
检索增强生成(RAG)已成为语言模型中生成更准确和上下文相关输出的流行方法。 通常,RAG 中的检索步骤依赖于余弦相似度来识别 top-n 相关文档。然而,这种方法的一个缺点是它可以返回高度相似的文档,从而导致冗余和较少的响应多样 性。
这里提出了一种通过迭代调整所选文档向量来增强文档检索多样性的技术。该技术涉及投影出先前检索文档的组件,鼓励检索过程选择内容更多样 化的文档。
冗余检索的问题
当纯粹基于余弦相似度检索文档时,最终可能会得到彼此高度相似的 top-n 文档。虽然这确保了相关性,但它减少了生成模型可用信息的多样性。
解决方案:多样性的迭代投影
不要简单地挑选 top-n 个文档,而是在每次选择之后,使用检索文档的向量表示来调整后续查询。这里通过减去原始查询向量在检索文档向量上的投影来完成的。重复这个过程有助于获得多样化的结果集。
方案代码
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# Example document vectors (each row is a document vector)
document_vectors = np.array([
[0.9, 0.1, 0.0],
[0.85, 0.15, 0.0],
[0.4, 0.8, 0.0],
[0.1, 0.9, 0.0],
[0.2, 0.7, 0.0]
])
# Query vector
query_vector = np.array([1.0, 0.0, 0.0])
def retrieve_with_diversity(document_vectors, query_vector, top_n=3):
retrieved_indices = []
adjusted_query = query_vector
for _ in range(top_n):
# Compute cosine similarity
similarities = cosine_similarity(document_vectors, adjusted_query.reshape(1, -1)).flatten()
# Exclude already retrieved documents
for idx in retrieved_indices:
similarities[idx] = -np.inf
# Get the index of the most similar document
best_idx = np.argmax(similarities)
retrieved_indices.append(best_idx)
# Adjust the query vector to reduce similarity to the current best document
best_vector = document_vectors[best_idx]
projection = np.dot(adjusted_query, best_vector) / np.dot(best_vector, best_vector) * best_vector
adjusted_query = adjusted_query - projection
return retrieved_indices
# Retrieving documents using cosine similarity only
def retrieve_simple(document_vectors, query_vector, top_n=3):
similarities = cosine_similarity(document_vectors, query_vector.reshape(1, -1)).flatten()
return similarities.argsort()[-top_n:][::-1]
# Running both methods
diverse_indices = retrieve_with_diversity(document_vectors, query_vector, top_n=3)
simple_indices = retrieve_simple(document_vectors, query_vector, top_n=3)
print("Indices retrieved with diversity method:", diverse_indices)
print("Indices retrieved with simple method:", simple_indices)
print("\nRetrieved document vectors with diversity method:")
print(document_vectors[diverse_indices])
print("\nRetrieved document vectors with simple method:")
print(document_vectors[simple_indices])
在上面的代码中:
• 有一组文档向量和一个查询向量。
• retrieve_with_diversity 函数首先检索最相似的文档,然后通过减去当前最佳文档的投影来调整查询向量。这个过程迭代地继续进行,以确保每个被选中的文档与其他文档有足够的不同。
• retrieve_simple 函数是一种传统的方法,它基于余弦相似性来检索 top-n个文档。
运行此代码将显示,与简单方法相比,基于多样性的方法产生的文档向量更加多样化。即使所有检索到的文档仍然是相关的,多样性方法也可以确保它们捕获查询主题的不同方面。
结论
当您需要在检索上下文中保持多样性时,这种基于投影的技术可以成为 RAG 系统的一个有价值的补充。它在相关性和多样性之间取得了平衡,从而从语言模型中获得更加丰富的结果。