약국 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>
213 lines
7.0 KiB
Markdown
213 lines
7.0 KiB
Markdown
정말 좋은 아이디어입니다! 질병코드(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)
|
|
);
|
|
🎯 실제 데이터 예시
|
|
1. 질병 코드
|
|
|
|
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 컬럼만 추가해서 시작할까요? |