AI 롤플레잉 대화 어플리케이션

AI 롤플레잉 대화 어플리케이션

배경 및 목적

  • ‎​롤플레잉 대화 어플리케이션을 통해서 나만의 AI 언어선생님을 만드는것

  • 특정주제에 대해 역할을 토대로 대화를 연습하는건 언어를 배울때 효과적이라고 생각했음

  • 대화 진행은 음성채팅 방식으로 진행

주요 기능 및 특징

  1. 시나리오 기반 롤플레이:

    • 사전 정의된 다양한 상황(예: 객실 변경 요청)을 제공

    • 실제 상황을 모방한 현실적인 대화 환경 구현

  2. AI 역할 수행:

    • GPT-4 기반의 AI가 고객 역할을 수행

    • 다양한 성격과 요구사항을 가진 가상 고객 설정

  3. 실시간 대화 처리:

    • LangGraph를 활용한 동적 대화 흐름 관리

    • 사용자 응답에 따른 유연한 시나리오 진행

  4. 음성 인터페이스:

    • 음성 인식 기능으로 사용자 입력 처리

    • ElevenLabs를 이용한 자연스러운 AI 음성 출력

  5. 즉각적인 피드백:

    • 대화 종료 후 사용자의 응대 평가

    • 구체적인 개선점 및 칭찬 사항 제시

  6. 다양한 난이도:

    • 초보자부터 전문가까지 대응 가능한 난이도 조절

    • 사용자 숙련도에 따른 시나리오 복잡성 증가

  7. 진행 상황 추적:

    • 사용자의 학습 진행도 및 성과 기록

    • 개인화된 학습 경로 제안

  8. 다국어 지원:

    • 한국어 또는 영어 지원

    • 향후 다양한 언어로 확장 가능

구조

  • 사용자: 특정 역할(예: 호텔 프론트 데스크 직원)을 맡아 대화에 참여

  • AI: 다른 역할(예: 호텔 손님)을 맡아 사용자와 상호작용

  • 시나리오: 구체적인 상황(예: 객실 변경 요청 처리)을 제시하여 실제 상황과 유사한 환경을 제공

  • 미션: 사용자가 수행해야할 미션을 제공해 대화에 몰입할 수 있는 환경을 제공하고 또한 대화가 끝난 후 평가항목으로 사용

  • 평가: 기본적인 언어능력(한국어 또는 영어)에 대해 평가하고 해당 시나리오의 해당 역할에 대해 잘 수행하였는지 평가함(문화적인 맥락, 적절한 단어의 선택등)

  • 목표: 사용자가 실제 상황에서 마주할 수 있는 다양한 시나리오를 연습하고, 즉각적인 피드백을 통해 개선점을 파악할 수 있게 하는 것

AI 롤플레잉 대화 어플리케이션 동작 흐름도

프로세스 단계를 보여주는 순서도

graph TD A[시작] --> B[시나리오 선택] B --> C[역할 배정] C --> D[대화 시작] D --> E{사용자 입력} E --> |사용자 응답| F[AI 분석 및 응답 생성] F --> G{대화 종료?} G --> |아니오| E G --> |예| H[대화 평가] H --> I[피드백 제공] I --> J[결과 저장] J --> K{다른 시나리오?} K --> |예| B K --> |아니오| L[종료]

사용한 기술

  • LLM: gpt-4o, 추후 Gemini 로 바꿀예정(음성으로 입력 -> 음성으로 출력이 잘된다면...)

  • speech_recognition: speech to text

  • elevenlabs: text to speech

  • Langchain(ConversationBufferMemory): AI와 대화를 진행하고 대화내용을 기록 및 기억

  • CrewAI: 미션달성 여부를 포함하여 대화내용을 평가하여, 최종 평가 리포트를 만드는 Agent.

  • LangGraph(추후): 전체 동작흐름도 대로 AI 어플리케이션을 효과적으로 만드는 툴

  • Chainlit(추후): Stramlit 비슷한것

현재까지 결과

  1. 시나리오 기반 롤플레잉 대화를 진행하기 위한 프롬프트 만들기 작업완료

    # 버젼1: 사용자 정의 프롬프트 템플릿 생성
    """당신은 한국 식당의 손님 역할을 하는 AI 튜터입니다. 한국어를 배우는 학생과 대화를 나누며, 
    학생이 홀서버 역할을 수행할 수 있도록 도와주세요. 대화는 한국어로 진행되어야 하며, 
    학생의 대답에 따라 적절히 반응해 주세요.
    
    주문이 완료되거나 시나리오가 자연스럽게 끝나면, 마지막 대화 후에 "**끝**"이라고 답변하세요. 
    이는 대화의 종료를 의미합니다.
    
    현재 대화 기록:
    {chat_history}
    
    홀서버 (학생): {input}
    손님 (AI): """
    # 버젼2
    """당신은 한국 식당에서 항상 손님 역할을 하는 AI 튜터입니다. 절대 홀서버 역할을 하지 않습니다. 당신의 역할은 손님으로서 주문을 하고, 서버의 응대를 받는 것입니다. 한국어를 배우는 학생과 대화를 나누며, 학생이 홀서버 역할을 수행할 수 있도록 도와주세요. 
    
    역할:
    - 당신: 한국 식당의 손님
    - 학생: 홀서버
    
    손님 페르소나:
    - 이름: 김민수
    - 나이: 35세
    - 성격: 친절하고 예의 바름.
    - 선호도: 매운 음식을 좋아하지만, 너무 짠 음식은 싫어함.
    - 말투: 차분하고 명확하게 요청을 전달하며, 가끔 농담을 섞어 분위기를 부드럽게 함.
    - 상황: 점심 식사 시간에 잠깐 쉬러 온 회사원. 바쁜 일상에서 잠시 벗어나 편안하게 식사를 즐기고 싶어 함.
    
    시나리오 설정:
    - 장소: 한국 식당
    - 상황: 식당에 입장부터 주문을 완료하기까지의 과정
    
    지침:
    1. 대화는 한국어로 진행합니다.
    2. 식당에서의 일반적인 상황을 단계별로 진행하세요 (입장, 주문 등).
    3. 학생의 대답에 따라 식당에 온 손님의 입장에서 적절히 반응하세요.
    4. 실제 대화처럼 자연스럽게 응답하되, 학습에 도움이 되도록 다양한 표현을 사용하세요.
    5. 각 응답은 1-3문장 정도로 간결하게 유지하세요.
    6. 학생이 어려워하는 경우, 선택지를 제시하거나 힌트를 줄 수 있습니다.
    
    중요:
    - 주문이 완료되거나 시나리오가 자연스럽게 끝나면, 마지막 대화 후에 "**끝**"이라고 답변하세요. 이는 대화의 종료를 의미합니다.
    - 항상 한 번에 하나의 응답만 제공하세요.
    
    시작하기:
    손님으로서 식당에 막 입장한 상황부터 대화를 시작하세요."""
    # 버젼3: 영어로 변경했고 Persona를 주입함
    # 대화내용이 끝났을때 "**End**" 로 답변하라는 지시사항을 통해 대화가 끝났을때를 체크
    """You are an AI tutor playing the role of a hotel guest. The learner is acting as a hotel front desk staff member, handling various guests and requests in a simulated work environment. Your job is to present situations that allow the learner to practice customer service skills. **You must only act as the guest and never behave like a front desk staff member.**
    
    Roles:
    - **You**: A hotel guest (playing a specific type of guest with a defined personality and situation).
    - **Learner**: Hotel front desk staff member.
    
    Scenario Setup:
    - Location: A luxury hotel front desk in Seoul.
    - Situation: The learner is working as a hotel front desk staff member, dealing with various guests and solving their problems. You will act as the guest, making requests or presenting problems that the learner must address.
    
    Guidelines:
    1. The conversation will be conducted in Korean.
    2. **Maintain your role as a guest and ask requests or questions to the learner.** Never behave as the front desk staff.
    3. Adjust the requests or present additional issues based on the learner’s responses, ensuring a natural flow of conversation.
    4. If the learner struggles, provide hints or additional information from the guest’s perspective.
    5. Praise the learner for handling requests well, and provide feedback on areas that need improvement.
    6. Keep each response concise, within 1-3 sentences.
    
    Guest Persona:
    - **Persona: Sujin Kim**
    - **Name**: Sujin Kim
    - **Personality**: Calm but demanding
    - **Request**: "My room is too noisy. Can I be moved to a different room?"
    - **Objective**: The learner should handle your request by finding alternative rooms and clearly communicating any additional costs or availability issues. The goal is for the learner to provide a satisfactory solution that addresses the noise problem and ensures a positive guest experience.
    
    Important:
    - If the learner handles the guest’s request appropriately or the scenario naturally concludes, respond with "**End**" at the end of the conversation to indicate the scenario is complete.
    - **Always stay in your role as a guest and do not behave like the front desk staff.**
    
    Starting Point:
    As Sujin Kim, approach the front desk and initiate the request to change your room due to noise issues."""
  2. Langchain으로 대화 chain 구성

    class MyConversationChain(Runnable):
        def __init__(self, llm, prompt, memory, input_key="input"):
    
            self.prompt = prompt
            self.memory = memory
            self.input_key = input_key
    
            self.chain = (
                RunnablePassthrough.assign(chat_history=RunnableLambda(self.memory.load_memory_variables)
                    | itemgetter(memory.memory_key)
                )
                | prompt
                | llm
                | StrOutputParser()
            )
    
        def invoke(self, query, configs=None, **kwargs):
            answer = self.chain.invoke({self.input_key: query, "stop": ["**끝**", "**End**", "**END**"]})
            self.memory.save_context(inputs={"human": query}, outputs={"ai": answer})
            return answer
    
    llm = ChatOpenAI(model_name="gpt-4o", temperature=0.3)
    
    # 대화형 프롬프트를 생성합니다. 이 프롬프트는 시스템 메시지, 이전 대화 내역, 그리고 사용자 입력을 포함합니다.
    prompt = ChatPromptTemplate.from_messages(
        [
            ("system", template),
            MessagesPlaceholder(variable_name="chat_history"),
            ("human", "{input}"),
        ]
    )
    
    # 대화 버퍼 메모리를 생성하고, 메시지 반환 기능을 활성화합니다.
    memory = ConversationBufferMemory(return_messages=True, memory_key="chat_history")
    
    # 요약 메모리로 교체할 경우
    # memory = ConversationSummaryMemory(
    #     llm=llm, return_messages=True, memory_key="chat_history"
    # )
    
    conversation_chain = MyConversationChain(llm, prompt, memory)
  3. 음성을 통해 대화를 하고 LLM결과를 음성으로 재생

    import speech_recognition as sr
    from typing import Iterator
    from elevenlabs.client import ElevenLabs
    from elevenlabs import VoiceSettings, Voice
    from io import BytesIO
    from elevenlabs import play, stream
    import os
    
    def recognize_speech():
        recognizer = sr.Recognizer()
        with sr.Microphone() as source:
            print("듣고 있습니다... 말해주세요.")
            audio = recognizer.listen(source)
            try:
                # Google Web Speech API 사용
                text = recognizer.recognize_google(audio, language="ko-KR")
                # print(f"사용자: {text}")
                return text
            except sr.UnknownValueError:
                print("음성을 인식하지 못했습니다. 다시 시도해주세요.")
                return None
            except sr.RequestError:
                print("음성 인식 서비스에 연결할 수 없습니다.")
                return None
    
    ELEVENLABS_API_KEY = os.environ.get("ELEVENLABS_API_KEY")
    ELEVENLABS_VOICE_ID = os.environ.get("ELEVENLABS_VOICE_ID")
    
    if not ELEVENLABS_API_KEY or not ELEVENLABS_VOICE_ID:
        raise ValueError("ELEVENLABS_API_KEY and ELEVENLABS_VOICE_ID must be set")
    
    elevenLabsClient = ElevenLabs(
        api_key=ELEVENLABS_API_KEY,
    )
    
    def text_to_speech(text: str):
        audio_stream = elevenLabsClient.generate(
            text=text,
            voice="Chris",
            model="eleven_multilingual_v2",
            stream=True
        )
        stream(audio_stream)
    
    def text_to_speech_as_stream(text_stream: Iterator[str]):
    # 이건 돈내야 사용가능 ㅠㅠ
        audio_stream = elevenLabsClient.generate(
            text=text_stream,
            voice="Chris",
            model="eleven_multilingual_v2",
            stream=True
        )
        stream(audio_stream)
    
    # 대화 인풋 -> 아웃풋
    while True:
        # user_input = input("사용자: ")
        # if user_input.lower() == 'exit':
        #     print("대화를 종료합니다.")
        #     break
    
        user_input = recognize_speech()
        if user_input is None:
            continue
        
        if '종료' in user_input:
            print("대화를 종료합니다.")
            break
        
        print("User:", user_input)
        response = conversation_chain.invoke(user_input)
        print("AI:", response)
    
        response = response.replace("**End**", "").replace("**END**", "")
        text_to_speech(response)
    
        if "**끝**" in response or "**End**" in response or "**END**" in response:
            print("시나리오가 완료되어 대화를 종료합니다.")
            break
    # 이건 간단하게 호텔체크인 하는 시나리오를 테스트한 print 내용
    
    사용자: 안녕하세요
    AI: 안녕하세요! 제 이름은 박준영입니다. 제가 좀 급한데 체크인 좀 빨리 해주실 수 있을까요?
    사용자: 예약 확인만 되면 바로 체크인 해 드리겠습니다
    AI: 네, 제 이름은 박준영이고 예약은 제 이름으로 되어 있을 거예요. 확인해 주실 수 있나요?
    사용자: 혹시 예약 확인 가능한 문자 메시지나 예약 번호가 있을까요
    AI: 아, 네! 여기 제 휴대폰에 예약 확인 문자 메시지가 있어요. 이걸로 확인해 주실 수 있나요?
    사용자: 아네 확인되셨습니다 오늘 숙소는 506호 드릴게요 키 여기 있습니다
    AI: 정말 감사합니다! 덕분에 빨리 체크인할 수 있었네요. 좋은 하루 되세요! **End**
    시나리오가 완료되어 대화를 종료합니다.
  4. CrewAI Agent: 대화가 종료되면 대화내용을 평가

    from typing import List
    from crewai import Agent, Task, Crew
    from textwrap import dedent
    from langchain_openai import ChatOpenAI
    from pydantic import BaseModel
    
    # LLM 정의
    llm = ChatOpenAI(
        model_name="gpt-4o",
        temperature=0.7,
    )
    
    # Define the Evaluation Agent
    # 파라미터 내용은 시나리오 따라 바뀔수 있음.
    evaluation_agent = Agent(
        name="Room Change Evaluation Agent",
        role="Hotel Service Quality Evaluator",
        goal="Evaluate the performance of hotel staff in handling room change requests",
        backstory=dedent("""
            You are an experienced hotel service quality evaluator with a keen eye for
            customer service excellence. Your job is to assess how well the hotel staff
            handles room change requests, ensuring they meet the highest standards of
            customer satisfaction.
        """),
        tools=[],  # No specific tools needed for this evaluation
        verbose=True
    )
    
    # Define the Evaluation Task
    evaluation_task = Task(
        llm=llm,
        description=dedent("""
            Analyze the conversation between the hotel staff and the guest requesting a room change.
            Evaluate the performance based on the following criteria:
            1. Attentiveness to the guest's complaint (noise issue)
            2. Speed and appropriateness of offering alternative rooms
            3. Clarity in explaining the room change procedure
            4. Transparency about any additional costs
            5. Overall customer satisfaction and problem-resolution efficiency
    
            Provide a detailed evaluation report in Korean with scores for each criterion (1-10 scale)
            and an overall performance score. Include specific feedback and suggestions for improvement.
        """),
        agent=evaluation_agent,
        expected_output=dedent("""
            다음 내용을 포함하는 상세한 평가 보고서를 반드시 한국어로 작성하십시오:
            1. 5가지 평가 기준 각각에 대한 점수 (1-10점 척도)
               a) 고객의 불만사항(소음 문제)에 대한 주의 깊은 경청
               b) 대체 객실 제안의 신속성과 적절성
               c) 객실 변경 절차 설명의 명확성
               d) 추가 비용에 대한 투명한 안내
               e) 전반적인 고객 만족도와 문제 해결 효율성
            2. 전체적인 성과 점수 (100점 만점)
            3. 강점과 약점에 대한 구체적인 피드백 (각각 3가지 이상)
            4. 서비스 개선을 위한 실행 가능한 제안 (3가지 이상)
            5. 전반적인 서비스 품질에 대한 간단한 요약 (2-3문장)
    
            주의: 모든 평가와 피드백은 반드시 한국어로 작성되어야 하며, 객관적이고 건설적이어야 합니다.
        """)
    )
    
    # Create the Crew
    evaluation_crew = Crew(
        manager_llm=llm,
        agents=[evaluation_agent],
        tasks=[evaluation_task],
        verbose=True  # Changed from 2 to True
    )
    
    # Function to run the evaluation
    def evaluate_room_change_handling(conversation_transcript):
        result = evaluation_crew.kickoff(
            inputs={
                "conversation_transcript": conversation_transcript
            }
        )
        return result
    
    # 테스트
    conversation_transcript = """
    손님: 안녕하세요. 제 방이 너무 시끄러워서요. 다른 방으로 옮길 수 있을까요?
    직원: 안녕하세요, 김수진 고객님. 불편을 드려 죄송합니다. 어떤 소음이 있었는지 자세히 말씀해 주시겠어요?
    손님: 옆방에서 계속 큰 소리로 대화하는 소리가 들려요. 밤늦게까지 시끄러워서 잠을 잘 수가 없어요.
    직원: 불편을 끼쳐 정말 죄송합니다. 현재 가능한 객실을 확인해 보겠습니다. 잠시만 기다려 주시겠습니까?
    손님: 네, 알겠습니다. 빨리 해결됐으면 좋겠어요.
    직원: 고객님, 확인해 보니 동일한 등급의 객실이 조용한 구역에 있습니다. 추가 비용 없이 바로 변경 가능합니다. 새 객실로 안내해 드릴까요?
    손님: 네, 그렇게 해주세요. 정말 감사합니다.
    직원: 네, 바로 처리해 드리겠습니다. 새 객실 키를 준비해 드리겠습니다. 짐 운반에 도움이 필요하신가요?
    손님: 아니요, 괜찮습니다. 제가 직접 옮기도록 하죠. 새 방 번호만 알려주세요.
    직원: 알겠습니다. 새 객실은 1423호입니다. 이쪽으로 새 키카드 드리겠습니다. 추가로 필요한 것 있으신가요?
    손님: 아니요, 이제 괜찮습니다. 빠르게 처리해 주셔서 감사합니다.
    """
    
    evaluation_result = evaluate_room_change_handling(conversation_transcript)
    print(evaluation_result)
    # evaluation_result
    1. 5가지 평가 기준 각각에 대한 점수 (1-10점 척도)
       a) 고객의 불만사항(소음 문제)에 대한 주의 깊은 경청: 8점
       b) 대체 객실 제안의 신속성과 적절성: 7점
       c) 객실 변경 절차 설명의 명확성: 6점
       d) 추가 비용에 대한 투명한 안내: 7점
       e) 전반적인 고객 만족도와 문제 해결 효율성: 7점
    
    2. 전체적인 성과 점수 (100점 만점): 70점
    
    3. 강점과 약점에 대한 구체적인 피드백 (각각 3가지 이상)
    
    강점:
    - 고객의 불만 사항을 경청하는 데 있어 직원의 태도가 비교적 진지하고 성실했다.
    - 대체 객실을 제안하는 데 있어 직원이 신속하게 대응하였다.
    - 추가 비용에 대한 안내가 비교적 명확했다.
    
    약점:
    - 객실 변경 절차에 대한 설명이 다소 불명확하여 고객이 혼란스러워 할 수 있었다.
    - 대체 객실의 적절성에 대한 평가가 부족하여 고객의 만족도가 낮았다.
    - 문제 해결 후 고객의 만족도를 확인하는 과정이 부족했다.
    
    4. 서비스 개선을 위한 실행 가능한 제안 (3가지 이상)
    - 객실 변경 절차를 명확하게 설명할 수 있는 매뉴얼을 제작하여 직원 교육을 강화할 필요가 있다.
    - 대체 객실을 제안할 때 고객의 요구 사항을 더 잘 반영할 수 있도록 개선한다.
    - 문제 해결 후 고객의 만족도를 확인하기 위한 후속 조치를 강화한다.
    
    5. 전반적인 서비스 품질에 대한 간단한 요약 (2-3문장)
    전체적으로 호텔 직원은 고객의 불만 사항에 대해 신속하게 대응하고자 노력하였으나, 객실 변경 절차의 명확성 및 대체 객실의 적절성 측면에서 다소 부족한 부분이 있었다. 이 부분을 개선한다면 고객 만족도를 더욱 높일 수 있을 것이다.

    그런데 이렇게 되면 구조화된 데이터를 얻을수 없음ㅠㅠ
    구조화된 데이터가 있어야 입맛대로 데이터를 가공하고 저장도 하고 유저한테도 원하는대로 보여줄수 있음.
    그런데 마침 할 수 있는 방법이 있었음...
    다음 코드는 이걸 위한 수정된 코드...

    # Pydantic 모델 정의
    class CriteriaScore(BaseModel):
        criteria: str
        score: int
    
    class EvaluationOutput(BaseModel):
        criteria_scores: List[CriteriaScore]
        overall_score: int
        strengths: List[str]
        weaknesses: List[str]
        suggestions: List[str]
        summary: str
    
    evaluation_task = Task(
        llm=llm,
        description="""
        Analyze the conversation between the hotel staff and the guest requesting a room change.
        Evaluate the performance based on the following criteria:
        1. Attentiveness to the guest's complaint (noise issue)
        2. Speed and appropriateness of offering alternative rooms
        3. Clarity in explaining the room change procedure
        4. Transparency about any additional costs
        5. Overall customer satisfaction and problem-resolution efficiency
    
        Provide a detailed evaluation report with scores for each criterion (1-10 scale)
        and an overall performance score (out of 100). Include specific feedback and suggestions for improvement.
        """,
        agent=evaluation_agent,
        output_pydantic=EvaluationOutput,
        expected_output="""
        다음 내용을 포함하는 상세한 평가 보고서를 반드시 한국어로 작성하십시오:
        1. 5가지 평가 기준 각각에 대한 점수 (1-10점 척도)
        2. 전체적인 성과 점수 (100점 만점)
        3. 강점과 약점에 대한 구체적인 피드백 (각각 3가지 이상)
        4. 서비스 개선을 위한 실행 가능한 제안 (3가지 이상)
        5. 전반적인 서비스 품질에 대한 간단한 요약 (2-3문장)
    
        주의: 모든 평가와 피드백은 반드시 한국어로 작성되어야 하며, 객관적이고 건설적이어야 합니다.
        """
    )

    이렇게 되면 EvaluationOutput에 정의한 구조대로 output이 나옴.

    # 결과 출력
    print("평가 결과:")
    print(f"전체 점수: {evaluation_result.pydantic.overall_score}")
    print("\n각 기준별 점수:")
    for score in evaluation_result.pydantic.criteria_scores:
        print(f"{score.criteria}: {score.score}")
    print("\n강점:")
    for strength in evaluation_result.pydantic.strengths:
        print(f"- {strength}")
    print("\n약점:")
    for weakness in evaluation_result.pydantic.weaknesses:
        print(f"- {weakness}")
    print("\n개선 제안:")
    for suggestion in evaluation_result.pydantic.suggestions:
        print(f"- {suggestion}")
    print(f"\n요약: {evaluation_result.pydantic.summary}")
    
    # print 출력내용
    평가 결과:
    전체 점수: 76
    
    각 기준별 점수:
    고객 불만(소음 문제)에 대한 주의력: 8
    대체 객실 제공의 신속성과 적절성: 7
    객실 변경 절차에 대한 설명의 명확성: 9
    추가 비용에 대한 투명성: 6
    전체 고객 만족도와 문제 해결 효율성: 8
    
    강점:
    - 소음 문제에 대한 고객의 불만을 적극적으로 청취하고 이해하려는 태도가 좋았습니다.
    - 객실 변경 절차를 명확하게 설명하여 고객이 이해하기 쉽게 했습니다.
    - 문제 해결을 위해 빠르게 대응하려는 의지가 보였습니다.
    
    약점:
    - 대체 객실을 제공하는 데 있어 다소 시간이 걸렸습니다.
    - 추가 비용에 대한 정보 제공이 부족하여 고객이 혼란스러워할 수 있었습니다.
    - 대체 객실의 적절성에 대한 평가가 미흡하여 고객이 만족하지 않을 가능성이 있었습니다.
    
    개선 제안:
    - 대체 객실 제공 속도를 높이기 위해 객실 상황에 대한 실시간 업데이트 시스템을 도입하십시오.
    - 추가 비용 발생 시 고객에게 명확하고 즉각적으로 정보를 제공하는 절차를 마련하십시오.
    - 대체 객실의 적절성을 높이기 위해 고객의 선호 사항을 사전에 파악하고 반영하는 시스템을 구축하십시오.
    
    요약: 호텔 직원은 고객의 불만에 대해 적극적이고 신속하게 대응하려는 노력을 보여주었습니다. 그러나 대체 객실 제공 속도와 추가 비용에 대한 투명성에서 개선이 필요합니다. 이러한 점을 보완하면 고객 만족도를 더욱 높일 수 있을 것입니다.
  5. 다음에 할것.

    • 전체 코드를 LangGraph를 사용하여 깔끔히 변경

    • LLM모델을 멀티모달이 가능하다고 하는 Gemini를 사용하여 품질이 좋으면 이걸로 변경, 이게 되면 인풋 -> 아웃풋의 Latency를 많이 줄일수 있을걸로 기대!

    • 실제유저가 사용가능하도록 Chainlit(강력후보) or Stremlit or 직접 프론트엔드개발(NextJS) 이 중에 하나를 사용해서 쓸만한 어플리케이션 다운걸 만듬.

7
5개의 답글

👉 이 게시글도 읽어보세요