feat: 동물약 챗봇 RAG 연동 (PostgreSQL llm_pharm)

This commit is contained in:
thug0bin 2026-02-28 10:45:58 +09:00
parent 009d133aef
commit e12328ec17

View File

@ -2699,6 +2699,48 @@ ANIMAL_CHAT_SYSTEM_PROMPT = """당신은 약국의 동물약 전문 상담사입
{knowledge_base}""" {knowledge_base}"""
def _get_animal_drug_rag(apc_codes):
"""PostgreSQL에서 동물약 상세 정보 조회 (RAG용)"""
if not apc_codes:
return {}
try:
from sqlalchemy import create_engine
pg_engine = create_engine('postgresql://admin:trajet6640@192.168.0.87:5432/apdb_master')
with pg_engine.connect() as conn:
# APC 코드들로 상세 정보 조회
placeholders = ','.join([f"'{apc}'" for apc in apc_codes if apc])
if not placeholders:
return {}
result = conn.execute(text(f"""
SELECT apc, product_name, main_ingredient,
llm_pharm->>'사용가능 동물' as target_animals,
llm_pharm->>'분류' as category,
llm_pharm->>'체중/부위' as dosage_weight,
llm_pharm->>'기간/용법' as usage_period,
llm_pharm->>'월령금기' as age_restriction,
llm_pharm->>'반려인주의' as owner_caution
FROM apc
WHERE apc IN ({placeholders})
"""))
rag_data = {}
for row in result:
rag_data[row.apc] = {
'target_animals': row.target_animals or '정보 없음',
'category': row.category or '',
'dosage_weight': row.dosage_weight or '',
'usage_period': row.usage_period or '',
'age_restriction': row.age_restriction or '',
'owner_caution': row.owner_caution or ''
}
return rag_data
except Exception as e:
logging.warning(f"동물약 RAG 조회 실패: {e}")
return {}
def _get_animal_drugs(): def _get_animal_drugs():
"""보유 중인 동물약 목록 조회 (APC 이미지 포함)""" """보유 중인 동물약 목록 조회 (APC 이미지 포함)"""
try: try:
@ -2784,14 +2826,33 @@ def api_animal_chat():
# 보유 동물약 목록 조회 # 보유 동물약 목록 조회
animal_drugs = _get_animal_drugs() animal_drugs = _get_animal_drugs()
# APC가 있는 제품의 상세 정보 조회 (RAG)
apc_codes = [d['apc'] for d in animal_drugs if d.get('apc')]
rag_data = _get_animal_drug_rag(apc_codes) if apc_codes else {}
available_products_text = "" available_products_text = ""
if animal_drugs: if animal_drugs:
product_list = "\n".join([ product_lines = []
f"- {d['name']} ({d['price']:,.0f}원)" for d in animal_drugs for d in animal_drugs:
]) line = f"- {d['name']} ({d['price']:,.0f}원)"
# RAG 정보 추가
if d.get('apc') and d['apc'] in rag_data:
info = rag_data[d['apc']]
details = []
if info.get('target_animals'):
details.append(f"대상: {info['target_animals']}")
if info.get('dosage_weight'):
details.append(f"용량: {info['dosage_weight']}")
if info.get('age_restriction'):
details.append(f"금기: {info['age_restriction']}")
if details:
line += f" [{', '.join(details)}]"
product_lines.append(line)
available_products_text = f""" available_products_text = f"""
**현재 보유 동물약:** **현재 보유 동물약:**
{product_list} {chr(10).join(product_lines)}
""" """
# System Prompt 구성 # System Prompt 구성