허세임
허세임
⚔️ 베테랑 파트너
📹 SNS 찐친

RAG를 활용한 건강습관 뉴스레터 고도화

안녕하세요, 허세임입니다. 오늘은 제가 진행 중인 AI 건강습관 뉴스레터 프로젝트의 3차 고도화 과정에 대해 자세히 공유해보려 합니다. 이번 작업의 핵심은 RAG(Retrieval-Augmented Generation) 기술을 도입하여 기능의학 관련 정보를 효과적으로 통합하는 것이었습니다.

프로젝트 배경 및 목표

AI 건강습관 뉴스레터 프로젝트는 이미 두 차례의 단계를 거쳤습니다:

  1. 1차 작업: 랭체인을 이용해 주제 기반 뉴스레터 내용 생성

  2. 2차 작업: 생성된 내용을 바탕으로 이미지 생성 및 HTML 포맷 구현

이번 3차 작업의 목표는 RAG 기술을 도입하여 뉴스레터의 내용을 더욱 풍부하고 정확하게 만드는 것입니다. 특히 기능의학이라는 전문 분야의 정보를 효과적으로 통합하고자 했습니다.

RAG 도입 과정

1. 환경 설정

먼저, 필요한 라이브러리들을 임포트하고 환경을 설정했습니다.

from dotenv import load_dotenv
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

load_dotenv()

여기서 load_dotenv().env 파일에서 API 키 등의 환경 변수를 로드합니다.

2. 문서 로드 및 분할

기능의학 관련 PDF 문서를 로드하고 이를 작은 청크로 분할했습니다.

loader = PyMuPDFLoader("data/The-UltraMind-Solution-Mark-Hyman-booksfree.org_.pdf")
docs = loader.load()
print(f"문서의 페이지수: {len(docs)}")

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
split_documents = text_splitter.split_documents(docs)
print(f"분할된 청크의수: {len(split_documents)}")

이 과정에서 91페이지의 문서가 576개의 청크로 분할되었습니다.

3. 임베딩 생성 및 벡터 데이터베이스 구축

각 청크의 임베딩을 생성하고, 이를 FAISS 벡터 데이터베이스에 저장했습니다.

embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(documents=split_documents, embedding=embeddings)

4. 검색기(Retriever) 설정

벡터 데이터베이스를 기반으로 검색기를 설정했습니다.

retriever = vectorstore.as_retriever()

이 검색기를 통해 사용자의 질문과 관련된 정보를 효과적으로 찾을 수 있습니다.

5. 프롬프트 설계

검색된 정보를 바탕으로 질문에 답변할 수 있는 프롬프트를 설계했습니다.

prompt = PromptTemplate.from_template(
    """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Answer in Korean.

#Context:
{context}

#Question:
{question}

#Answer:"""
)

6. 언어 모델 선택 및 체인 구성

OpenAI의 GPT-4 모델을 선택하고, 전체 과정을 하나의 체인으로 구성했습니다.

llm = ChatOpenAI(model_name="gpt-4", temperature=0)

chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

결과 테스트

구현된 RAG 시스템의 성능을 테스트해보았습니다.

question = "기능의학이란?"
response = chain.invoke(question)
print(response)

question = "우울증과 음식의 관계"
response = chain.invoke(question)
print(response)

이를 통해 기능의학의 정의나 우울증과 음식의 관계 등에 대해 정확하고 상세한 답변을 얻을 수 있었습니다.

기존 뉴스레터 시스템과의 통합

이제 이 RAG 시스템을 기존의 뉴스레터 생성 시스템과 통합하는 작업을 진행 중입니다. 주요 통합 포인트는 다음과 같습니다:

  1. 뉴스레터 주제 선정 단계에서 RAG 시스템을 활용하여 관련 기능의학 정보를 검색

  2. 검색된 정보를 바탕으로 더욱 정확하고 전문적인 내용 생성

  3. 생성된 내용에 맞는 이미지 프롬프트 작성 및 이미지 생성

  4. HTML 템플릿에 RAG 기반 콘텐츠와 생성된 이미지 통합

향후 계획

  1. RAG 시스템의 성능 최적화: 청크 사이즈 조정, 임베딩 모델 실험 등

  2. 다양한 건강 관련 자료 추가: 영양학, 운동 생리학 등 폭넓은 분야의 문서 통합

  3. 사용자 피드백 시스템 구축: 생성된 뉴스레터의 품질을 지속적으로 개선

  4. 실시간 정보 업데이트: 최신 의학 연구 결과나 건강 뉴스를 자동으로 통합하는 시스템 개발

마치며

RAG 기술의 도입으로 우리의 AI 건강습관 뉴스레터는 한 단계 더 발전했습니다. 기능의학이라는 전문 분야의 지식을 효과적으로 통합함으로써, 사용자들에게 더욱 가치 있는 정보를 제공할 수 있게 되었습니다. 앞으로도 계속해서 기술을 발전시키고, 사용자들의 건강한 삶에 기여할 수 있는 서비스를 만들어 나가겠습니다.

여러분의 의견이나 제안이 있다면 언제든 환영합니다. 함께 더 나은 건강 정보 서비스를 만들어 갈 수 있기를 희망합니다. 감사합니다!

샤니아의 1주1건강습관 뉴스레터 신청하기 https://tally.so/r/wLYZ1j

3

👉 이 게시글도 읽어보세요