Pinecone 기반 문서 벡터화와 PostgreSQL 저장 구조
개발자 면접 챗봇에서 사용된 문서 벡터화 및 데이터 저장 방식을 살펴봅니다. Pinecone을 활용한 유사 문서 검색과 PostgreSQL 기반 채팅 기록 저장 구조를 중심으로 설명합니다.
Pinecone 기반 문서 벡터화와 PostgreSQL 저장 구조
1. 문서 벡터화와 Pinecone
학습 문서
챗봇의 피드백 정확도를 높이기 위해 면접 관련 문서를 사전 학습 데이터로 활용합니다. 이 프로젝트에서는 backend/data/referance.docx
파일이 그 기반이며, 여기에는 다음과 같은 정보가 포함됩니다:
- 기술 면접 질문 예시
- 직무별 키워드 설명
- 면접관이 선호하는 답변 스타일 등
문서 벡터화
문서를 처리하고 벡터로 변환한 뒤 Pinecone에 저장하는 과정은 backend/pinecone_db.py
에서 처리됩니다.
.docx
문서 파싱 (예:python-docx
또는docx2txt
활용)- 문단별 또는 항목별로 쪼개서 embedding
- LangChain의
OpenAIEmbeddings
로 벡터 생성 - Pinecone index에 저장
1
2
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(docs, embeddings, index_name=index_name)
- 문서 전체가 아닌 문단 단위로 쪼개 저장하여 검색 정밀도를 높임
pinecone.init()
호출을 통해 API 키와 환경 설정 진행
2. Retriever 구성 방식
앞서 설명한 LangChain 흐름에서, 이 vectorstore는 retriever로 변환되어 챗봇 체인에서 검색기로 사용됩니다:
1
2
3
4
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3},
)
k=3
→ 가장 유사한 문서 3개를 선택- 이 내용은 prompt에 함께 전달되어 GPT가 답변을 생성하게 됩니다
3. 채팅 기록 저장 구조 (PostgreSQL)
사용자별 질문/답변 기록은 PostgreSQL을 활용해 저장됩니다. 관련 코드는 backend/db.py
에 정의되어 있으며, 다음과 같은 테이블이 생성됩니다:
users
1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
password TEXT NOT NULL,
created_at TIMESTAMP DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul')
);
- 사용자 ID, 이름, 해시된 비밀번호, 생성일 저장
chat_sessions
1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS chat_sessions (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul'),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
- 하나의 로그인 상태에서 여러 대화 세션 기록 가능
chat_messages
1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS chat_messages (
id SERIAL PRIMARY KEY,
session_id INT NOT NULL,
sender VARCHAR(50) NOT NULL CHECK (sender IN ('user', 'bot')),
message TEXT NOT NULL,
timestamp TIMESTAMP DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul'),
FOREIGN KEY (session_id) REFERENCES chat_sessions(id) ON DELETE CASCADE
);
- 대화 흐름을 시간 순으로 저장하며, ‘user’와 ‘bot’으로 발신자 구분
- 한 세션에 여러 메시지를 저장할 수 있도록 설계
4. 마무리
이번 글에서는 문서 기반 챗봇의 핵심인 벡터화된 참조 문서 검색 구조와 대화 기록 저장 방식을 함께 살펴봤습니다. Pinecone을 통해 GPT가 더 맥락 있는 답변을 생성할 수 있었고, PostgreSQL 구조를 통해 사용자별 히스토리 관리가 가능해졌습니다.
This post is licensed under CC BY 4.0 by the author.