# Trinity Score: 90.0 (Established by Chancellor)
# ⚔️ 점수는 Truth Engine (scripts/calculate_trinity_score.py)에서만 계산됩니다.
# LLM은 consult_the_lens MCP 도구를 통해 점수를 확인하세요.

#!/usr/bin/env python3
"""LAB 책사진 통합 제안: LangChain 고급 패턴 데모
라이브러리 설치 없이 실행 가능 (구조 시각화)
"""


def demo_conversational_retrieval() -> None:
    """제갈량 책사 제안: ConversationalRetrievalChain"""
    print("=" * 70)
    print("제갈량 책사 제안: ConversationalRetrievalChain")
    print("=" * 70)
    print()
    print("📐 구조:")
    print("  1. LLM: ChatOpenAI (gpt-3.5-turbo)")
    print("  2. Embeddings: OpenAIEmbeddings")
    print("  3. Vector Store: FAISS")
    print("  4. Memory: ConversationBufferMemory")
    print("  5. Prompt: Custom PromptTemplate")
    print("  6. Chain: ConversationalRetrievalChain")
    print()
    print("📊 데이터 흐름:")
    print("  질문 → [메모리 확인] → [벡터 검색] → [프롬프트 생성] → LLM → 답변")
    print("           ↓")
    print("        [메모리 저장]")
    print()
    print("✨ 특징:")
    print("  • 이전 대화 기억 (ConversationBufferMemory)")
    print("  • 문서 검색 기반 답변 (FAISS Retriever)")
    print("  • 커스텀 프롬프트 템플릿")
    print("  • 소스 문서 추적")
    print()
    print("🎯 사용 예시:")
    print("  턴 1: 'LangChain이란 무엇인가요?'")
    print("  → [벡터 검색] → 'LangChain은 LLM 프레임워크입니다.'")
    print()
    print("  턴 2: '그걸 n8n에서 어떻게 써요?'")
    print("  → [메모리: 이전에 LangChain을 물어봤음]")
    print("  → [벡터 검색: n8n 통합 관련]")
    print("  → '이전에 말씀하신 LangChain을 n8n에서는...'")
    print()


def demo_multi_turn() -> None:
    """사마의 책사 제안: Multi-turn Conversation"""
    print("=" * 70)
    print("사마의 책사 제안: Multi-turn Conversation")
    print("=" * 70)
    print()
    print("📐 구조:")
    print("  예제 1: ConversationBufferMemory")
    print("    • 모든 대화를 버퍼에 저장")
    print("    • 짧은 대화에 적합")
    print()
    print("  예제 2: ConversationSummaryMemory")
    print("    • 대화를 요약하여 저장")
    print("    • 긴 대화, 토큰 절약")
    print()
    print("  예제 3: 커스텀 프롬프트")
    print("    • PromptTemplate로 응답 스타일 제어")
    print("    • 특정 페르소나 구현")
    print()
    print("📊 공통 데이터 흐름:")
    print("  사용자 입력 → [메모리 로드] → [프롬프트 구성] → LLM → 응답")
    print("                     ↓")
    print("                 [메모리 저장]")
    print()
    print("🎯 사용 예시:")
    print("  턴 1: '안녕하세요! 저는 영덕입니다.'")
    print("  → 'AI: 안녕하세요 영덕님!'")
    print()
    print("  턴 2: '제 이름이 뭐죠?'")
    print("  → [메모리에서 '영덕' 확인]")
    print("  → 'AI: 영덕님이시죠!'")
    print()
    print("  턴 3: '저는 LangChain을 공부하고 있어요.'")
    print("  → 'AI: LangChain 공부하시는군요!'")
    print()
    print("  턴 4: '제가 뭘 공부한다고 했죠?'")
    print("  → [메모리에서 'LangChain 공부' 확인]")
    print("  → 'AI: LangChain을 공부하신다고 하셨어요!'")
    print()


def demo_advanced_retrievalqa() -> None:
    """주유 책사 제안: Advanced RetrievalQA"""
    print("=" * 70)
    print("주유 책사 제안: Advanced RetrievalQA")
    print("=" * 70)
    print()
    print("📐 구조:")
    print("  예제 1: 기본 RetrievalQA (stuff)")
    print("    • 모든 문서를 하나의 프롬프트로")
    print("    • 빠르고 간단")
    print()
    print("  예제 2: 커스텀 프롬프트")
    print("    • PromptTemplate로 답변 형식 제어")
    print("    • 언어, 스타일 커스터마이징")
    print()
    print("  예제 3: Map-Reduce Chain")
    print("    • 각 문서 개별 처리 → 결과 병합")
    print("    • 긴 문서, 많은 컨텍스트")
    print()
    print("  예제 4: Refine Chain")
    print("    • 초기 답변 생성 → 순차적 정제")
    print("    • 정교하고 상세한 답변")
    print()
    print("📊 데이터 흐름:")
    print("  질문 → [벡터 검색] → 관련 문서 → [Chain 처리] → LLM → 답변")
    print()
    print("📋 Chain Type 비교:")
    print("  ┌─────────────┬──────────────────────┬──────────────────────┐")
    print("  │ Chain Type  │ 장점                 │ 적합한 경우          │")
    print("  ├─────────────┼──────────────────────┼──────────────────────┤")
    print("  │ stuff       │ 빠름, 간단           │ 짧은 컨텍스트        │")
    print("  │ map_reduce  │ 병렬 처리, 확장성    │ 긴 문서, 많은 청크   │")
    print("  │ refine      │ 정교한 답변          │ 상세한 분석 필요     │")
    print("  │ map_rerank  │ 최적 답변 선택       │ 명확한 답변 필요     │")
    print("  └─────────────┴──────────────────────┴──────────────────────┘")
    print()
    print("🎯 사용 예시:")
    print("  질문: 'AFO Ultimate의 주요 컴포넌트는?'")
    print()
    print("  Stuff Chain:")
    print("  → [벡터 검색: 2개 문서]")
    print("  → [모든 문서를 하나의 프롬프트로]")
    print("  → 'AFO Ultimate는 Soul Engine, MCP Frontend...'")
    print()
    print("  Map-Reduce Chain:")
    print("  → [벡터 검색: 4개 문서]")
    print("  → [각 문서 개별 요약: Doc1→summary1, Doc2→summary2...]")
    print("  → [모든 요약 병합]")
    print("  → '종합: AFO Ultimate는 4개 컴포넌트로...'")
    print()


def show_comparison() -> None:
    """3가지 패턴 비교"""
    print("=" * 70)
    print("LAB 책사진 통합 분석: 3가지 패턴 비교")
    print("=" * 70)
    print()
    print("┌─────────────────────┬──────────────┬────────────────┬────────────────┐")
    print("│ 특징                │ 제갈량       │ 사마의         │ 주유           │")
    print("│                     │ Conversational│ Multi-turn    │ Advanced RAG   │")
    print("├─────────────────────┼──────────────┼────────────────┼────────────────┤")
    print("│ 메모리              │ ✓            │ ✓              │ ✗              │")
    print("│ 벡터 검색           │ ✓            │ ✗              │ ✓              │")
    print("│ 문서 기반 답변      │ ✓            │ ✗              │ ✓              │")
    print("│ 대화 기억           │ ✓            │ ✓              │ ✗              │")
    print("│ 커스텀 프롬프트     │ ✓            │ ✓              │ ✓              │")
    print("│ Chain Type 다양     │ ✗            │ ✗              │ ✓              │")
    print("├─────────────────────┼──────────────┼────────────────┼────────────────┤")
    print("│ 적합한 용도         │ 대화형 RAG   │ 챗봇           │ 문서 Q&A       │")
    print("│                     │ (최고급)     │ (대화 중심)    │ (검색 중심)    │")
    print("└─────────────────────┴──────────────┴────────────────┴────────────────┘")
    print()
    print("🎯 추천 조합:")
    print("  • 일반 챗봇: 사마의 패턴 (Multi-turn)")
    print("  • 문서 검색: 주유 패턴 (Advanced RAG)")
    print("  • 대화형 문서 검색: 제갈량 패턴 (Conversational RAG) ⭐️ 최고급")
    print()
    print("💡 통합 시나리오:")
    print("  1단계: 사마의 패턴으로 대화 시작")
    print("  2단계: 문서 검색 필요 시 주유 패턴 호출")
    print("  3단계: 대화 + 검색 통합 → 제갈량 패턴으로 진화")
    print()


def show_n8n_integration() -> None:
    """n8n 통합 방법"""
    print("=" * 70)
    print("n8n LangChain 노드 통합 가이드")
    print("=" * 70)
    print()
    print("🔧 발견된 n8n LangChain 노드:")
    print("  Memory:")
    print("    • Simple Memory (nodes-langchain.memoryBufferWindow)")
    print("    • Redis Chat Memory (nodes-langchain.memoryRedisChat)")
    print()
    print("  Retriever:")
    print("    • Vector Store Retriever (nodes-langchain.retrieverVectorStore)")
    print("    • Workflow Retriever (nodes-langchain.retrieverWorkflow)")
    print()
    print("  Chain:")
    print("    • Question and Answer Chain (nodes-langchain.chainRetrievalQa)")
    print("    • Summarization Chain (nodes-langchain.chainSummarization)")
    print()
    print("📐 n8n 워크플로우 구조:")
    print("  Webhook → Code → Memory → Retriever → Q&A Chain → Set → Respond")
    print()
    print("✨ 현재 배치된 워크플로우:")
    print("  • ID: h7GtfMlGarOeJ1UY")
    print("  • 이름: LangChain AI Agent 통합 워크플로우")
    print("  • 노드: 5개 (기본 구조)")
    print("  • 상태: 업로드 완료, 비활성")
    print("  • URL: https://n8n.brnestrm.com/workflow/h7GtfMlGarOeJ1UY")
    print()
    print("🎯 확장 가능 노드:")
    print("  • 47개 LangChain 노드 활용 가능")
    print("  • Memory 9개, Retriever 10개, Chain 10개")
    print()


def main() -> None:
    print()
    print("╔" + "=" * 68 + "╗")
    print("║" + " " * 12 + "LAB 책사진 통합 제안: LangChain 고급 패턴" + " " * 16 + "║")
    print("╚" + "=" * 68 + "╝")
    print()
    print("📚 라이브러리 없이 실행 가능한 데모 버전")
    print("   (실제 실행은 OPENAI_API_KEY 필요)")
    print()

    # 데모 1
    demo_conversational_retrieval()
    input("Press Enter to continue...")
    print("\n" * 2)

    # 데모 2
    demo_multi_turn()
    input("Press Enter to continue...")
    print("\n" * 2)

    # 데모 3
    demo_advanced_retrievalqa()
    input("Press Enter to continue...")
    print("\n" * 2)

    # 비교
    show_comparison()
    input("Press Enter to continue...")
    print("\n" * 2)

    # n8n 통합
    show_n8n_integration()

    print()
    print("=" * 70)
    print("✓ LAB 책사진 통합 제안 데모 완료")
    print("=" * 70)
    print()
    print("📁 생성된 스크립트:")
    print("  1. retrievalqa_advanced_integration.py (제갈량)")
    print("  2. langchain_multi_turn_example.py (사마의)")
    print("  3. langchain_advanced_retrievalqa.py (주유)")
    print()
    print("🚀 실제 실행:")
    print("  export OPENAI_API_KEY='your-key-here'")
    print("  python3 retrievalqa_advanced_integration.py")
    print()


if __name__ == "__main__":
    main()
