25

v2.0 챗봇 구현 가이드

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주일 안에 구현 가능한 기능과 불가능한 기능을 구분해주세요.
이 팁이 도움이 됐나요?