7.4 JSON + Embedding 조합 활용
GPT API와 Embedding API는 각각 구조화된 출력을 생성하거나 문서 검색을 수행하는 데 독립적으로 강력한 기능을 보입니다. 하지만 이 둘을 조합하면 더욱 정교하고 유연한 AI 기능을 구현할 수 있습니다. 이 절에서는 JSON Mode를 사용하여 GPT로부터 구조화된 출력을 생성하고, Embedding을 활용하여 이 데이터를 검색하거나 연관된 데이터를 찾아 응답하는 구조를 다룹니다.
7.4.1 JSON + Embedding 조합의 핵심 개념
GPT의 구조화된 출력 기능(JSON Mode)과 Embedding 기반 벡터 검색은 본질적으로 서로 보완 관계입니다.
JSON Mode로 GPT가 일정한 구조의 데이터를 추출하거나 생성하게 하면, 그 결과를 지속적으로 저장할 수 있습니다.
Embedding API를 통해 이러한 JSON 객체들을 벡터화해 벡터 데이터베이스에 저장하면 고속의 의미 기반 검색이 가능해집니다.
결과적으로 “구조화된 의미 기반 데이터베이스 구축”이 가능해지고, 정밀한 검색 → 응답 생성 → 구조화 결과 저장의 선순환이 형성됩니다.
이는 단순한 Q&A 챗봇에서 벗어나 고도화된 어시스턴트, 의미기반 필터링, 자동 정보 요약 시스템 등을 구축하는 데 핵심 요소로 작용합니다.
7.4.2 시나리오 예시: 뉴스 기사 분류 및 검색 엔진
이 조합을 설명하기 위해 실제 사례를 통해 구체적인 과정을 살펴봅니다. 예제 시나리오는 다음과 같습니다:
사용자가 뉴스 기사들을 등록하면 시스템은 자동으로 카테고리, 키워드, 요약 등을 JSON 형식으로 생성합니다. 이후 사용자가 유사한 주제의 기사를 검색하면 벡터 검색을 통해 관련 JSON 객체를 반환하고, 이를 다시 GPT가 응답으로 가공합니다.
7.4.3 단계별 구현 프로세스
1. GPT의 JSON Mode로 구조화된 뉴스 정보 추출
먼저 사용자가 입력한 뉴스 기사 전문에서 중요한 정보를 JSON 형식으로 추출합니다.
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4-1106-preview",
response_format="json",
messages=[
{"role": "system", "content": "뉴스 기사에 대해 카테고리, 키워드, 개요, 작성일을 추출합니다."},
{"role": "user", "content": "본문: 삼성전자는 오늘 2분기 실적 발표를 통해 매출이 65조원으로 전년 대비 11% 증가했다고 밝혔다. 반도체 부문 수익 개선이 주요 원인이다..."}
]
)
parsed = response.choices[0].message.content
print(parsed)
예상 결과 (JSON Mode 응답):
{
"category": "경제",
"keywords": ["삼성전자", "실적 발표", "매출", "반도체"],
"summary": "삼성전자가 반도체 부문의 실적 개선에 힘입어 2분기 매출 65조원을 기록하였다.",
"publish_date": "2024-07-01"
}
이처럼 GPT를 활용해 일관되고 의미 있는 구조화를 수행할 수 있습니다.
2. 구조화된 JSON을 벡터로 변환
위 JSON 데이터의 일부를 텍스트로 변환하여 Embedding API를 통해 벡터화합니다. 일반적으로 summary 또는 keywords를 기반으로 합니다.
from openai import OpenAI
import json
data = json.loads(parsed)
text_to_embed = data["summary"] + " " + ", ".join(data["keywords"])
embedding_resp = client.embeddings.create(
model="text-embedding-3-small",
input=text_to_embed
)
vector = embedding_resp.data[0].embedding
이제 vector는 이 기사 내용을 의미적으로 압축한 고차원 표현입니다.
3. 벡터를 DB에 저장 (예: FAISS)
벡터와 함께 원래 JSON 객체를 함께 저장합니다. Python의 FAISS 또는 Pinecone, Weaviate 등의 벡터 데이터베이스를 사용할 수 있습니다. 여기서는 FAISS를 간략히 예로 듭니다.
import faiss
import numpy as np
dimension = len(vector)
index = faiss.IndexFlatL2(dimension)
# 초기화 및 삽입
index.add(np.array([vector], dtype=np.float32))
metadata_list = [data] # JSON 객체와 함께 관리
이를 반복하여 수십 혹은 수천 개의 뉴스 기사를 저장할 수 있습니다.
4. 사용자 쿼리를 Embedding화하여 유사 기사 검색
사용자가 예를 들어 "반도체 시장 전망"에 대해 검색하면 이 쿼리를 임베딩한 뒤 가장 유사한 뉴스 기사들을 찾아냅니다.
query_embedding = client.embeddings.create(
model="text-embedding-3-small",
input="반도체 회사들의 실적과 향후 전망"
).data[0].embedding
# 유사도 검색
D, I = index.search(np.array([query_embedding], dtype=np.float32), k=3) # top-3
results = [metadata_list[i] for i in I[0]]
이로써 의미적으로 가장 유사한 3개의 JSON 객체를 확보했습니다.
5. 유사 기사들을 종합해 GPT가 최종 응답 생성
마지막으로, 검색된 JSON 객체들에서 제목/요약/카테고리를 GPT에게 제공하여 사용자의 쿼리에 대해 요약된 정보 또는 응답을 생성하게 합니다.
messages = [{"role": "system", "content": "아래 뉴스 기사를 요약하여 사용자 질문에 답하십시오."}]
messages.append({"role": "user", "content": f"질문: 반도체 업계 최근 동향은?\n\n관련 기사:\n{results}"})
response = client.chat.completions.create(
model="gpt-4",
messages=messages
)
print(response.choices[0].message.content)
7.4.4 활용 예시: 고객 응대 시스템
고객이 “지난 분기 보고서 요약해줘”라고 요청했을 때:
내부 문서를 JSON 형식으로 구조화 → Embedding → 검색 → 요약 제공
FAQ 챗봇에서 질문 내용의 의미 기반 분류:
질문 Embedding 후 관련 FAQ JSON 객체를 찾고 → 링크 및 요약 제공
자동 태그 분류 및 추천 시스템:
구조화된 content를 기반으로 Embedding Index 구성
유사 아이템 추천 (기획문서, 코드, 메모 등)
7.4.5 장점과 주의할 점
의미 기반 검색
단순 키워드가 아니라 의미 유사성을 기반으로 검색 가능
구조화된 관리
JSON 형식 활용으로 일관된 메타데이터 구성 및 가공 가능
다양한 전처리 응용
Embedding 쿼리에 필터나 조건 추가 가능 (예: 날짜별 필터)
JSON 필드 선택 기준
어떤 필드를 Embedding에 사용할지 명확하게 정의해야 함
벡터 DB 정합성 유지
JSON과 Embedding vector 간 인덱스 일치를 관리해야 함
보안 데이터 처리 유의
구조화된 객체에 개인 식별정보 포함 시 보안 주의 필요
요약
GPT의 JSON Mode와 Embedding API를 결합하면, 정보의 구조화 → 의미화 → 검색 → 응답 생성의 전 과정을 자동화할 수 있습니다. 이는 단순한 챗봇이 아닌, 의미적 데이터베이스를 기반으로 한 고차원 서비스에 매우 유용합니다.
이 조합은 고객 지원, 지식베이스 검색, 보고서 자동화, 추천 시스템 등 수많은 응용분야에서 강력히 활용될 수 있으며, 특히 Assistants API나 LangChain 등과 연계할 경우 더욱 자동화된 파이프라인 구축이 가능합니다.
다음 장에서는 이러한 방식들을 기반으로 실제 코드 기반 툴과 외부 API 연동을 통한 Function Calling의 고급 조합 방식을 살펴보겠습니다.
Last updated