Retrieval는 골든리트리버(사냥개)에서 나온 단어이다. 사냥을 할 때 끝까지 추적해서 잡아오는게 리트리버의 역할이었고, Retrieval는 검색(Search)보다는 수색에 가까운 느낌이다. '수색해온 정보를 증강시켜서 결과를 만든다'로 RAG란 단어를 사용한다.
이 한계를 극복하기 위해 도메인 지식 통합을 시도하고 있다.
프롬프트 엔지니어링 : 상황에 맞는 학습
파인튜닝 : 새로운 기술 배우기(영구적으로)
RAG : 새로운 사실 습득(임시로)

사람들의 질문이 다르면 결과도 중구난방이 되는데 LLM을 거치고 검색하면 정확도가 올라간다.

JSON, PDF같은 비정형 데이터를 다룰 수 있는 솔루션이 필요하다.
현실적으로 질문하는 순간 수많은 PDF를 뒤지는건 불가능하다. 평상시에 PDF를 미리 스캔해서 색인해둔 Index가 필요하다. 질문하면 Index에서 답을 가져와서 답변하는 솔루션이 필요하다.
JSON, PDF 같은 데이터의 Index를 구현하는게 Azure AI Search의 역할이다.
RAG 검색은 크게 2개로 나눠서 접근한다.
정교한 LLM잘 준비된 데이터강력한 검색 기능임베딩이란 입력을 부동 소수점 숫자 목록으로 인코딩하는걸 말한다.
| 모델 | 인코딩합니다 | MTEB 평균 | 벡터 길이 |
|---|---|---|---|
| 워드 2vc (LLM의 증조할아버지) | 가사 | 300 | |
| 스버트 (문장 트랜스 포머) | 텍스트(최대 ~400단어) | 768 | |
| OpenAI 텍스트 임베딩-ADA-002 | 텍스트(최대 8131개 토큰) | 61.0% | 1536 |
| OpenAI 텍스트 임베딩-3-스몰 | 텍스트(최대 8191개 토큰) | 62.3% | 512, 1536 |
| OpenAI 텍스트 임베딩-3-라지 | 텍스트(최대 8191개 토큰) | 64.6% | 256, 1024, 3072 |
| Azure 컴퓨터 비전 | 이미지 또는 텍스트 | 1024 |
입력 간의 유사성을 계산할 수 있도록 임베딩을 계산한다. 가장 일반적인 거리 측정은 코사인 유사성이다.
각각의 좌표계 사이의 거리가 근접할수록, 방향이 일치할수록 유사하다고 본다.


벡터 데이터를 다루고 저장할때 전부 코딩으로 처리하면 어디에서 뭐가 터질지 모르고, 신뢰도 문제나 업무 부하 상태의 대처등을 고려해야하기에 Azure에서 제공하는 기능을 사용하면 좋다.
Azure AI Search 는 포괄적인 검색 솔루션으로 엔터프라이즈급이고, Semantic Kernel, LangChain, LlamaIndex, Azure OpenAI Service, Azure AI Foundry 등 오픈소스와 연결해서 사용하기 좋다.
우리가 사용하는 데이터나 컨텐츠에 따라 결과가 달라질 수 있어서 구축 후 테스트를 통해 잘 맞는 알고리즘을 찾아서 사용해야한다.
ANN 검색철저한 KNN 검색필터링된 벡터 검색
r = search_client.search(
None,
top=5,
vector_queries=[VectorizedQuery(
vector=query_vector,
k_nearest_neighbors=5,
fields="embedding")],
vector_filter_mode=VectorFilterMode.PRE_FILTER,
filter="tag eq 'perks' and created gt 2023-11-15T00:00:00Z"
)다중 벡터 시나리오
r = search_client.search(
None,
top=5,
vector_queries=[
vectorizedQuery(
vector=query1, fields="body_vector",
k_nearest_neighbors=5),
vectorizedQuery(
vector=query2, fields="title_vector",
k_nearest_neighbors=5)
])
Q: 채팅을 기반으로 이미지를 검색하는것도 가능한가요?
A: '사진속에 개가 있는 이미지를 찾아줘' 같은 이미지 검색은 가능하다. 비전쪽을 다룰 수 있는 모델을 사용해야 한다. 그런데 LLM 자체에서 검색하는건 비용 문제가 있다. 이미지 사이즈가 커지면 토큰 비용이 훅훅 늘어난다.(이미지 크기가 2배 증가 -> 토큰 수 약 4배 증가) Azure AI Search에서 컴퓨터 비전 API에 IMG를 넣으면 이미지에 필요한 태그와 한 줄 짜리 설명을 뽑아주는게 가능하다. 비용적인 측면에서 이걸 사용하여 검색하는게 낫다.
하이브리드 검색 = 키워드 결과 + 벡터 결과 => L1 단계는 회상율을 향상시킨다.
시맨틱 랭커 = 의미적으로 다시 한 번 랭킹을 지정 => L2 단계에서 랭킹 정밀도가 향상된다.

1. LLM은 컨텍스트 윈도우가 제한되어 있다. (4k-128k)
즉, LLM이 사용할 수 있는 데이터의 양이 한정적이다. 그렇기 때문에 LLM에 맞춰서 필요한 만큼 문서를 잘 잘라서 사용해야 한다. 자르는 작업을 청킹이라 하는데, 청킹의 사이즈도 정해야 한다.
2. LLM이 너무 많은 정보를 수신하면 관련 없는 세부 사항으로 인해 쉽게 주의가 산만해질 수 있다.

뭐가 뭔지 모르겠다면 일단 512로 먼저 잘라서 시도해보고, 처리하는 단위가 크고 복잡하다면 1024로 조금씩 늘려가며 사용해보자.

Azure AI Search는 준비된 자료에 대해 인덱싱 시점을 지정할 수 있다.
Azure AI Search에서는 벡터화 하는 과정을 통합적으로 워크 플로우로 가져갈 수 있다.
https://learn.microsoft.com/ko-kr/azure/search/vector-search-integrated-vectorization

답변에 대한 정확도를 테스트해야 한다.
질문과 답변 셋을 미리 만들어서, 결과가 몇 프로나 일치하는지 검색하며 평가하는 방법들이 있다.

Azure를 사용하면 역할 기반의 엑세스 컨트롤이 가능하다.
가상 네트워크에 배치하는게 좋다.


Azure AI Search와 RAG로 프로덕션 준비!
AI Learn Collection
AI Samples - Curated by Developer Relation
Outperforming vector search with hybrid retrieval and reranking