리랭커 개요
정보 검색 및 생성 AI 영역에서 리랭커는 초기 검색 결과의 순서를 최적화하는 필수적인 도구입니다. 리랭커는 쿼리와 문서를 입력으로 받아 임베딩 대신 유사도 점수를 직접 반환한다는 점에서 기존의 임베딩 모델과 다릅니다. 이 점수는 입력 쿼리와 문서 간의 관련성을 나타냅니다.
재랭커는 첫 번째 단계 검색 후에 종종 사용되며, 일반적으로 벡터 근사 이웃(ANN) 기법을 통해 수행됩니다. ANN 검색은 잠재적으로 관련성이 높은 광범위한 결과를 가져오는 데는 효율적이지만, 쿼리에 대한 실제 의미적 근접성 측면에서 항상 결과의 우선순위를 정하지는 않을 수 있습니다. 여기서 재랭커는 심층적인 문맥 분석을 통해 결과 순서를 최적화하는 데 사용되며, 종종 BERT 또는 기타 Transformer 기반 모델과 같은 고급 머신 러닝 모델을 활용합니다. 이를 통해 재랭커는 사용자에게 표시되는 최종 결과의 정확도와 관련성을 크게 향상시킬 수 있습니다.
파이밀버스 모델 라이브러리는 재랭크 함수를 통합하여 초기 검색에서 반환되는 결과의 순서를 최적화합니다. Milvus에서 가장 가까운 임베딩을 검색한 후에는 이러한 재순위 지정 도구를 활용하여 검색 결과를 세분화하여 검색 결과의 정확도를 높일 수 있습니다.
리랭크 기능 | API 또는 오픈 소스 |
---|---|
BGE | 오픈 소스 |
크로스 인코더 | 오픈 소스 |
Voyage | API |
Cohere | API |
Jina AI | API |
오픈 소스 리랭커를 사용하기 전에 필요한 모든 종속 요소와 모델을 다운로드하여 설치하세요.
API 기반 재랭커의 경우 제공업체로부터 API 키를 받아 적절한 환경 변수나 인수에 설정하세요.
예 1: BGE 재랭크 함수를 사용하여 쿼리에 따라 문서 재랭크하기
이 예에서는 특정 쿼리를 기반으로 BGE 리랭커를 사용하여 검색 결과의 순위를 재조정하는 방법을 보여줍니다.
파이밀버스 모델 라이브러리와 함께 재랭커를 사용하려면 먼저 필요한 모든 재랭크 유틸리티가 포함된 모델 서브패키지와 함께 파이밀버스 모델 라이브러리를 설치하세요:
pip install pymilvus[model]
# or pip install "pymilvus[model]" for zsh.
BGE 리랭커를 사용하려면 먼저 BGERerankFunction
클래스를 임포트합니다:
from pymilvus.model.reranker import BGERerankFunction
그런 다음 재랭킹을 위한 BGERerankFunction
인스턴스를 만듭니다:
bge_rf = BGERerankFunction(
model_name="BAAI/bge-reranker-v2-m3", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
)
쿼리를 기반으로 문서의 순위를 재조정하려면 다음 코드를 사용합니다:
query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
documents = [
"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
]
bge_rf(query, documents)
예상 출력은 다음과 비슷합니다:
[RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9911615761470803, index=1),
RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.0326971950177779, index=0),
RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),
RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]
예 2: 재랭커를 사용하여 검색 결과의 관련성 높이기
이 가이드에서는 파이밀버스에서 search()
메서드를 활용하여 유사도 검색을 수행하는 방법과 재랭커를 사용하여 검색 결과의 연관성을 향상시키는 방법을 살펴봅니다. 데모에서는 다음 데이터 세트를 사용합니다:
entities = [
{'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence."},
{'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals."},
{'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'},
{'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}
]
데이터 세트 구성 요소
doc_id
: 각 문서의 고유 식별자.doc_vector
: 문서를 나타내는 벡터 임베딩. 임베딩 생성에 대한 지침은 임베딩을 참조하세요.doc_text
: 문서의 텍스트 콘텐츠입니다.
준비 사항
유사도 검색을 시작하기 전에 Milvus와 연결을 설정하고 컬렉션을 생성한 다음 해당 컬렉션에 데이터를 준비하여 삽입해야 합니다. 다음 코드 스니펫은 이러한 사전 단계를 설명합니다.
from pymilvus import MilvusClient, DataType
client = MilvusClient(
uri="http://10.102.6.214:19530" # replace with your own Milvus server address
)
client.drop_collection('test_collection')
# define schema
schema = client.create_schema(auto_id=False, enabel_dynamic_field=True)
schema.add_field(field_name="doc_id", datatype=DataType.INT64, is_primary=True, description="document id")
schema.add_field(field_name="doc_vector", datatype=DataType.FLOAT_VECTOR, dim=384, description="document vector")
schema.add_field(field_name="doc_text", datatype=DataType.VARCHAR, max_length=65535, description="document text")
# define index params
index_params = client.prepare_index_params()
index_params.add_index(field_name="doc_vector", index_type="IVF_FLAT", metric_type="IP", params={"nlist": 128})
# create collection
client.create_collection(collection_name="test_collection", schema=schema, index_params=index_params)
# insert data into collection
client.insert(collection_name="test_collection", data=entities)
# Output:
# {'insert_count': 4, 'ids': [0, 1, 2, 3]}
유사도 검색 수행
데이터를 삽입한 후 search
메서드를 사용하여 유사도 검색을 수행합니다.
# search results based on our query
res = client.search(
collection_name="test_collection",
data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector
limit=3,
output_fields=["doc_id", "doc_text"]
)
for i in res[0]:
print(f'distance: {i["distance"]}')
print(f'doc_text: {i["entity"]["doc_text"]}')
예상 출력은 다음과 비슷합니다:
distance: 0.7235960960388184
doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
distance: 0.6269873976707458
doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
distance: 0.5340118408203125
doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
재랭커를 사용하여 검색 결과 개선하기
그런 다음 재랭크 단계를 통해 검색 결과의 관련성을 개선합니다. 이 예에서는 PyMilvus에 내장된 CrossEncoderRerankFunction
을 사용하여 정확도를 높이기 위해 결과의 순위를 재조정합니다.
# use reranker to rerank search results
from pymilvus.model.reranker import CrossEncoderRerankFunction
ce_rf = CrossEncoderRerankFunction(
model_name="cross-encoder/ms-marco-MiniLM-L-6-v2", # Specify the model name.
device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
)
reranked_results = ce_rf(
query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',
documents=[
"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
],
top_k=3
)
# print the reranked results
for result in reranked_results:
print(f'score: {result.score}')
print(f'doc_text: {result.text}')
예상 결과는 다음과 비슷합니다:
score: 6.250532627105713
doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
score: -2.9546022415161133
doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
score: -4.771512031555176
doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.