TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 Gen AI>

[Gen AI] 그라디오로 두 번째 챗봇 제작하기-3

by 기록자_Recordian 2024. 12. 21.
728x90
반응형
이전 내용
 

[Gen AI] 그라디오로 두 번째 챗봇 제작하기-1

이전 내용 [Gen AI] 문서 요약 프롬프트 제작이전 내용 [Gen AI] 음성 변환 기술 구현해보기(STT, TTS)이전 내용 [Gen AI] 그라디오 챗봇 업그레이드그라디오로 제작한 챗봇 시리즈 [Gen AI] 그라디오로

puppy-foot-it.tistory.com

 

[Gen AI] 그라디오로 두 번째 챗봇 제작하기-2

이전 내용 [Gen AI] 그라디오로 두 번째 챗봇 제작하기-1이전 내용 [Gen AI] 문서 요약 프롬프트 제작이전 내용 [Gen AI] 음성 변환 기술 구현해보기(STT, TTS)이전 내용 [Gen AI] 그라디오 챗봇 업그레이

puppy-foot-it.tistory.com

음성 인식봇, 문서 요약봇에 이어 일정 관리봇을 제작해 본다.


일정 관리봇 제작하기

 

◆ 일정 관리봇 레이아웃 구성하기

탭을 제외한 일정 관리봇의 레이아웃은 아래와 같이 세로로 총 4블록, 3번째 블록은 가로로 2블록으로 나뉘어 있다.

    with gr.Tab("일정 관리봇"):
        with gr.Row():
            #1
            gr.Markdown()
        with gr.Row():
            #2
            gr.Chatbot()
        with gr.Row():
            #3
            gr.Textbox()
            #4
            gr.Button()
        with gr.Row():
            #5
            gr.File()
            
app.launch()

 

이제 구체적으로 하나씩 컴포넌트를 수정해 본다.

 

- 일정 관리봇 타이틀 구현

        with gr.Row():
            #1
            gr.Markdown(
                value="""
                # <center>일정 관리봇</center>
                <center> AI 인공지능 비서 DUDE 입니다. 일정 관리를 위한 봇입니다.</center>
                """)

 

- 일정 관리봇 채팅 화면 구현

        with gr.Row():
            #2
            gr.Chatbot(
                value=[
                    [None, "안녕하세요, 일정 이름, 시간, 일정 설명으로 일정을 추가할 수 있습니다. \n\
                    예시: 크리스마스, 2024년 12월 25일 12시 00분, 올해의 크리스마스 일정 추가해 줘\n\
                    전체 일정이 보고 싶다면 전체일정 보여줘 라고 말해 주세요."],
                ],
                show_label="일정 관리"                     
            )

 

- 채팅 입력 창과 채팅 제출 버튼 및 엑셀 파일 업로드 구현

        with gr.Row():
            #3
            gr.Textbox(
                label="채팅",
                lines=1,
                placeholder="채팅 입력 창",
                scale=8,
            )
            #4
            gr.Button(
                value="보내기",
                scale=2,
                visible="primary",
            )
        with gr.Row():
            #5
            gr.File(
                label="일정 파일을 업로드해 주세요.",
                scale=8,
                visible="primary",
                height=100
            )

 

각각의 컴포넌트를 추가하면 하단과 같이 완성된다.


◆ 일정 관리봇 레이아웃 구성하기 - 상세 설정

각각의 컴포넌트에 변수명과 구체적인 매개변수를 설정한다.


◆ 일정 관리봇 기능 구현하기

일정 관리를 위해서는 일정을 따로 데이터베이스에 저장해야 한다. 챗봇에서는 엑셀 파일로 저장해 간단하게 일정을 기록하고 다시 불러들여와 일정을 확인할 수 있도록 한다.

 

- 프롬프트 정의

일정을 추가하고 관리하기 위해서는 JSON 형태로 답변을 받아야 한다. 따라서 답변을 받고자 하는 프롬프트를 좀 더 자세하게 설정하여 원하는 JSON 결과를 얻을 수 있도록 프롬프트를 작성해야 한다.

system_schedule_ko="""일정 관리에 대한 사용자 입력이 주어집니다.
'schedule_type,' 'schedule_content,' 'schedule_content_detail,' 'year,'
'month,' 'day,' 'hour,' 및 'min'과 같은 구성 요소가 있습니다.
'schedule_type'은 조회, 삭제, 추가, 업데이트 중 하나일 수 있습니다.
'year,' 'month,' 'day,' 'hour,' 및 'min'에 대한 값은 숫자여야 합니다.
'schedule_content,' 'schedule_content_detail,' 'year,' 'month,' 'day,' 'hour,' 및 'min'에 대한 입력은
json 문자열 형식으로 이루어져야 합니다."""
system_setting_schedule=SystemMessagePromptTemplate.from_template(system_schedule_ko)

# 프롬프트 설정
schedule_prompt=ChatPromptTemplate.from_messages([
    system_setting_schedule,
    MessagesPlaceholder(variable_name="DUDE_schedule"),
    HumanMessagePromptTemplate.from_template("{master_user}"),
])

JSON 결과는 schedule_type 키 값에 삭제, 추가, 업데이트, 조회 중 하나가 입력된다.

그리고 schedule_content와 시간, schedule_content_detail로 받을 수 있도록 설정한다.

최종적으로 JSON 결과를 출력으로 받게 된다.

 

만약

크리스마스, 2024년 12월 25일 12시 00분, 올해의 화이트 크리스마스 일정 추가해 줘

라고 입력한다면 답변은 다음과 같이 JSON 형태로 받을 수 있다.

{
	"schedule_type": "추가",
    "schedule_content": "크리스마스",
    "schedule_content_detail": "올해의 화이트 크리스마스",
    "year": 2024,
    "month": 12,
    "day": 25,
    "hour": 12,
    "min": 0
}

챗GPT를 이용해 일정을 대략적으로 적었을 때 JSON으로 내용을 요약하여 답변을 받을 수 있다. 이렇게 받은 결과를 이용해서 JSON 파일에 저장하여 일정을 관리하는 챗봇을 만들 수 있다.

 

- 메모리 설정 및 랭체인 설정

# 메모리 설정
schedule_memory=ConversationBufferWindowMemory(
    memory_key="DUDE_schedule",
    ai_prefix="AI 비서 DUDE schedule",
    human_prefix="사용자",
    return_messages=True,
    k=10
)

# llm 모델 정의
chatgpt=ChatOpenAI(
    temperature=0,
    max_tokens=2048,
    model_name="gpt-3.5-turbo"
)

# llmchain 정의
conversation_schedule=LLMChain(
    llm=chatgpt, # LLM
    prompt=schedule_prompt,
    verbose=True, # True 로 설정 시 로그 출력
    memory=schedule_memory
)

◆ 챗봇 기능 추가

  • 일정 관리 엑셀 파일 관리하기
  • 엑셀 파일 업로드 시 저장하기
  • 인공지능 답변 및 일정 저장하기
  • 이벤트 리스너 추가하기

- 일정 관리 엑셀 파일 관리하기

일정을 추가하거나 전체 일정을 요청했을 때 저장된 엑셀 파일을 불러와 수정할 수 있도록 한다. 엑셀 파일은 주로 판다스 라이브러리를 이용해 관리할 수 있으므로, 판다스 설치가 선행되어야 한다.

또한, 파이썬에서 엑셀 파일을 열 수 있는 openpyxl 모듈도 없다면 설치해야 한다.

pip install pandas
pip install openpyxl # openpyxl 없을 경우

 

그리고 일정을 관리하기 위한 엑셀 파일을 생성한다.

# 일정 관리 excel 파일 관리
import pandas as pd
# 처음 파일 생성
initial_df=pd.DataFrame(columns=[
    "schedule_type",
    "schedule_content",
    "schedule_content_detail",
    "year",
    "month",
    "day",
    "hour",
    "min"
])
excel_file_path="schedule.xlsx"
initial_df.to_excel(excel_file_path, index=False)

 

- 엑셀 파일 업로드 시 저장하기

기존에 가지고 있던 일정 파일이 있다면 업로드할 수 있다. 형식에 맞춰 일정을 저장했다면 새로운 일정을 추가하게 된다.

def schedule_bot_save(submit_file):
    temp_excel_file=pd.read_excel(submit_file)
    temp_excel_file.to_excel(excel_file_path, index=False)
  • temp_excle_file=pd.read_excel(submit_file): 데이터 프레임 형식으로 반환하여 temp_excel_file 변수에 저장
  • temp_excel_file.to_excel(excel_file_path, index=False): 읽어들인 파일을 excel_file_path로 설정하여 저장

- 인공지능 답변 및 일정 저장하기

인공지능 답변 및 일정에 대한 질문에 답변할 수 있도록 함수를 작성한다.

import json
def schedule_bot_chat(message, chat_history):
    answer=conversation_schedule({"master_user": message})
    ai_answer=answer['text']

    try:
        schedule_dic=json.loads(ai_answer)
        if schedule_dic["schedule_type"] == "추가":
            schedule_df=pd.read_excel(excel_file_path)
            schedule_df=pd.concat([schedule_df, pd.DataFrame([schedule_dic])],
                                  ignore_index=True)
            schedule_df.to_excel(excel_file_path, index=False)
            chat_history.append([message, f"{schedule_dic['schedule_content']}_일정이 추가되었습니다."])
        elif schedule_dic["schedule_type"] == "조회":
            schedule_df=[]
            if os.path.isfile(excel_file_path):
                schedule_df=pd.read_excel(excel_file_path)
            chat_history.append([message, "전체 일정을 말씀드리겠습니다."])

            for idx, event in schedule_df.iterrows():
                chat_history.append(
                    [None, f"{idx+1}. 일정: {event['schedule_content']}\n"
                    f"일정 설명: {event['schedule_content_detail']}\n"
                    f"일정 시간: {event['year']}년, {event['month']}월, {event['day']}일,"
                    f"{event['hour']}시, {event['min']}분"])

    except:
        chat_history.append((message, ai_answer))
    return "", chat_history # 채팅 기록 반환

▶ try-except 구문을 활용하여 만약 일정을 추가해 달라고 했을 때는 JSON 형식으로 답변을 주게 되는데, 일정 추가가 아닌 일반 답변일 경우에는 except를 통해 출력되도록 하였다.

  • ai_answer=conversation({"master_user": message})['text']: 인공지능 답변을 받아 ai_answer 변수로 지정한다.
  • schedule_dic=json.loads(ai_answer): 인공지능 답변을 json.loads로 불러들이면 딕셔너리 형태로 받을 수 있다.
  • if 문: schedule_type 이 "추가" 인 경우, 일정이 추가되며 schedule_df=pd.read_excel(excel_file_path)을 통해 엑셀 파일을 불러와 schedule_df의 변수에 데이터프레임 형태로 가져온다. pd.concat([schedule_df, pd.DataFrame([schedule_dic])]은 schedule_df에 새로운 일정인 schedule_dic를 추가한다. schedule_df.to_excel()은 추가된 일정을 엑셀 파일로 저장한다.
  • elif문: schedule_type의 결과가 "조회"일 경우에 실행된다. os.path.isfile(excel_file_path)는 저장된 엑셀 파일을 불러들여와 schedule_df 변수에 바인딩한다. for idx, event in schedule_df.iterrows()는 schedule_df의 데이터프레임에서 한 줄씩 인덱스 값과 그 값을 가져오기 위한 코드이며, 데이터프레임에 저장된 내용을 한 줄씩 출력한다.

- 이벤트 리스너 추가하기

아래 세 가지 이벤트가 일어났을 때 실행되는 함수와 요소들을 연결한다.

  • [보내기] 버튼 클릭
  • ENTER 제출
  • 엑셀 파일 업로드 시 저장
            cb_schedule_submit_btn.click(
                fn=schedule_bot_chat,
                inputs=[msg_schedule, chatbot_schedule],
                outputs=[msg_schedule, chatbot_schedule]
            )
            msg_schedule.submit(
                fn=schedule_bot_chat,
                inputs=[msg_schedule, chatbot_schedule],
                outputs=[msg_schedule, chatbot_schedule]
            )
            schedule_file.change(
                fn=schedule_bot_save,
                inputs=[schedule_file]
            )
  • fn=schedule_bot_chat: 앞서 만든 schedule_bot_chat 함수를 적용하여 결괏값을 반환받는다.
  • inputs=[msg_schedule, chatbot_schedule]: 입력으로는 msg_schedule에 입력된 일정 관련 내용을 받는다.
  • outputs= [msg_schedule, chatbot_schedule]: 함수 처리 결과를 JSON으로 받아 처리한 결과를 출력한다.
  • 가지고 있는 일정 관련 엑셀 파일이 있다면 저장한 후 동일하게 진행하게 된다.

해당 코드들은 하단에 보이는 위치에 작성하면 된다.


완성된 챗봇 구현해보기

 

완성된 음성 인식봇, 문서 요약봇, 일정 관리봇을 구현해 본다.

 

◆ 음성 인식봇

글이나 음성으로 입력된 질문에 답해 주는 봇이 완성되었고, 성공적으로 구현된다.

 

◆ 문서 요약봇

PDF 문서를 업로드했을 때 간단하게 요약해 주는 봇이 완성되었고, 잘 구현된다.

 

◆ 일정 관리봇

일정을 추가하거나 조회할 수 있는 일정 관리봇이 완성되었고, 일정 추가 작업이 성공적으로 구현된다.

 

전체 일정을 보여달라고 했을 때는 다음과 같이 저장된 일정이 출력된다.

 

또한, 첫 일정은 지정한 경로로 자동 저장되고, 추가되는 일정은 해당 파일에 자동으로 덮어쓰기 된다.


일정 관리봇 전체 코드
(음성 인식봇, 문서 요약봇 포함)

 

from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferWindowMemory
from langchain.prompts import(
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
import os
import openai

# 환경변수에서 OpenAI API 키를 읽어옴.
openai_api_key = os.getenv('OPENAI_API_KEY')

# API 키가 환경변수에 설정되어 있는지 확인.
if not openai_api_key:
    raise ValueError("환경변수 'OPENAI_API_KEY'가 설정되지 않았습니다.")

# OpenAI API 키를 설정.
openai.api_key = openai_api_key

# OpenAI 클라이언트를 생성.
client = openai.OpenAI()

system_ai_ko = "당신은 인공지능 비서야, pdf 일기, 문서 요약하기, 일정 관리,
날씨, 최단 경로 검색, 웹 검색 등 다양한 내용에 답변할 수 있어야 해."
system_setting = SystemMessagePromptTemplate.from_template(system_ai_ko)

# 프롬프트 설정
voice_bot_prompt = ChatPromptTemplate.from_messages([
    system_setting,
    MessagesPlaceholder(variable_name="DUDE"),
    HumanMessagePromptTemplate.from_template("{master_user}")])

# 메모리 설정
voice_bot_memory = ConversationBufferWindowMemory(memory_key="DUDE",
                                                  ai_prefix="AI 비서 DUDE",
                                                  human_prefix="사용자:",
                                                  return_messages=True,
                                                  k=10)

# llm 모델 설정
chatgpt = ChatOpenAI(
    temperature=0,
    max_tokens=2048,
    model_name='gpt-3.5-turbo'
)

# llmchain 정의
conversation=LLMChain(
    prompt=voice_bot_prompt,
    memory=voice_bot_memory,
    llm=chatgpt,
    verbose=True
)

from pydub import AudioSegment
import numpy as np
def voice_bot_handle_audio(audio_record):
    save_file_path="voice.mp3"
    frame_rate=audio_record[0]
    audio_data=audio_record[1].tobytes()
    sample_width=audio_record[1].dtype.itemsize
    audio=AudioSegment(
        audio_data,
        frame_rate=frame_rate,
        sample_width=sample_width,
        channels=1,
    )
    audio.export(save_file_path, format="mp3")

def voice_bot_create_stt():
    file_path="voice.mp3"
    audio_file=open(file_path, "rb")
    transcript=client.audio.transcriptions.create(
        model="whisper-1",
        file=audio_file)
    return transcript.text

def voice_bot_create_audio(text):
    response=client.audio.speech.create(
        model="tts-1",
        voice="onyx",
        input=text)
    speech_file_path="output.mp3"
    with open(speech_file_path, "wb") as audio_file:
        audio_file.write(response.content)

def voice_bot_chat(message, cb_user_input_audio, chat_history):
    if cb_user_input_audio:
        message=voice_bot_create_stt()
    ai_answer=conversation({"master_user":message})['text']
    chat_history.append((message, ai_answer))
    audio_file=voice_bot_create_audio(ai_answer)
    return "", audio_file, chat_history

def voice_bot_undo(chat_history):
    if len(chat_history) > 1:
        chat_history.pop()
    return chat_history

def voice_bot_reset(chat_history):
    global voice_bot_memory
    chat_init=[[None, "안녕하세요, 인공지능 비서 DUDE 입니다. 무엇이든 시켜만 주세요."]]
    voice_bot_memory.clear() # 메모리 초기화
    return "", chat_init

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.prompts import PromptTemplate
from langchain.chains import MapReduceDocumentsChain

def pdf_loader(pdf_path):
    loader=PyPDFLoader(pdf_path)
    pdf_doc=loader.load()
    return pdf_doc

def pdf_bot_chatbot(pdf_path):
    pages_content=pdf_loader(pdf_path)
    text_splitter=RecursiveCharacterTextSplitter.from_tiktoken_encoder(
        chunk_size=3000,
        chunk_overlap=0,
    )
    # pages_content 내용 분할
    split_docs=text_splitter.split_documents(pages_content)
    # 분할된 문서의 수
    # map template 설정, {pages_content} 분할된 내용이 입력
    map_template=""" 다음은 문서 중 일부 내용입니다.
    {pages_content}
    이 문서의 주요 내용을 요약해 주세요.
    """
    # map 기본 프롬프트
    map_prompt=PromptTemplate.from_template(map_template)
    # 문서 내용이 길 수 있기 때문에 model을 gpt-3.5-turbo-16k로 설정
    llm=ChatOpenAI(temperature=0,
                   model_name='gpt-3.5-turbo-16k')
    map_chain=LLMChain(llm=llm, prompt=map_prompt)

    # reduce 단계에서 처리할 프롬프트 정의
    reduce_template="""다음은 문서 요약의 집합입니다.
    {summaries}
    이 내용을 바탕으로 통합된 문서 요약을 작성해 주세요.
    """
    # reduce 프롬프트
    reduce_prompt=PromptTemplate.from_template(reduce_template)

    # reduce에서 수행할 LLMChain 정의
    reduce_chain=LLMChain(llm=llm, prompt=reduce_prompt)
    from langchain.chains.combine_documents.stuff import StuffDocumentsChain
    from langchain.chains import ReduceDocumentsChain

    # 문서 목록 통합 체인 설정
    combine_doc_chain=StuffDocumentsChain(
        llm_chain=reduce_chain,
        document_variable_name="summaries" # reduce 프롬프트에 대입되는 변수
    )

    # 분할된 문서 순차적으로 Reduce 처리
    reduce_doc_chain=ReduceDocumentsChain(
        combine_documents_chain=combine_doc_chain,
        collapse_documents_chain=combine_doc_chain,
        token_max=4000, # 토큰 최대 개수 설정
    )

    # 최종 체인 연결
    final_chain=MapReduceDocumentsChain(
        llm_chain=map_chain, # 각 문서 맵핑
        reduce_documents_chain=reduce_doc_chain,
        document_variable_name="pages_content",
        return_intermediate_steps=False,
    )
    # 최종 결과 실행
    result_summary=final_chain.run(split_docs)
    # 요약 결과 출력
    return result_summary

system_schedule_ko="""일정 관리에 대한 사용자 입력이 주어집니다.
'schedule_type,' 'schedule_content,' 'schedule_content_detail,' 'year,'
'month,' 'day,' 'hour,' 및 'min'과 같은 구성 요소가 있습니다.
'schedule_type'은 조회, 삭제, 추가, 업데이트 중 하나일 수 있습니다.
'year,' 'month,' 'day,' 'hour,' 및 'min'에 대한 값은 숫자여야 합니다.
'schedule_content,' 'schedule_content_detail,' 'year,' 'month,' 'day,' 'hour,' 및
 'min'에 대한 입력은
json 문자열 형식으로 이루어져야 합니다."""
system_setting_schedule=SystemMessagePromptTemplate.from_template(system_schedule_ko)

# 프롬프트 설정
schedule_prompt=ChatPromptTemplate.from_messages([
    system_setting_schedule,
    MessagesPlaceholder(variable_name="DUDE_schedule"),
    HumanMessagePromptTemplate.from_template("{master_user}"),
])

# 메모리 설정
schedule_memory=ConversationBufferWindowMemory(
    memory_key="DUDE_schedule",
    ai_prefix="AI 비서 DUDE schedule",
    human_prefix="사용자",
    return_messages=True,
    k=10
)

# llm 모델 정의
chatgpt=ChatOpenAI(
    temperature=0,
    max_tokens=2048,
    model_name="gpt-3.5-turbo"
)

# llmchain 정의
conversation_schedule=LLMChain(
    llm=chatgpt, # LLM
    prompt=schedule_prompt,
    verbose=True, # True 로 설정 시 로그 출력
    memory=schedule_memory
)

# 일정 관리 excel 파일 관리
import pandas as pd
# 처음 파일 생성
initial_df=pd.DataFrame(columns=[
    "schedule_type",
    "schedule_content",
    "schedule_content_detail",
    "year",
    "month",
    "day",
    "hour",
    "min"
])
excel_file_path="schedule.xlsx"
initial_df.to_excel(excel_file_path, index=False)

def schedule_bot_save(submit_file):
    temp_excel_file=pd.read_excel(submit_file)
    temp_excel_file.to_excel(excel_file_path, index=False)

import json
def schedule_bot_chat(message, chat_history):
    answer=conversation_schedule({"master_user": message})
    ai_answer=answer['text']

    try:
        schedule_dic=json.loads(ai_answer)
        if schedule_dic["schedule_type"] == "추가":
            schedule_df=pd.read_excel(excel_file_path)
            schedule_df=pd.concat([schedule_df, pd.DataFrame([schedule_dic])],
                                  ignore_index=True)
            schedule_df.to_excel(excel_file_path, index=False)
            chat_history.append([message, f"{schedule_dic['schedule_content']}_일정이 추가되었습니다."])
        elif schedule_dic["schedule_type"] == "조회":
            schedule_df=[]
            if os.path.isfile(excel_file_path):
                schedule_df=pd.read_excel(excel_file_path)
            chat_history.append([message, "전체 일정을 말씀드리겠습니다."])

            for idx, event in schedule_df.iterrows():
                chat_history.append(
                    [None, f"{idx+1}. 일정: {event['schedule_content']}\n"
                    f"일정 설명: {event['schedule_content_detail']}\n"
                    f"일정 시간: {event['year']}년, {event['month']}월, {event['day']}일,"
                    f"{event['hour']}시, {event['min']}분"])

    except:
        chat_history.append((message, ai_answer))
    return "", chat_history # 채팅 기록 반환

import gradio as gr
with gr.Blocks() as app:
    with gr.Tab("음성 인식봇"):
        with gr.Column():
            #1
            gr.Markdown(
                value="""
                # <center>음성 인식봇</center>
                <center>AI 인공지능 비서 DUDE 입니다.
                음성으로 묻거나, 문서 요약, 일정 관리를 할 수 있습니다.</center>
                """
            )
            #2
            cb_chatbot=gr.Chatbot(
                value=[[None, "안녕하세요, 인공지능 비서 DUDE 입니다. 무엇이든 시켜만 주세요."]],
                show_label=False
            )
        with gr.Row():
            #3
            cb_user_input=gr.Textbox(
                lines=1,
                placeholder="입력 창",
                container=False,
                scale=7
            )
            #4
            cb_audio_record=gr.Audio(
                sources=["microphone"],
                format="mp3",
                scale=1,
                min_width=200,
                label="음성을 입력해 주세요."
            )
            # 음성 출력
            cb_audio_chatbot=gr.Audio(autoplay=True,
                                      visible=False)
            #5
            cb_submit_btn=gr.Button(
                value="보내기",
                scale=1,
                visible="primary",
                icon="https://cdn-icons-png.flaticon.com/128/12439/12439334.png"
            )
    # 음성 녹음 완료
        cb_audio_record.stop_recording(
            fn=voice_bot_handle_audio,
            inputs=[cb_audio_record]
        )
    # [보내기] 버튼 클릭
        cb_submit_btn.click(
            fn=voice_bot_chat,
            inputs=[cb_user_input, cb_audio_record, cb_chatbot],
            outputs=[cb_user_input, cb_audio_record, cb_chatbot]
        )
    # ENTER 제출 입력
        cb_user_input.submit(
            fn=voice_bot_chat,
            inputs=[cb_user_input, cb_audio_record, cb_chatbot],
            outputs=[cb_user_input, cb_audio_record, cb_chatbot]
        )
        with gr.Row():
            #6
            gr.Button(value="↪️되돌리기").click(
                fn=voice_bot_undo,
                inputs=[cb_chatbot],
                outputs=[cb_chatbot]
            )
            #7
            gr.Button(value="🔄️초기화").click(
                fn=voice_bot_reset,
                inputs=[cb_chatbot],
                outputs=[cb_chatbot]
            )
    with gr.Tab("문서 요약봇"):
        with gr.Row():
            #1
            gr.Markdown(
                value="""
                # <center>문서 요약봇</center>
                <center> AI 인공지능 비서 DUDE 입니다. PDF를 업로드하면 내용을 번역해 드립니다.</center>
                """
            )
        with gr.Row():
            #2
            pdf_input=gr.File()
        with gr.Row():
            #3
            summary_btn=gr.Button(value="문서 요약하기")
        with gr.Row():
            #4
            summary=gr.Textbox(
                label="PDF 요약",
                lines=8,
                placeholder="PDF 요약 내용입니다.",
            )
            summary_btn.click(
                fn=pdf_bot_chatbot,
                inputs=[pdf_input],
                outputs=[summary]
            )
    with gr.Tab("일정 관리봇"):
        with gr.Row():
            #1
            gr.Markdown(
                value="""
                # <center>일정 관리봇</center>
                <center> AI 인공지능 비서 DUDE 입니다. 일정 관리를 위한 봇입니다.</center>
                """)
        with gr.Row():
            #2
            chatbot_schedule=gr.Chatbot(
                value=[
                    [None, "안녕하세요, 일정 이름, 시간, 일정 설명으로 일정을 추가할 수 있습니다. \n\
                    예시: 크리스마스, 2024년 12월 25일 12시 00분, 올해의 크리스마스 일정 추가해 줘\n\
                    전체 일정이 보고 싶다면 전체일정 보여줘 라고 말해 주세요."],
                ],
                show_label=False                    
            )
        with gr.Row():
            #3
            msg_schedule=gr.Textbox(
                label="채팅",
                lines=1,
                placeholder="채팅 입력 창",
                scale=8,
            )
            #4
            cb_schedule_submit_btn=gr.Button(
                value="보내기",
                scale=2,
                visible="primary",
            )
            cb_schedule_submit_btn.click(
                fn=schedule_bot_chat,
                inputs=[msg_schedule, chatbot_schedule],
                outputs=[msg_schedule, chatbot_schedule]
            )
            msg_schedule.submit(
                fn=schedule_bot_chat,
                inputs=[msg_schedule, chatbot_schedule],
                outputs=[msg_schedule, chatbot_schedule]
            )
            schedule_file.change(
                fn=schedule_bot_save,
                inputs=[schedule_file]
            )
        with gr.Row():
            #5
            schedule_file=gr.File(
                label="일정 파일을 업로드해 주세요.",
                scale=8,
                visible="primary",
                height=100
            )
            
app.launch()

 


다음 내용

 


[출처]

Hey, 파이썬! 생성형 AI 활용 앱 만들어줘

728x90
반응형