Azure AI Search 에서 Embedding 과 TextSegment 활용하기

danbi lee·2025년 4월 22일

Azure

목록 보기
3/8

임베딩이란?

텍스트(또는 이미지, 코드 등 비정형 데이터)를 고정된 크기의 숫자 벡터로 변환하는 것

예:
“커피” → [0.12, -0.32, 0.55, ..., 0.08] (예: 1536 차원의 벡터)

이 숫자 벡터는 컴퓨터가 텍스트 의미를 수치적으로 이해하도록 만드는 방식이다.

임베딩이 필요한 이유?

텍스트를 그대로 비교하면 사람처럼 의미를 이해하지 못함

하지만 임베딩 벡터로 바꾸면:

  • 의미가 비슷한 문장은 벡터 공간상 가까운 위치에 배치됨
  • → 벡터 유사도(Cosine Similarity)를 계산해 의미 중심의 검색(Semantic Search) 이 가능. 즉, “비슷한 의미”의 수치로 비교할 수 있음

예:
“커피 주문” ↔ “음료 주문하기” → 높은 유사도
“커피 주문” ↔ “날씨 정보” → 낮은 유사도

Azure AI Search에서 임베딩이 쓰이는 곳?

  1. 저장할 때
  • 문서나 질문(쿼리 텍스트)을 임베딩 벡터로 변환해서 인덱스에 저장한다.
  • 보통 LLM 사용
  1. 검색할 때
  • 사용자의 쿼리도 임베딩으로 변환
  • 기존에 저장된 벡터들과 비교해서 유사한 문서를 찾아줌 (벡터 유사도 검색)

이걸 Vector Search 또는 Semantic Search 라고 함

임베딩 관련 요소

  1. 임베딩 벡터의 차원 수 (dimensions)
  • 벡터의 길이, 예: 768차원(BERT), 1536차원(OpenAI Ada)
  • 길수록 표현력 증가하지만 검색 성능에 부담 -> 적절한 차원 선택 필요
  1. LangChain4j 에서의 임베딩 처리 흐름
    LangChain4j는 다음과 같은 방식으로 임베딩을 처리함:
    EmbeddingModel.embed(text) - 텍스트 -> Embedding 객체 생성
    embedding.becrot() - 벡터(float[])추출
    EmbeddingStore.add(embedding, textSegment) - 벡터와 텍스트를 함께 저장 및 검색

TextSegment란?

다양한 임베딩/검색 시스템에서 텍스트 조각(chunk)을 표현하는 클래스.
보통 하나의 문서 전체가 아닌 문단, 문장 단위의 텍스트를 담으며, 임베딩 벡터와 함께 저장소에 저장된다.

TextSegment의 사용하는 이유?

  • 텍스트를 의미 단위로 잘라 저장하고 검색 결과에 연결
  • 메타데이터를 함께 저장 가능 (page, source, chunkId등..)
  • 보안, 개인정보 보호 등의 이유로 원문 텍스트를 저장하지 않는 선택을 할 수도 있음!
    • 텍스트를 안 쓸 거면, 벡터는 왜 저장하지? -> 텍스트를 저장하지 않아도 의미는 남길 수 있음. 이 '의미'는 벡터로 표현되며, 검색이나 추천에 사용할 수 있음
    • 벡터는 원문을 복원할 수 없음 -> 개인정보 노출 없음
      하지만 의미는 보존됨 -> 유사도 비교 가능
      텍스트 대신 의미 기반 데이터(벡터)를 저장함으로써 프라이버시와 기능을 동시에 잡을 수 있음

Embedding과 TextSegment의 관계

val embedding = embeddingModel.embed(segment.text()).content()
embeddingStore.add(embedding, segment)

실제 저장소에는 벡터만 있는 것이 아니라 텍스트 + 벡터의 쌍이 함께 저장됨

  • Embedding: 텍스트 의미를 수치로 표현한 벡터
  • TextSegment: 해당 벡터의 원본 텍스트

전체 요약

⇒ 임베딩이란 텍스트의 의미를 수치화 한 벡터로, Azure AI Search 에서 문장을 비교하고 검색하기 위해 사용하는 핵심 기술이다.
Azure AI Search 나 LangChain4j 에서는 이를 기반으로 벡터 인덱싱 및 유사도 검색을 구현한다.

1. 텍스트 -> TextSegment로 분할
2. TextSegment.text() -> 임베딩 벡터화 (Embedding)
3. (Embedding, TextSegment) 쌍으로 저장소에 저장
4. 검색어도 벡터화 -> 저장된 벡터들과 유사도 비교
5. 유사도 높은 것 변환 -> TextSegment.text()로 원문 확인

https://docs.langchain4j.dev/apidocs/dev/langchain4j/data/embedding/Embedding.html

profile
계속해서 보완중

0개의 댓글