3차 프로젝트 진행 기록 (250627-250630)

해피해피슈크림·2025년 6월 28일
post-thumbnail

1. 다사다난한 논문 크롤링

  • KISS 논문 사이트 크롤링, Scopus 논문 사이트 크롤링 -> API, 초록 미제공 문제로 실패
  • PubMed 논문 사이트 크롤링 시도 -> 성공!
  • PubMed "실시간" 크롤링 시도 기록:

2. PubMed 논문 사이트로 확정 -> 챗봇 임시 구현

(무료 원문 제공까지 되는 곳). 논문의 제목과 초록 크롤링, 전처리 -> RAG 모델 구축, 챗봇 구현까지 해봄. 임시로 주제 하나를 설정해 50개의 논문을 크롤링해 구현해보았을 때 성능이 괜찮았음.

단계 요약

1️⃣ 논문 데이터 크롤링 및 전처리
(PubMed에서 항생제 내성 등 주제로 논문 200개 수집, 중복·결측 제거, CSV 저장)

2️⃣ RAG 파이프라인 구축 및 테스트
(임베딩, Chroma 벡터DB 저장, OpenAI LLM 연동, 검색 기반 질의응답 구현)

😄 비록 200개 논문으로 시작했지만, 전체 데이터 흐름(수집 → 전처리 → 임베딩/DB → RAG 검색/생성)과 파이프라인이 잘 작동하는지 확인했고,
테스트 결과도 만족스럽다면 매우 좋은 출발로 보인다!

피드백

  • 실시간 크롤링 방식은 RAG에 적합하지 않지만, 벡터DB에 모든 논문 저장이 어려울 때 보완책으로 고려할 수 있다.
  • 위키백과에만 있는 정보, 논문에만 있는 정보 등 지식 격차를 인지하고, 벡터DB와 실시간 크롤링을 혼합하는 하이브리드 접근이 현실적이다.
  • 2025년 논문만 사용하는 것은 명확한 범위 설정에 유리하지만, 필요에 따라 2024년까지 포함해 데이터 양과 신뢰도를 조절하는 것도 가능하다.

3. 사회적 통념 및 트렌드 자료 수집: 네이버 지식인, 블로그, 위키백과

논문은 PubMed 단일 소스로도 충분하다.

  • PubMed는 생의학·의학 분야에서 세계적으로 표준화된 데이터베이스로,
    논문 품질, 최신성, 전문성, 신뢰도가 매우 높다.
  • 논문 데이터는 구조화가 잘 되어 있고, 중복 수집의 필요성이 적으며,
    한 곳에서 주요 연구를 대부분 커버할 수 있다.
  • 따라서 논문은 PubMed 하나만으로도 충분히 프로젝트의 목적을 달성할 수 있다고 판단했다.
  • 여러 소스 크롤링은 사회적 통념/트렌드 편향을 줄이고, 대표성을 높이는 매우 합리적이고 권장되는 방법입니다.

연도/개수 기준, DB 저장, 비교 방식 모두 타당하며,
추가로 플랫폼별 특성·편향을 해석에 반영하면 더욱 신뢰도 높은 연구가 될 것입니다.

사회적 통념 및 트렌드의 경우 여러 플랫폼에서 크롤링 해야 편향을 줄일 수 있다.

본격적으로 논문 크롤링을 시작하기 전, 사회적 통념 및 트렌드는 어디에서 수집해야 할지 고민했다. 원래는 네이버 지식인과 위키백과 중 하나만 택하려 했으나, 아래 근거로 네이버 지식인, 블로그, 위키백과 세 플랫폼 모두에서 크롤링을 하기로 결정했다.

근거1: 편향 최소화

  • 다양한 소스를 결합하면 한 플랫폼의 인구집단, 이용행태, 노출 알고리즘 등에서 발생하는 selection bias와 population bias를 줄일 수 있다.
  • 예를 들어, 네이버 지식인은 실시간 Q&A와 집단적 오해/유행을, 블로그는 경험·마케팅·유행을, 위키백과는 집단지성 기반의 공식적 사회 합의를 반영한다.
  • 여러 소스를 통합하면 더 균형 잡힌 사회적 통념/트렌드를 확보할 수 있다.

근거2: 트렌드·통념의 다차원성

사회적 통념이나 트렌드는 한 곳에만 한 가지 형태로 존재하지 않는다.

Q&A(지식인): 실시간 대중 궁금증, 오해, 루머
블로그: 체험담, 후기, 유행, 마케팅
위키백과: 공식적 정의, 장기적 합의

따라서 여러 소스를 합치면 사회적 맥락과 변화의 다차원성을 더 잘 포착할 수 있다.

근거3: 연구의 신뢰성·재현성 강화

사회 데이터 연구에서 편향을 줄이고 신뢰도를 높이기 위해 다양한 소스의 결합이 표준적 방법으로 권장된다. 특히 사회과학·공중보건 분야에서는 여러 소스의 데이터를 통합 분석해 결론의 타당성과 일반성을 확보한다.

수집 자료 연도 설정 - 2025년 자료가 부족하면 2024년까지

  1. 논문은 Pubmed에서 2025년 최대 50개 우선 크롤링하고, 2025년 논문이 15개 이하라면 2024년 논문 추가로 30개 크롤링 한다. (2025년에 자료가 별로 없다는 건 2024년에도 잘 다뤄지지 않았거나 주요 트렌드가 아닐 수도 있으므로 30개만 한다.)

  2. 네이버 지식인, 블로그, 위키백과를 키워드 기반으로 크롤링 한다. 이때 네이버 지식인과 블로그는 검색어를 치면 최신순으로 나와서 연도를 고려하지 않았다. 위키백과도 날짜가 상관 있는 문서가 아니라서 마찬가지로 연도를 고려하지 않았다.

요약

크롤링 자료 출처

  • 논문: PubMed
  • 사회적 통념, 트렌드: 네이버 지식인, 블로그, 위키백과

파일 구조

  • 데이터 크롤링, 전처리 시 플랫폼 별로 따로 파일 구축
project_root/
│
├─ pubmed_crawler.py         # PubMed 논문 크롤링 및 전처리
├─ kin_crawler.py            # 네이버 지식인 크롤링 및 전처리
├─ blog_crawler.py           # 네이버 블로그 크롤링 및 전처리
├─ wiki_crawler.py           # 위키백과 크롤링 및 전처리
│
├─ data/
│   ├─ pubmed_2025_2024.csv
│   ├─ kin_2025_2024.csv
│   ├─ blog_2025_2024.csv
│   ├─ wiki_2025_2024.csv
│
├─ vector_db/
│   ├─ paper_db/     # 논문 벡터DB
│   ├─ kin_db/       # 지식인 벡터DB
│   ├─ blog_db/      # 블로그 벡터DB
│   ├─ wiki_db/      # 위키백과 벡터DB
│
├─ rag_pipeline.py            # RAG 파이프라인(검색·비교·생성 통합)
├─ requirements.txt
└─ README.md

응답 형식

  • 사용자 질의에 대한 답변
  • 그 근거로 논문, 네이버 지식인, 블로그, 위키백과 자료별 비교를 통해 답변에 신뢰성 확보.

4. 팀원 피드백 반영

Before

After

1. 답변 속도가 너무 느림.

💡 해결책: LangChain 구조에서 LangGraph 구조로 변경하자.

  • 기존 모델의 경우 LangChain 구조로 논문, 지식인, 블로그, 위키백과 DB를 순차적으로 거치며 데이터를 가져온다.
  • LangGraph 구조로 바꿔 데이터를 병렬적으로 가져온다.

Before

def multi_collection_search(query, k=3):
    return {
        "논문": chroma_paper.similarity_search(query, k=k),
        "지식인": chroma_kin.similarity_search(query, k=k),
        "블로그": chroma_blog.similarity_search(query, k=k),
        "위키백과": chroma_wiki.similarity_search(query, k=k)
    }

After

def make_similarity_chain(chroma_collection, k=3):
    return lambda query: chroma_collection.similarity_search(query, k)

multi_search_chain = RunnableParallel(
    paper=make_similarity_chain(chroma_paper, k=8), # 논문 비중 늘림
    kin=make_similarity_chain(chroma_kin),
    blog=make_similarity_chain(chroma_blog),
    wiki=make_similarity_chain(chroma_wiki)
)
  • LangGraph 구조로 변경한 결과 똑같이 print(rag_answer("영양제 추천")) 코드를 실행 했을 때 10.7s -> 7.2s로 개선됨을 확인했다.

2. 답변 형식 조정 - 프롬프트

💡 기존 주제인 "전문 지식 vs 사회적 통념, 트렌드" 구조를 살리자.

  • 기존 나의 모델의 답변 형식: 논문, 지식인, 블로그, 위키백과에서 가져온 내용을 각각 요약
  • 변경 요청: 먼저 전문 지식(논문)과 사회적 통념, 트렌드(지식인, 블로그, 위키백과)를 비교하고, 그 다음 플랫폼별 요약을 한다.

개선한 프롬프트는 아래와 같다.

# 프롬프트 일부
	"먼저 논문(전문 지식)과 나머지(사회 트렌드, 통념)를 비교 요약해. 제목은 비교 요약으로 해. "
     "내용은 1. 논문 2. 사회 트렌드, 통념 순으로 정리해주고, 각각 내용 요약하고 한 줄 띄우고 예시를 출력해줘. "
     "다음으로 플랫폼별로 정보를 구분해 요약해. 논문, 지식인, 블로그, 위키백과 순으로 요약해 답해. "
     "제목은 플랫폼별 요약이야. " 

💡 답변시 출처를 남기고, 인용 자료가 없는 경우 발생할 수 있는 할루시네이션을 방지하자.

  • 출처를 남기게끔 코드를 수정했더니 아래와 같이 할루시네이션이 생김을 발견함.
2. **지식인**
- 프로바이오틱스, 비타민D, 마그네슘 등 다양한 영양제에 대한 질문과 답변이 있으며, 이러한 영양제를 어떻게 선택하고 섭취할지에 대한 조언이 주로 제공된다.

자료: 자료 없음

개선한 프롬프트는 아래와 같다.

# 프롬프트 일부
	"그리고 아래에 어떤 자료를 인용했는지 자료의 제목을 남겨. "
     "각 출처에 자료가 없으면 반드시 '자료 없음'이라고 명시해. "
     "추측이나 지어내는 답변은 절대 하지 마. 제공된 자료만 바탕으로 답해. "
     "내용 구분을 위해 줄바꿈을 해."
     "각 플랫폼별로 자료가 없으면 반드시 '자료가 없습니다'라고만 적어. 추가 설명, 추측, 일반적인 조언도 하지 마. "
     "예시: [지식인] 자료가 없습니다"

최종 피드백: 데이터가 더 필요! + 사회 통념, 트렌드 자료는 실시간 크롤링 하기!

print(rag_answer("비타민 C와 D의 역할에 대해 설명해줘"))
비교 요약

1. 논문
논문에서는 비타민 D가 뼈 대사와 면역 조절에 중요한 역할을 한다고 설명하고 있습니다. 비타민 D는 칼시트리올이라는 활성 형태로 존재하며, 다양한 생리적 기능을 가지고 있습니다. 비타민 C에 대한 직접적인 언급은 없지만, 비타민 D의 중요성을 강조하고 있습니다.

예시: 비타민 D는 뼈 건강과 면역 기능에 필수적입니다.

2. 사회 트렌드, 통념
사회 트렌드와 통념에서는 비타민 C와 D가 건강에 중요한 역할을 한다는 인식이 일반적입니다. 비타민 C는 주로 면역력 강화와 항산화 작용으로 알려져 있으며, 비타민 D는 뼈 건강과 면역 체계에 중요하다고 여겨집니다. 이러한 비타민들은 종종 건강 보조제로 섭취됩니다.

예시: 비타민 C는 감기 예방에 좋고, 비타민 D는 햇빛을 통해 얻을 수 있는 중요한 영양소입니다.

플랫폼별 요약

[논문]
자료가 없습니다

[지식인]
자료가 없습니다

[블로그]
자료가 없습니다

[위키백과]
자료가 없습니다

인용 자료 제목: 자료 없음
  • 키워드 다양화, 크롤링 수량 증가, 팀원과 데이터 통합이 필요해 보인다. 아래는 perplexity.ai의 조언이다.
(1) 키워드 다양화
"비타민 C", "비타민 D" 외에도
관련된 다양한 키워드(예: "면역력", "항산화", "영양제", "칼슘", "뼈 건강", "감기 예방" 등)를 추가해보세요.

키워드 조합, 동의어, 관련 질병명 등도 활용하면 데이터가 풍성해집니다.

(2) 수집 데이터 수량 증가
각 키워드별로 크롤링하는 페이지 수, 문서 수를 늘리기
(예: 네이버 지식인에서 100개 → 500개, PubMed 논문 50편 → 200편 등)

최신 데이터, 인기순/관련도순 등 다양한 정렬 옵션을 사용해 수집 범위 확장

(3) 프로젝트 팀원들과 데이터 통합
팀원들이 각각 수집한 데이터를 벡터DB에 합쳐서 구축하면 훨씬 더 풍부한 자료가 됩니다.

Chroma 등 벡터DB는 여러 데이터 소스를 합쳐서 관리할 수 있습니다.

(4) 크롤러/파서 개선
크롤링 시 텍스트 추출이 잘 안 되는 경우도 있으니,
HTML 파싱, 본문 추출, 중복 제거 등 크롤러 품질도 점검해보세요.
비교 요약

1. 논문
논문에서는 GLP-1(Glucagon-like peptide-1)이 주로 당뇨병 치료와 관련된 호르몬으로, 체중 감소와 염증 완화에 기여할 수 있는 잠재력을 지니고 있다고 설명합니다. GLP-1 수용체 작용제는 체지방 구성, 근육, 자가면역 질환과의 연관성을 연구하며, 당뇨병 치료에 중요한 역할을 한다고 합니다.

예시: GLP-1 기반 치료법은 임상적으로 당뇨병 관리에 효과적입니다.

2. 사회 트렌드, 통념
사회 트렌드와 통념에서는 주로 당뇨병 관리 방법에 대한 일반적인 조언이 주를 이루며, 식이요법, 운동, 보조제 사용 등이 강조됩니다. GLP-1에 대한 직접적인 언급은 없으나, 당뇨병 관리의 중요성과 다양한 방법들이 논의됩니다.

예시: 당뇨병 관리를 위해 식이요법과 운동이 중요합니다.

플랫폼별 요약

[논문]
자료가 없습니다

[지식인]
자료가 없습니다

[블로그]
자료가 없습니다

[위키백과]
자료가 없습니다

자료 인용:
- Alleviation of Adipose Tissue Inflammation and Obesity Suppression by a Probiotic. Glucagon-like peptide-1 (GLP-1) is a hormone secreted from enteroendocrine cells
- GLP-1 receptor agonists, body composition, skeletal muscle and risk of. BACKGROUND: - Glucagon-like peptide-1 (GLP-1)-based therapies induce a clinically
- Association between autoimmune diseases and glucagon-like peptide-1 receptor. INTRODUCTION: The therapeutic advantages of glucagon-like peptide-1 receptor

자료 인용에서 할루시네이션이 발생,,,ㅠㅠㅠ 개선 필요!!

0개의 댓글