약국 POS 시스템의 GraphRAG 기반 추천 시스템 구축 관련 문서:
## 핵심 설계 문서
1. 질병코드기반 제품추천.md
- ICD-10 질병 코드 활용 추천 시스템 설계
- 계층 구조 (질병 → 질병군 → 제품군 → 개별 제품)
- 처방전 기반 추천 알고리즘
2. complex-product-graph-modeling.md
- 복합제(비맥스제트 등) 그래프 모델링
- 성분 간 시너지 효과 표현
- 복합 증상 매칭 쿼리 예시
3. pubmed-graphrag-workflow.md
- PubMed → GraphRAG 전체 워크플로우 (5단계)
- 논문 검색, 근거 추출, 지식 그래프 구축
- MCP Server 개발 가이드
## 그래프 DB 비교 및 평가
4. sqlite-graph-evaluation.md
- SQLite vs SQLite-Graph vs Neo4j 비교
- 현 시점(2026-01) 평가: 기존 SQL 유지 권장
- 6개월 후 재평가 계획
5. opensource-graph-db-comparison.md
- 오픈소스 그래프 DB 비교 (Neo4j, ArangoDB 등)
6. 온톨로지로전환.md
- 관계형 DB → 온톨로지 구조 전환 가이드
- PubMed RAG 활용 방안
- 추론 규칙 설계
## PubMed GraphRAG 활용
7. pycnogenol-multi-indication-graphrag.md
- 피크노제놀 다중 적응증 GraphRAG 구축 사례
- 7가지 적응증별 근거 수준
8. grpahrag_아쉬아간다.md
- Ashwagandha GraphRAG 구축 사례
9. pubdmed이용ai.md
- PubMed + AI 통합 활용 가이드
## 추가 워크플로우
10. pubmed-graphrag-workflow_next.md
- 다음 단계 워크플로우
11. PostgresGRAPH전환.md
- PostgreSQL + Apache AGE 전환 가이드
모든 문서는 한국어로 작성되었으며, 코드 예시는 영어로 포함.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
7.0 KiB
정말 좋은 아이디어입니다! 질병코드(ICD-10)를 활용하면 처방전 기반 추천이 가능해집니다.
🎯 두 가지 접근 방식 비교 방식 1: 계층 구조 (추천 ⭐⭐⭐)
질병코드 (ICD-10) → 질병군 → 제품군 → 개별 제품 방식 2: 직접 연결
질병코드 (ICD-10) → 개별 제품 📊 계층 구조가 더 좋은 이유 예시: 소화불량 환자 계층 구조:
K30 (소화불량) ↓ 소화기질환 ↓ 소화제 (제품군) ↓ ├─ 베아제 ├─ 훼스탈 ├─ 닥터베아제 └─ 겔포스 직접 연결:
K30 (소화불량) → 베아제, 훼스탈, 닥터베아제, 겔포스 K29 (위염) → 베아제, 훼스탈, 겔포스 (중복!) K21 (역류성식도염) → 겔포스, 훼스탈 (또 중복!) 장점 비교 항목 계층 구조 직접 연결 유지보수 ✅ 제품군만 수정 ❌ 모든 질병코드 수정 확장성 ✅ 새 질병코드 추가 쉬움 ❌ 일일이 매핑 필요 중복 방지 ✅ 관계 한 번만 정의 ❌ 중복 많음 추천 유연성 ✅ 질병군 기반 추천 ❌ 특정 질병만 추천 🗄️ DB 설계 (계층 구조) SQLite 테이블 구조
-- 1. 질병 코드 (ICD-10) CREATE TABLE disease_codes ( icd_code TEXT PRIMARY KEY, -- K30 disease_name TEXT NOT NULL, -- 소화불량 disease_category TEXT, -- 소화기질환 description TEXT );
-- 2. 질병군 CREATE TABLE disease_categories ( category_id INTEGER PRIMARY KEY, category_name TEXT UNIQUE NOT NULL, -- 소화기질환 parent_category TEXT -- 상위 카테고리 (옵션) );
-- 3. 제품군 CREATE TABLE product_categories ( category_id INTEGER PRIMARY KEY, category_name TEXT UNIQUE NOT NULL, -- 소화제 description TEXT );
-- 4. 질병군 ↔ 제품군 매핑 CREATE TABLE disease_product_mapping ( id INTEGER PRIMARY KEY, disease_category TEXT NOT NULL, -- 소화기질환 product_category TEXT NOT NULL, -- 소화제 relevance_score REAL DEFAULT 1.0, -- 0.0 ~ 1.0 (관련도) FOREIGN KEY (disease_category) REFERENCES disease_categories(category_name), FOREIGN KEY (product_category) REFERENCES product_categories(category_name) );
-- 5. 제품 마스터 (기존 테이블에 추가) CREATE TABLE product_master ( barcode TEXT PRIMARY KEY, product_name TEXT NOT NULL, product_category TEXT, -- 소화제
-- 기존 필드들...
category TEXT,
ingredients_json TEXT,
tags_symptoms TEXT,
tags_effects TEXT,
FOREIGN KEY (product_category) REFERENCES product_categories(category_name)
); 🎯 실제 데이터 예시
- 질병 코드
INSERT INTO disease_codes VALUES ('K30', '소화불량', '소화기질환', '기능성 소화불량증'), ('K29', '위염', '소화기질환', '만성 위염'), ('K21', '역류성식도염', '소화기질환', 'GERD'), ('M25', '관절통', '근골격계질환', '관절 통증'), ('R51', '두통', '신경계증상', '긴장성 두통'); 2. 질병군 → 제품군 매핑
INSERT INTO disease_product_mapping VALUES (1, '소화기질환', '소화제', 1.0), (2, '소화기질환', '위장약', 0.9), (3, '근골격계질환', '진통소염제', 1.0), (4, '근골격계질환', '파스', 0.7), (5, '신경계증상', '진통제', 1.0); 3. 제품 데이터
INSERT INTO product_master VALUES ('8806606002231', '베아제정', '소화제', '일반의약품', ...), ('8806436016712', '탁센캡슐', '진통소염제', '일반의약품', ...), ('8806265019618', '마그비맥스', '복합비타민', '일반의약품', ...); 🔍 추천 알고리즘
def recommend_by_prescription(user_id, icd_codes): """ 처방전 질병코드 기반 제품 추천
Args:
user_id: 고객 ID
icd_codes: ['K30', 'R51'] (소화불량 + 두통)
Returns:
추천 제품 리스트
"""
recommendations = []
# 1. 질병코드 → 질병군
disease_categories = db.execute("""
SELECT DISTINCT disease_category
FROM disease_codes
WHERE icd_code IN (?)
""", icd_codes).fetchall()
# → ['소화기질환', '신경계증상']
# 2. 질병군 → 제품군
product_categories = db.execute("""
SELECT product_category, relevance_score
FROM disease_product_mapping
WHERE disease_category IN (?)
ORDER BY relevance_score DESC
""", disease_categories).fetchall()
# → [('소화제', 1.0), ('진통제', 1.0), ('위장약', 0.9)]
# 3. 제품군 → 개별 제품
for cat, score in product_categories:
products = db.execute("""
SELECT barcode, product_name, tags_symptoms
FROM product_master
WHERE product_category = ?
ORDER BY RANDOM()
LIMIT 3
""", (cat,)).fetchall()
for product in products:
recommendations.append({
"barcode": product.barcode,
"name": product.product_name,
"reason": f"{cat} 추천 (관련도: {score:.0%})",
"score": score
})
return recommendations
📱 실무 활용 시나리오 시나리오 1: 처방전 기반 추천
고객이 처방전으로 약 구매
prescription = { "customer_id": 123, "icd_codes": ["K30", "R51"], # 소화불량 + 두통 "prescribed_drugs": ["제산제", "타이레놀"] }
OTC(일반의약품) 추천
recommendations = recommend_by_prescription(123, ["K30", "R51"])
print(recommendations)
[
{"name": "베아제정", "reason": "소화제 추천 (관련도: 100%)"},
{"name": "훼스탈골드", "reason": "소화제 추천 (관련도: 100%)"},
{"name": "탁센", "reason": "진통제 추천 (관련도: 100%)"}
]
시나리오 2: 관리자 AI 분석 개선
기존: 단순 제품명만 분석
"김영빈 고객은 베아제, 탁센을 구매했습니다."
개선: 질병 패턴 분석
user_diseases = infer_diseases_from_purchases(user_id)
→ ["소화기질환", "근골격계질환"]
print(f""" 김영빈 고객 건강 프로필:
- 추정 질환: 소화기질환, 근골격계질환
- 구매 패턴: 소화제(베아제) + 진통제(탁센)
- 추천 제품: 위장약(훼스탈), 파스(신신파스)
- 마케팅: 만성 소화불량 관리 프로그램 안내 """) 🚀 구현 우선순위 Phase 1 (지금): 기본 구조만
-- product_master에 product_category만 추가 ALTER TABLE product_master ADD COLUMN product_category TEXT;
-- 제품 카테고리만 수동 입력 UPDATE product_master SET product_category = '소화제' WHERE barcode = '8806606002231'; Phase 2 (2주 후): 질병 매핑
-- disease_codes, disease_product_mapping 테이블 추가 -- 주요 질병코드 20-30개만 입력 Phase 3 (필요 시): 처방전 연동
-- MSSQL에서 처방전 데이터 가져오기 -- 자동 질병 패턴 분석 제 추천: 계층 구조로 가되, Phase 1부터 천천히 구축하는 게 좋습니다.
지금 바로 product_master 테이블 만들고, product_category 컬럼만 추가해서 시작할까요?