이번 포스팅에 진행할 일

우선 파이프라인은 완성되었고 이제 5개페이지를 테스트해봤으니 100장 데이터를 넣어보자.

지금은 목차밖에 없어서 약간 테스트가 잘되는지 안되는지 불안한 감이 있다.

100장을 넣고나서 테스트하고나서 잘 작동되면 모든 319페이지를 집어넣고 테스트가 완료되면 이제 프론트작업으로 들어가면 되겠다.

프론트는 금방하니까 뭐. 솔직히 어려운 작업 다 끝낫다고 생각한다.



그러다 문제를 발견해서 하나 수정하고 넘어갔다.

3/28링크


이제 전체적인 것들을 체크해가면서 하고있다. 이게 api를 호출할때마다 실제 돈이 cost로 나가다보니깐 많이 나가는건 아니더라도 최대한 신중하게 생각하며 진행중이다. 다 넣어놓고 맘에 안드는 게 생기면 다시 또 수정해서 넣어야하니까.

지금은 Mysql에 들어가는 데이터들을 살필차례다.

지금까지 넣은 1~5페이지는 목차페이지였지만 실제 해당하는 페이지를 넣으면 카테고리가 어떻게 들어가려나?

# pdf OCR해서 텍스트화
python simplified_ocr_processor.py --start 25 --end 25 

# 파인콘에 데이터 넣기
python upload_vectors_langchain.py

# Mysql에 데이터넣기
python import_policies.py

# 백엔드서버 가동
cd backend
python -m app.main

현재 데이터 저장의 두 가지 경로

  1. MySQL 데이터베이스
    • 구조화된 정책 정보(제목, 카테고리, 대상 연령, 지원 내용 등) 저장
    • 검색, 필터링, 관계 쿼리에 적합
    • 예: “청년 대상 정책만 보여줘”, “취업 지원 관련 정책은?” 같은 질문에 대응
  2. Pinecone 벡터 데이터베이스
    • 문서 텍스트를 청크로 나누고 임베딩하여 저장
    • 의미 기반 검색에 최적화
    • 유사한 개념, 표현을 이해하는 검색 가능

RAG(Retrieval-Augmented Generation) 시스템 작동 원리

  1. 검색(Retrieval) 단계

    • 사용자 질문을 임베딩으로 변환
    • 파인콘에서 질문 임베딩과 가장 유사한 문서 청크 검색
    • 경우에 따라 MySQL에서 관련 정책 정보도 함께 검색
  2. 증강(Augmentation) 단계

    • 검색된 청크와 정책 정보를 프롬프트에 삽입
    • LLM에게 관련 컨텍스트 제공
  3. 생성(Generation) 단계

    • 제공된 컨텍스트를 기반으로 LLM이 응답 생성
    • 문서 내용을 참조하면서 자연스러운 답변 제공
# 이런 과정으로 진행됩니다
def answer_question(question):
    # 1. 질문을 임베딩으로 변환
    question_embedding = get_embedding(question)
    
    # 2. Pinecone에서 유사한 문서 검색
    similar_chunks = pinecone_index.query(
        vector=question_embedding,
        top_k=5,
        include_metadata=True
    )
    
    # 3. MySQL에서 관련 정책 정보 검색 (선택적)
    related_policies = query_mysql_for_policies(question)
    
    # 4. 컨텍스트 구성
    context = ""
    for chunk in similar_chunks:
        context += chunk.metadata["text"] + "\n\n"
    
    # 5. LLM에 프롬프트 전송
    prompt = f"""
    다음 정보를 바탕으로 질문에 답변해주세요:
    
    {context}
    
    질문: {question}
    답변:
    """
    
    # 6. LLM 응답 생성
    response = openai_client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}]
    )
    
    return response.choices[0].message.content

Mysql에 데이터를 카테고리화 해서 넣고잇는데 너무 귀찮기도하고 후처리가 조금 까다롭다. 어차피 Chatgpt API가 알아서 잘 해주지 않을까?

그냥 파인콘에 데이터 때려박고 API야 해줘! 해볼까? 안되면 그떄 Mysql로 세부데이터 받는게 낫지 않을까? 해서 그대로 우선 진행했다.

청크 때려박기

image-20250330030431793

우선 80장의 pdf를 넣었다. 왜 chunk가 80개가 아니라 87개로 나뉘는지는 모르겠지만 사실 알고자 하면 알수는 있겠지만 서비스에 큰 영향이 없을거라 판단해 우선 냅뒀다. 시간이 없다.

쿼리문

{
  "query": "혹시 장애인도 인턴자리를 구할 수 있을까?",
  "user_profile": {}
}

대답

{
  "answer": "장애인도 인턴자리를 구할 수 있습니다. 한국장애인고용공단에서는 장애인 인턴제를 운영하고 있습니다. 이 프로그램은 취업에 어려움을 겪고 있는 장애인에게 인턴 기회를 제공하여 직무능력 향상과 정규직 취업 가능성을 제고하고, 일반 노동시장으로의 원활한 이행을 지원하는 것이 목적입니다. 특정 유형의 중증장애인, 발달장애인, 만 50세 이상 장년장애인, 고용지원 필요도 결과 중점지원대상 장애인을 채용한 사업체를 대상으로 지원을 진행하고 있습니다. 인턴을 채용한 사업장에는 인턴기간 동안 월 임금의 80%를 지원하며, 정규직으로 전환하는 경우에도 추가 지원이 이루어집니다. (출처: 취업 취약계층 고용안정 및 취업지원 - 장애인, 한국장애인고용공단)\n\n더 자세한 정보나 지원을 받고 싶다면 한국장애인고용공단(1588-1519) 또는 한국장애인고용공단 홈페이지(www.kead.or.kr)을 참고하시기 바랍니다.",
  "sources": [
    {
      "page": "67",
      "text": "취업 취약계층 고용안정 및 취업지원 - 장애인 \n35 장애인 인턴제 \n한국장애인고용공단( 1588-1519), 한국장애인고용공단 홈페이지(www.kead.or.kr) \n사업목적 \n● 취업에 어려움을 겪고 있는 장애인에게 인턴 기회를 제공하여 직무능력향상과 \n정규직 취업 가능성을 제고하고, 일반 노동시장으로의 원활한 이행을 지원 \n사업내용 \n● (지원대상) ...",
      "similarity": null
    },
    {
      "page": "53",
      "text": "취업 취약계층 고용안정 및 취업지원 - 장애인 \n24 장애인 고용장려금 \n한국장애인고용공단( 1588-1519), 한국장애인고용공단 홈페이지(www.kead.or.kr) \n사업목적 \n● 장애인 의무고용률 3.1%(공공기관 및 공기업 3.8%) 초과하여 장애인을 \n고용하는 사업주에게 고용장려금을 지급하여 장애인 근로자의 직업생활 안정과 \n고용촉진을 유도 \n사...",
      "similarity": null
    },
    {
      "page": "59",
      "text": "취업 취약계층 고용안정 및 취업지원 - 장애인 \n29 근로지원비용 지원 \n한국장애인고용공단( 1588-1519), 한국장애인고용공단 홈페이지(www.kead.or.kr) \n사업목적 \n● 중증장애인을 고용한 사업주의 고용관리를 유지하는데 필요한 적응지도 비용을 \n사업주에게 지원하여 장애인근로자의 직업생활 적응지원 및 고용안정 도모 \n사업내용 \n● (지원대상)...",
      "similarity": null
    },
    {
      "page": "71",
      "text": "취업 취약계층 고용안정 및 취업지원 - 3 장애인 \n39 고용지원 필요도 결정 \n한국장애인고용공단( 1588-1519), 한국장애인고용공단 홈페이지(www.kead.or.kr) \n사업목적 \n● 개인별 맞춤 고용지원을 위하여 직업능력 및 작업환경 요구에 따라 고용서비스 지원 \n사업내용 \n· (지원대상) 15세 이상 등록장애인, 「장애인 등에 대한 특수교육법」...",
      "similarity": null
    },
    {
      "page": "61",
      "text": "취업 취약계층 고용안정 및 취업지원 - 3 장애인 \n31 장애인고용시설자금 융자 \n한국장애인고용공단( 1588-1519), 한국장애인고용공단 홈페이지(www.kead.or.kr) \n사업목적 \n● 장애인을 고용하였거나 고용하고자 하는 사업주에 대하여 장애인고용 관련 \n작업시설, 부대시설, 편의시설 등의 설치비용 융자를 이자차액 보전 방식으로 \n지원하여 장애인...",
      "similarity": null
    }
  ]
}

좋아. 이 정도면 충분하네 뭐. 이대로 진행하자. 그럼 백엔드, AI, DB쪽까지 해결 끝! 이제 프론트엔드만 만들어서 테스트해보고 배포하면되겠다. 다음 포스팅은 프론트엔드 제작이 될듯.