25분
v2.0 챗봇 구현 가이드
Day 5: 제조 매뉴얼 Q&A 챗봇
v2.0 챗봇 구현 가이드
LLM 기초 > Day 5: 제조 매뉴얼 Q&A 챗봇
학습 목표
v2.0에 추가할 기능의 구현 방법을 이해한다 각 기능의 코드 패턴을 파악한다
v2.0 추가 기능 구현 가이드
기능 1: 에러 처리 (Streamlit 버전)
import time
import random
from openai import RateLimitError, APITimeoutError, APIConnectionError
def safe_stream(client, messages, model, temperature, max_retries=3):
"""안전한 스트리밍 API 호출"""
for attempt in range(max_retries):
try:
return client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
stream=True,
timeout=30.0
)
except (RateLimitError, APITimeoutError, APIConnectionError) as e:
if attempt == max_retries - 1:
raise
delay = (2 ** attempt) + random.uniform(0, 1)
time.sleep(delay)
# Streamlit에서 사용
try:
stream = safe_stream(client, messages, model, temp)
# 스트리밍 처리...
except Exception as e:
st.error(f"AI 서비스 오류: {str(e)}. 잠시 후 다시 시도해주세요.")
기능 2: 대화 내보내기
import json
from datetime import datetime
def export_as_markdown(messages, domain):
"""대화를 마크다운으로 변환"""
lines = [
f"# 제조 AI 대화 기록",
f"- 분야: {domain}",
f"- 날짜: {datetime.now().strftime('%Y-%m-%d %H:%M')}",
f"- 메시지 수: {len(messages)}",
"",
"---",
""
]
for msg in messages:
role = "사용자" if msg["role"] == "user" else "AI"
lines.append(f"### {role}")
lines.append(msg["content"])
lines.append("")
return "\n".join(lines)
# 사이드바에 다운로드 버튼
with st.sidebar:
if st.session_state.messages:
md = export_as_markdown(st.session_state.messages, domain)
st.download_button(
label="대화 내보내기 (MD)",
data=md,
file_name=f"chat_{datetime.now().strftime('%Y%m%d_%H%M')}.md",
mime="text/markdown"
)
기능 3: 비용 실시간 표시
# 세션 초기화
if "total_cost" not in st.session_state:
st.session_state.total_cost = 0.0
if "total_tokens" not in st.session_state:
st.session_state.total_tokens = 0
if "call_count" not in st.session_state:
st.session_state.call_count = 0
# API 호출 후 비용 누적 (추정)
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4o")
est_tokens = len(enc.encode(prompt)) + len(enc.encode(response))
est_cost = est_tokens / 1e6 * 0.375 # 평균 가격
st.session_state.total_tokens += est_tokens
st.session_state.total_cost += est_cost
st.session_state.call_count += 1
# 사이드바에 표시
with st.sidebar:
col1, col2 = st.columns(2)
col1.metric("호출", f"{st.session_state.call_count}회")
col2.metric("토큰", f"{st.session_state.total_tokens:,}")
st.metric("비용", f"${st.session_state.total_cost:.4f}")
기능 4: 예시 질문 버튼
EXAMPLES = {
"CNC 가공": [
"FANUC 알람 SV0401의 원인과 조치는?",
"SUS304 엔드밀 가공 최적 절삭 조건은?",
"가공면 채터마크 원인을 분석해주세요",
],
# ... 다른 분야
}
if not st.session_state.messages:
st.write("💡 예시 질문을 클릭하세요:")
for example in EXAMPLES.get(domain, []):
if st.button(example, key=example):
st.session_state.pending_question = example
st.rerun()
# 대기 중인 질문 처리
if "pending_question" in st.session_state:
prompt = st.session_state.pending_question
del st.session_state.pending_question
# ... prompt 처리
기능 5: 답변 피드백
# 각 AI 응답 아래에 피드백 버튼
if "feedback" not in st.session_state:
st.session_state.feedback = []
# 마지막 응답에 대한 피드백
if st.session_state.messages:
cols = st.columns([1, 1, 8])
with cols[0]:
if st.button("👍", key=f"up_{len(st.session_state.messages)}"):
st.session_state.feedback.append({"type": "up", "idx": len(st.session_state.messages)})
st.toast("피드백 감사합니다!")
with cols[1]:
if st.button("👎", key=f"down_{len(st.session_state.messages)}"):
st.session_state.feedback.append({"type": "down", "idx": len(st.session_state.messages)})
st.toast("개선하겠습니다!")AI로 학습하기 — 꿀팁
🧪v2.0 챗봇 신기능 구현 우선순위 결정AI 학습 팁
챗봇 v2.0에 추가할 기능이 많을 때 제조 현장 임팩트 기준으로 우선순위를 정하면 개발 방향이 명확해집니다.
제조 설비 트러블슈팅 챗봇 v2.0에 추가할 후보 기능 목록이 있습니다: (A) RAG 기반 설비 매뉴얼 검색, (B) 대화 히스토리 DB 저장, (C) 설비별 System Prompt 분기, (D) 응답 내 불확실도 표시, (E) 점검 이력 자동 로그 저장. 이 기능들을 제조 현장 실무 임팩트(안전 기여도·시간 절감·현장 수용성)와 구현 난이도를 기준으로 2×2 매트릭스로 우선순위화하고, Week 1 학습자 수준에서 1주일 안에 구현 가능한 기능과 불가능한 기능을 구분해주세요.
이 팁이 도움이 됐나요?