[챗봇 개발기: ver1.1] gradio로 langchain 챗봇 간단하게 구현하기

JeongYun Lee·2025년 1월 7일

Chatbot

목록 보기
2/5
post-thumbnail

python으로 langchain 등을 활용해서 챗봇을 구현한 뒤, 간단하게 데모를 만들어서 공유할 때 일반적으로 streamlit 배포 어플리케이션을 많이 사용한다. 필자도 처음에는 streamlit으로 테스트 해봤는데, 이보다 더 쉬운 방법이 없을까 찾아보다 알게 된 게 gradio다.

인터넷에 gradio와 stremalit의 차이를 묻거나 설명하는 글들이 종종 있던데, gradio가 machine learning 모델을 구현하는데 더 적합하다라는 설명도 어디선가 봤지만, 둘 다 사용해보고 느낀 차이점은 커스터마이징의 정도인 것 같다. (개인적인 느낌...) streamlit이 gradio보다 더 많이 커스터마이징할 수 있는 것 같은? 이 말은 반대로 하면 그만큼 설정해줘야 할 것이 많다는 것이니 나같이 정말 간단하게 만들고 싶은 사람에게는 적합하지 않다는 의미이다.

다만, gradio는 streamlit보다 정보를 얻기가 어렵긴 했다. 다행히 공식문서가 잘 작성되어 있어서 하나씩 보면서 테스트 해봤다.

챗봇을 구현할 수 있는 방법은 block을 사용하거나 chat을 사용하거나 두 방법이 있다. 이 둘의 차이는 block은 이름 처럼 블록 단위로 모듈을 만들어서 붙일 수 있는 방법이고, chatInterface는 채팅에 최적화된 모듈이다. gradio 공식 docs에 코드와 함께 설명이 자세한 편이라 참고해서 작성했다.

blocks의 예시는 다음과 같다.

# example
with gr.Blocks(theme=gr.themes.Soft()) as demo:

    chatbot = gr.Chatbot(label="Chatbot", height=800, show_copy_button=True)
    chatbot.like(vote, None, None)
    query = gr.Textbox(label="Query") 
    query.submit(handle_submit, [query, chatbot], [query, chatbot, example_output])

    with gr.Row():
        btn = gr.Button("Generate")
        btn.click(handle_submit, inputs=[query, chatbot], outputs=[query, chatbot, example_output])

        clear_btn = gr.Button("Clear")
        clear_btn.click(clear_fields, inputs=[], outputs=[query, chatbot, example_output])

    gr.Examples(["예시1", "예시2"], inputs=[query])

demo.launch()

ChatInterface는 더 간단하게 구현이 가능하다. stream_responses는 위에서 구축한 RAG 프로세스를 실행하기 위한 함수명이다.

# example
gr.ChatInterface(
    stream_responses,
    chatbot=gr.Chatbot(),
    textbox=gr.Textbox(placeholder="", container=False, scale=7),
    title="Chat with document",
    description="Ask questions and get answers based on the provided documents.",
    theme="soft",
    examples=["예제1", "예제2"],
    cache_examples=False,
    retry_btn=None,
    undo_btn="Delete Previous",
    clear_btn="Clear",
).launch()

간단한 몇 줄 만으로 이런 인터페이스가 구현 가능하다. 추가로 flagged 버튼을 추가하면, 해당 부분의 input과 output, like/dislike를 추가한다면 그 부분까지 flagged에 csv 형태로 저장할 수 있다. 서비스가 아니라 간단한 데모라면 langsmith를 붙일 필요 없이 그 정도로도 테스트 해볼 수 있는 것이다.
.
.
.
gradio를 테스트 하면서 인터페이스를 보다 예쁘게 꾸미기는 한계가 있다고 생각했고(물론 정성을 많이 들이면 가능함) 커스터마이징을 하기 위해서 이것 저것 붙이는 것이 다소 어렵다고 생각해서 이것 저것 계속 찾다가 Chainlit도 테스트 해보았다. 이와 관려한 내용은 다음 글에 작성해보겠다.

profile
궁금한 건 많지만, 천천히 알아가는 중입니다

0개의 댓글