PPAP 개발기(1)
[PPAP 프로젝트 깃허브](https://github.com/kchabin/pbl)
우리 학교에서는 졸업 프로젝트 수업을 3학년 1학기~4학년 1학기 까지 약 1년 반의 시간 동안 진행한다.
"개인정보처리방침 평가 자동화 프로그램의 개발" 이라는 주제로 프로젝트를 진행하고 있다.
깃허브 README에도 적힌 것처럼, 처음엔 딥러닝 텍스트 유사도 등을 활용해서 개인정보처리방침이 법령과 가이드라인에 맞게 제대로 잘 작성되었는지 확인하고 평가 결과를 도출할 수 있을 것이라고 생각했지만, AI 경험은 작년에 이브와 프로젝트를 하면서 AI 파트를 담당한 팀원들이 개발하는 걸 옆에서 지켜보거나 강화학습 기초 스터디를 진행한 것 밖에 없었다.
그래서 생각해낸 것은 바로 RAG 였다.
RAG는 저번에 SAP 면접 준비를 하면서 처음 알게 됐는데, LLM이 사람처럼 개인정보처리방침을 읽고 평가하듯이 동작할 수 있지 않을까 하는 생각으로 개발을 시작하게 되었다.
기술 스택
AI : ChatGPT API, LangChain, FAISS
Backend : SpringBoot, JPA, Kotlin, FastAPI(변경 계획)
Frontend : React, JavaScript, Streamlit(test용)
초기 설계 및 첫번째 문제 : 딥러닝 모델 제대로 만들기 너무 어렵다
딥러닝 모델을 활용해 개인정보처리방침이 법률, 가이드라인 등에 따라 제대로 작성되었는지 정량적으로 평가하는 걸 자동화할 수 있는 프로그램을 만들고자 했으나, AI 개발 관련 경험 부족과 데이터셋 구축에서 어려움을 느꼈다.
- 각 사이트 별로 개인정보처리방침의 형태가 상이한 경우가 많다.
- 사람이 평가하는 것처럼 하려면 자연어 처리 기술이 필요하다.
- 이를 사람 없이 기계만으로 평가하는 기술을 약 7개월 안에 제대로 구현하기엔 전공과 맞지 않아 역량 부족의 한계가 있었다.
위와 같은 몇 가지 시행착오를 통해 최대한 사람의 자연어 처리 능력에 가까운 기술인 LLM을 이용해보자는 생각을 하게 되었다.
RAG로 평가 어시스턴트 프로그램을 만들자
AI 관련 논문, 기술블로그 등을 찾고 프로젝트에 적용할 수 있을만한 기법을 찾는 과정에서 Fine-Tuning과 RAG를 비교하는 글을 접하게 되었고 RAG를 사용해 기존 LLM의 할루시네이션을 줄이고, 저렴한 비용으로 개발할 수 있다는 점이 매우 큰 메리트로 작용했다.
RAG 기법을 활용해 만든 챗봇은 LLM에게 새로운 지식을 더하여 이를 기반으로 사용자의 질문에 응답할 수 있게 된다. **AI가 사용자의 질문에 답하기 전 참고할 수 있는 도서관 등을 제공하는 것이다.** 개인정보처리방침은 일반적인 사람들이 그 방대한 양의 텍스트와 법률용어로 인해 읽기를 꺼린다. 개인정보처리방침을 평가할 평가 위원들도 수많은 텍스트들을 읽으면서 평가하게 될 텐데, 여기서 생길 수 있는 피로, 실수 등을 줄일 수 있도록 우리가 만드는 RAG 챗봇이 평가하는 데 있어 보조 역할을 톡톡히 할 수 있을 것이라고 판단했다.
가독성, 요약, 모르는 용어에 대한 질문 등을 통해 평가 위원, 피평가자인 기업 및 기관, 개인정보보호에 관심 있는 일반 사용자들까지 편리하게 이용할 수 있는 챗봇이 될 수 있다.
직접 가이드라인, 법률 등을 찾아보지 않고 AI에게 질문하면 관련된 조항과 지침을 알기 쉽게 요약해서 답변을 제공한다.
chat.py
먼저 AI 챗봇 관련 코드를 먼저 설명해보고자 한다.
teddynote님의 [랭체인 노트](https://wikidocs.net/book/14314), Devocean OpenLab 1기 스터디 중 RAG 스터디 하셨던 분들의 글을 참고해서 코드를 작성했다. (비공개인 글이라 이건 링크를 못달았음)
def \_\_init\_\_(self):
self.model = ChatOpenAI(model="gpt-4o", temperature=0, stream=True) # Enable streaming
self.text\_splitter = RecursiveCharacterTextSplitter(
chunk\_size=1024,
chunk\_overlap=100
)
self.embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
self.policy\_retriever = None
self.guideline\_retriever = None
self.rag\_chain = None
self.cached\_embedder = CacheBackedEmbeddings.from\_bytes\_store(
underlying\_embeddings=self.embeddings,
document\_embedding\_cache=store,
namespace=self.embeddings.model
)
ChatOpenAI (model="gpt-4o"): ChatGPT API를 호출할 때 GPT-4o 모델을 사용했다. 여기서 temperature=0
은 모델의 출력이 좀 더 일정한 답변을 내놓을 수 있도록 한다. stream=True
는 스트리밍 응답을 활성화해서 실제 ChatGPT 사이트에서 상호작용할 때처럼 출력하도록한다.
RecursiveCharacterTextSplitter : 문서를 청크 단위로 분할하는 방식이다. 범용적으로 많이 사용되는 방식이며, 단락 -> 문장 -> 단어 순서로 청크가 충분히 작아질 때까지 순서대로 분할하려고 시도하는 특징이 있다.
OpenAIEmbeddings: 문서 임베딩 모델로 처음엔 허깅페이스 임베딩 모델을 사용하다가 호출하는 모델과의 호환성이나 임베딩 속도 측면에서 유료 임베딩 모델이 좀 더 메리트 있지 않을까 싶어 "text-embedding-3-small"을 활용했다.
유료 임베딩 모델인 만큼, 과금을 줄이기 위해 CacheBackedEmbeddings
로 임베딩을 캐시하고 반복적인 API 호출을 줄이도로 했다.
policy_retriever, guideline_retriever 각각 평가 대상이 되는 개인정보처리방침, 개인정보처리방침 작성 가이드라인에 대한 retriever이다.
def set\_policy\_retriever(self, policy\_file\_path: str):
loaders = TextLoader(file\_path=policy\_file\_path).load()
docs = self.text\_splitter.split\_documents(loaders)
vectorstore\_faiss = FAISS.from\_documents(docs, self.embeddings)
bm25\_retriever = BM25Retriever.from\_documents(docs)
faiss\_retriever = vectorstore\_faiss.as\_retriever(search\_kwargs={'k': 5})
self.policy\_retriever = EnsembleRetriever(
retrievers=\[bm25\_retriever, faiss\_retriever\],
weights=\[0.5, 0.5\]
)
def set\_guideline\_retriever(self, guideline\_file\_path: str):
loaders = TextLoader(file\_path=guideline\_file\_path).load()
docs = self.text\_splitter.split\_documents(loaders)
vectorstore\_faiss = FAISS.from\_documents(docs, self.embeddings)
bm25\_retriever = BM25Retriever.from\_documents(docs)
faiss\_retriever = vectorstore\_faiss.as\_retriever(search\_kwargs={'k': 5})
self.guideline\_retriever = EnsembleRetriever(
retrievers=\[bm25\_retriever, faiss\_retriever\],
weights=\[0.5, 0.5\]
)
초반엔 TextLoader가 아니라 PyPDFLoader를 사용해서 사용자가 PDF 파일을 업로드하면 이를 바로 로드하고, 텍스트 분할하고, 검색까지 하는 코드로 실습해봤는데 PDF 내용을 제대로 읽어오지 못했다.
PDF로 전달했을 때는 이어지는 내용의 다음 페이지에 있는 내용은 출력하지 못하였으나, 텍스트 파일로 전달했을 때는 제대로 출력하는 것을 확인할 수 있었다.
또, 처음엔 PDF 전체 복사 후 붙여넣기 하는 방식으로 텍스트 파일을 만들었다가 좀 더 원하는 형태의 결과가 나오도록 프롬프트 엔지니어링을 하는 과정에서 직접 아래 세 가지 항목을 텍스트 파일에 정리했다.
- 개인정보의 처리 목적
- 처리하는 개인정보의 항목 및 보유 기간
- 개인정보의 파기 절차 및 방법
노션에 직접 옮겨 적었었다.
pre-post retrieval
기본적인 RAG 코드를 작성했을 때는 ai가 개인정보처리방침을 자기 맘대로(?) 읽어오는 경향이 있었다. 한마디로, 답변이 일반적인 chat gpt 사이트에서 개인정보처리방침 복붙해서 넣고 질문해도 나올 것 같은 답변이었다.
성능 개선을 위해 Pre-Post Retrieval 방식을 도입하게 되었다.
- Pre-Retriever : BM25-Retriever + FAISS Vector Store Retriever
- Post Retriever : 순위 재정렬(Reranker)
두 가지 retriever를 융합해서 사용하는 방식인 Ensemble Retriever로 사용하여 검색 효율성을 최적화하고, 생성한 후보 문서들을 유사도 기준으로 우선 순위를 재정렬하여 정확도를 높였다.
프롬프트
일반적인 QnA 챗봇과 다르게 내가 원하는 형태로 결과를 출력해 내야 하기 때문에 가장 난관인 부분이었다.
원하는 응답의 형태
평가 지표 (개인정보처리방침에 대한 평가 질문)
평가 결과 (이행 or 미이행 등)
- 평가 지표와 관련있는 개인정보 처리방침의 문장 or 문단
- 평가 결과의 근거가 되는 작성지침 내용
개인정보처리방침 텍스트 파일의 경로를 입력하세요: /Users/kchabin/Desktop/PythonWorkSpace/rag/개인정보포털\_목적항목파기.txt
개인정보처리방침 작성지침 텍스트 파일의 경로를 입력하세요: /Users/kchabin/Desktop/PythonWorkSpace/rag/작성지침\_처리목적.txt
질문을 입력하세요 (종료하려면 'exit' 입력): 입력한 개인정보처리방침을 입력한 작성지침을 기반으로 평가한 결과를 출력하세요.
### 평가 결과
1. 평가지표 1: 개인정보처리자가 제공하는 서비스에 대한 개인정보 처리 목적을 작성 지침에 기재된대로 누락 없이 기재하고 있는지, 개인정보처리방침의 처리 목적과, 관련된 개인정보처리방침 작성 지침을 출력하세요.
- 평가 결과: 개인정보처리방침은 개인정보의 처리 목적을 구체적으로 기재하고 있으며, 정보주체가 이해하기 쉽게 작성되었습니다. 다만, 일부 항목에서 목적이 다소 모호하게 기재된 부분이 있습니다.
- 근거:
- 작성지침:
\`\`\`
## 2. 개인정보의 처리 목적
• 개인정보처리자가 개인정보를 처리\*하기 위한 목적을 기재함
\* “개인정보의 처리”란 개인정보의 수집, 생성, 연계, 연동, 기록, 저장, 보유, 가공, 편집, 검색, 출력, 정정(訂正), 복구, 이용, 제공, 공개, 파기(破棄), 그밖에 이와 유사한 행위를 말함(개인정보 보호법 제2조 제2호)
• 가능한 구체적이고 상세히 기재하되, 해당 사무의 개인정보 처리 목적을 정보주체가 알기 쉽게 이해할 수 있도록 기재하여야 함
※ 개인정보 처리 목적에 대한 보다 구체적인 설명을 위해 별도의 팝업창이나, 마우스 커서를 가져가면 상세 설명이 표시되는 등의 방식 활용 가능
• 고유식별정보의 경우 개인정보 보호법 제24조 제1항에 따라 법령에서 구체적으로 고유식별정보의 처리를 요구하거나 허용하는 경우 또는 정보주체로부터 별도의 동의를 받은 경우에만 처리할 수 있음
※ 특히, 고유식별정보 중 주민등록번호 의 경우 제 24조 제 1 항 에도 불구하고 개인정보처리자는 법률・대통령령 등 개인정보 보호법 제24조의2 제1항 각 호의 사유에 해당하는 경우를 제외하고는 원칙적으로 처리가 금지됨
• 개인정보 처리방침의 수집 목적은 \*\*‘~등’ 으로 불명확하게 기재하지 않고 구체적으로 기재\*\*하여야 함
• 정보주체의 동의를 받아 개인정보를 수집・이용하는 경우 동의를 받을 때 정보주체에게 고지하는 사항과 일치하여야 함
\`\`\`
- 처리방침 문장:
\`\`\`
## 개인정보의 처리 목적
① 개인정보위는 다음의 목적을 위하여 최소한의 개인정보를 수집하여 처리합니다. 처리하고 있는 개인정보는 다음목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의동의를 받는 등 필요한 조치를 이행할 예정입니다.
② 개인정보위가 개인정보 보호법 제32조에 따라 등록·공개하는 개인정보파일의 처리목적은 다음과 같습니다.
- 등록‧공개하는 개인정보 : 교육서비스 제공 사용자 정보
- 처리목적 : 개인정보보호 온라인 교육 서비스 제공, 이력관리, 수료증 발급
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 개인정보 열람등요구 처리 사용자 정보
- 처리목적 : 공공기관 개인정보 열람등 요구 처리 행정업무의 참고 또는 사실 증명
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 개인정보 열람등요구 처리 사용자 정보(웹사이트)
- 처리목적 : 웹사이트 개인정보 열람등 요구 처리
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 유출사고 신고 처리 사용자 정보
- 처리목적 : 유출사고 신고 처리 처리 행정업무의 참고 또는 사실 증명
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 개인정보보호 전문강사 명단
- 처리목적 : 개인정보보호 교육지원 (강사풀 제공)
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 가명정보 전문가 명단
- 처리목적 : 가명정보 안전활용 지원 (가명정보 전문가풀 제공)
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 정보주체 권리행사 신청정보 (구 e프라이버시 클린서비스 민원접수 및 처리목록)
- 처리목적 : 웹사이트 회원탈퇴 등 민원 처리
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)([http://www.eprivacy.go.kr)](http://www.eprivacy.go.kr\))
- 등록‧공개하는 개인정보 : 분쟁조정 신청정보(신청서)
- 처리목적 : 개인정보 분쟁조정에 필요한 사실조사 등 업무처리
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 분쟁조정 신청정보(음성정보)
- 처리목적 : 개인정보 분쟁조정에 필요한 사실조사 등 업무처리
- 개인정보 처리 사이트 : 분쟁조정내부관리시스템
- 등록‧공개하는 개인정보 : 포털 서비스 이용정보 (본인인증)
- 처리목적 : 포털 서비스 이용내역 통합 조회를 위한 본인확인
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
- 등록‧공개하는 개인정보 : 지우개(잊힐 권리) 서비스 신청자 정보
- 처리목적 : 지우개 서비스 과정에서의 본인확인 및 업무처리
- 개인정보 처리 사이트 : [http://www.privacy.go.kr](http://www.privacy.go.kr)
\`\`\`
2. 평가지표 2: 개인정보처리자가 처리하는 개인정보의 항목 및 보유기간이 기재된 내용을 출력하세요.
- 평가 결과: 개인정보처리방침은 처리하는 개인정보의 항목 및 보유기간을 구체적으로 명시하고 있습니다. 각 서비스별로 명확하게 구분되어 있어 정보주체가 쉽게 이해할 수 있습니다.
- 근거:
- 작성지침:
\`\`\`
## 2. 개인정보의 처리 목적
• 개인정보처리자가 개인정보를 처리\*하기 위한 목적을 기재함
\* “개인정보의 처리”란 개인정보의 수집, 생성, 연계, 연동, 기록, 저장, 보유, 가공, 편집, 검색, 출력, 정정(訂正), 복구, 이용, 제공, 공개, 파기(破棄), 그밖에 이와 유사한 행위를 말함(개인정보 보호법 제2조 제2호)
• 가능한 구체적이고 상세히 기재하되, 해당 사무의 개인정보 처리 목적을 정보주체가 알기 쉽게 이해할 수 있도록 기재하여야 함
※ 개인정보 처리 목적에 대한 보다 구체적인 설명을 위해 별도의 팝업창이나, 마우스 커서를 가져가면 상세 설명이 표시되는 등의 방식 활용 가능
• 고유식별정보의 경우 개인정보 보호법 제24조 제1항에 따라 법령에서 구체적으로 고유식별정보의 처리를 요구하거나 허용하는 경우 또는 정보주체로부터 별도의 동의를 받은 경우에만 처리할 수 있음
※ 특히, 고유식별정보 중 주민등록번호 의 경우 제 24조 제 1 항 에도 불구하고 개인정보처리자는 법률・대통령령 등 개인정보 보호법 제24조의2 제1항 각 호의 사유에 해당하는 경우를 제외하고는 원칙적으로 처리가 금지됨
• 개인정보 처리방침의 수집 목적은 \*\*‘~등’ 으로 불명확하게 기재하지 않고 구체적으로 기재\*\*하여야 함
• 정보주체의 동의를 받아 개인정보를 수집・이용하는 경우 동의를 받을 때 정보주체에게 고지하는 사항과 일치하여야 함
\`\`\`
- 처리방침 문장:
\`\`\`
## 개인정보의 처리 및 보유기간
① 개인정보위는 법령에 따른 개인정보 보유‧이용기간 또는 정보주체로부터 개인정보 수집 시에 동의받은 개인정보 보유‧이용기간 내에서 개인정보를 처리하고 보유합니다.
② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.
- 서비스 명칭 : 교육서비스 제공 사용자 정보
- 운영근거 : 정보주체 동의
- 보유기간 : 회원탈퇴시까지
- 서비스 명칭 : 개인정보 열람등요구 처리 사용자 정보
- 운영근거 : 개인정보 보호법 제35조~제38조
- 보유기간 : 3년
- 서비스 명칭 : 개인정보 열람등요구 처리 사용자 정보 (웹사이트)
- 운영근거 : 개인정보 보호법 제35조~제38조
- 보유기간 : 3년
- 서비스 명칭 : 유출사고 신고 처리 사용자 정보
- 운영근거 : 개인정보 보호법 제34조 및 39조의4신용정보의 이용 및 보호에 관한 법률 제39조
- 보유기간 : 준영구
- 서비스 명칭 : 개인정보보호 전문강사 명단
- 운영근거 : 정보주체 동의
- 보유기간 : 위촉 종료 후 2년
- 서비스 명칭 : 가명정보 전문가 명단
- 운영근거 : 정보주체 동의
- 보유기간 : 위촉기간 종료시까지
- 서비스 명칭 : 정보주체 권리행사 신청정보 (구 e프라이버시 클린서비스 민원접수 및 처리목록)
- 운영근거 : 개인정보 보호법 제4조, 제 37조, 동법 시행령 제62조의2 제1항 4호
- 보유기간 : 처리 완료 후 30일
- 서비스 명칭 : 분쟁조정 신청정보(신청서)
- 운영근거 : 개인정보 보호법 제40조~제50조
- 보유기간 : 5년(조정(안)서, 결정서는 영구)
- 서비스 명칭 : 분쟁조정 신청정보(음성정보)
- 운영근거 : 개인정보 보호법 제40조~제50조
- 보유기간 : 6개월
- 서비스 명칭 : 포털 서비스 이용정보 (본인인증)
- 운영근거 : 정보주체 동의
- 보유기간 : 6개월 (서비스 신청시 연장될 수 있음)
- 서비스 명칭 : 지우개(잊힐 권리) 서비스 신청자 정보
- 운영근거 : 개인정보 보호법 제15조
- 보유기간 : 3년
\`\`\`
3. 평가지표 3: 개인정보 파기에 관한 사항과 절차 및 방법을 기재된 대로 출력하세요.
- 평가 결과: 개인정보처리방침은 개인정보 파기 절차 및 방법을 명확하게 기재하고 있습니다. 파기 절차와 방법이 구체적으로 설명되어 있어 정보주체가 이해하기 쉽습니다.
- 근거:
- 작성지침:
\`\`\`
## 2. 개인정보의 처리 목적
• 개인정보처리자가 개인정보를 처리\*하기 위한 목적을 기재함
\* “개인정보의 처리”란 개인정보의 수집, 생성, 연계, 연동, 기록, 저장, 보유, 가공, 편집, 검색, 출력, 정정(訂正), 복구, 이용, 제공, 공개, 파기(破棄), 그밖에 이와 유사한 행위를 말함(개인정보 보호법 제2조 제2호)
• 가능한 구체적이고 상세히 기재하되, 해당 사무의 개인정보 처리 목적을 정보주체가 알기 쉽게 이해할 수 있도록 기재하여야 함
※ 개인정보 처리 목적에 대한 보다 구체적인 설명을 위해 별도의 팝업창이나, 마우스 커서를 가져가면 상세 설명이 표시되는 등의 방식 활용 가능
• 고유식별정보의 경우 개인정보 보호법 제24조 제1항에 따라 법령에서 구체적으로 고유식별정보의 처리를 요구하거나 허용하는 경우 또는 정보주체로부터 별도의 동의를 받은 경우에만 처리할 수 있음
※ 특히, 고유식별정보 중 주민등록번호 의 경우 제 24조 제 1 항 에도 불구하고 개인정보처리자는 법률・대통령령 등 개인정보 보호법 제24조의2 제1항 각 호의 사유에 해당하는 경우를 제외하고는 원칙적으로 처리가 금지됨
• 개인정보 처리방침의 수집 목적은 \*\*‘~등’ 으로 불명확하게 기재하지 않고 구체적으로 기재\*\*하여야 함
• 정보주체의 동의를 받아 개인정보를 수집・이용하는 경우 동의를 받을 때 정보주체에게 고지하는 사항과 일치하여야 함
\`\`\`
- 처리방침 문장:
\`\`\`
## 개인정보의 파기 절차 및 방법
① 개인정보위는 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당개인정보를 파기합니다.
② 정보주체로부터 동의 받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나보관장소를 달리하여 보존합니다.
③ 개인정보 파기의 절차 및 방법은 다음과 같습니다.
1. 파기절차
개인정보위는 파기하여야 하는 개인정보(또는 개인정보파일)에 대해 개인정보 파기계획을 수립하여 파기합니다.개인정보위는 파기 사유가 발생한 개인정보(또는 개인정보파일)를 선정하고, 개인정보위의개인정보보호책임자의 승인을 받아 개인정보(또는 개인정보파일)를 파기합니다.
2. 파기방법
개인정보위는 전자적 파일 형태로 기록·저장된 개인정보는 기록을 재생할 수 없도록 파기하며, 종이 문서에 기록·저장된 개인정보는 분쇄기로 분쇄하거나 소각하여 파기합니다.
\`\`\`
응답 시간: 42.90초
9월 12일까지 제출한 ACK 2024용 논문에 들어가는 실습의 결과는 위와 같았다.
평가 결과가 애매한 부분이 있지만, 일단 작성지침이나 처리방침 문장을 파일에 명시된 대로 알맞게 출력하고 있긴하다.
개선해야 할 점
URL, PDF 로드 후 Text 형태로 변환하는 함수 만들기
프로젝트 초기 계획에 URL, PDF 로드 방식이 있었는데, 해당 부분이 실습 과정에선 원활히 이뤄지지 못해서 임의로 Text 파일을 만들어 사용했다. 사용자들이 직접 이렇게 하게 해선 안되니까 변환하는 메서드를 만드는 것이 필요하다.
백엔드 - 프론트엔드 - ai 연결하기
실습 과정에서는 프론트엔드를 담당한 팀원들이 내가 작성한 rag ai 코드를 연결해 로컬 환경에서 구동했다. 답변 속도가 굉장히 느리기도 했고, 추후 프로젝트를 제대로 시연하려면 백엔드를 제대로 연결하는 것이 중요하다.
또한 ChatGPT 웹사이트와 유사한 형태의 서비스이기 때문에 현재 로그인/회원가입 서비스, FAQ 게시판 서비스, 사이드탭채팅 이력 확인 등을 구현하려고 하고 있다.
대략적으로 구상한 백엔드와 챗봇 사이의 API 호출 형태이다.
지난 데보션 오픈랩 스터디 때 배웠던 Swagger Open API Codegen을 여기서도 활용해보려고 한다.
생성해야 하는 api spec 문서는 총 두가지이다.
- Chat Service Open API Spec
- LLM RAG Open API Spec
현재 프론트엔드는 React를 사용하고 있기 때문에, TypeScript-Axios Client 코드젠을 사용할 예정이고, 채팅 서비스 서버는 Kotlin-server를 사용하려고 한다.
llm과의 상호작용에선 springboot 쪽이 클라이언트, LLM이 서버이기 때문에 Kotlin-client, Flask-server 스텁 코드를 생성하려고 한다.
처음엔 FastAPI를 구상했지만, open api 에서 지원하는 파이썬 관련 프레임워크는 Flask 뿐이었다.
ChatService openapi spec은 미리 초안을 작성해놓고 로그인/회원가입을 구현하면서 조금씩 수정해나가고 있다.
이와 관련된 내용은 개발기 (2)에서 정리해보겠다.