Các bạn đã thử chat chit với ChatGPT chưa? Với những ai chưa biết thì ChatGPT là một ứng dụng có khả năng trò chuyện rất giống con người trong nhiều chủ đề khác nhau. Bạn có biết cách cách áp dụng công nghệ đằng sau ChatGPT vào việc xây dựng Chatbot của riêng chúng ta không? Ví dụ như một hệ thống tự động nhận đơn hàng từ người dùng? Hãy cùng thử tìm hiểu trong bài hôm nay nhé.

Chatbot & ChatGPT

ChatBot

Chatbot (hay được biết đến là hệ thống trả lời tự động) hiện nay đã trở thành một trong những ứng dụng phổ biến nhất của AI. Ví dụ như bạn lướt Facebook mà gửi tin nhắn đến Shop nào thì khả năng cao là sẽ có Bot nói chuyện với bạn để cung cấp thông tin về sản phẩm nhận đơn đặt hàng. Hoặc bạn có thể gặp các trợ lý ảo của ngân hàng hỗ trợ người dùng với những câu hỏi thường gặp như vị trí các cây ATM, thông tin lãi suất, cách thay đổi mật khẩu, …

Ví dụ về Chatbot

ChatGPT

ChatGPT là một ứng dụng có khả năng trả lời rất giống con nguời và có một kho kiến thức trong nhiều lĩnh vực khác nhau như làm thơ, soạn nhạc và thậm chí là lập trình. ChatGPT được phát triển bởi OpenAI họ cũng đã cho ra mắt giao diện lập trình ứng dụng (Application Programing Interface - API) để tất cả mọi người có thể tận dụng được sức mạnh của ChatGPT khi xây dựng các ứng dụng khác (tất nhiên là phải trả phí).

Cách dùng OpenAI API cho Chatbot

Thực hành

Bài thực hành hôm nay sẽ dùng Chat API của OpenAI để xây dựng một ChatBot nhận đơn hàng từ người dùng.

OrderBot - Trợ lý ảo nhận đơn hàng

Cấu trúc code

Mã nguồn được dùng trong bài hôm nay được lưu tại Panda ML Github để tiện cho việc tham khảo. Cấu trúc code cụ thể như sau:

.
├── order_chatbot.py
└── utils.py
  • File order_chatbot.py là file code chính được sử dụng
  • File utils.py chứa các hàm được dùng trong order_chatbot.py

Giao diện Chatbot được xử lý bởi thư viện streamlitstreamlit-chat, để khởi động Chatbot, chúng ta có thể dùng đoạn code dưới đây:

streamlit run order_chatbot.py

Nội dung code

Nội dung chính chính của code

1
2
3
4
5
6
7
8
9
10
11
# initialize 
if 'history' not in st.session_state:
    st.session_state.history = []

# define chatbot interface
st.title('OrderBot - Trợ lý ảo nhận đơn hàng')
st.text_input('Chat với tôi', key='input_text', on_change=generate_answer)

# display chat message
for i, chat in enumerate(st.session_state.history):
    st_message(**chat, key=str(i))
  • Dòng 2 - 3: Khởi tạo biến history (st.session_state.history) để lưu cuộc trò chuyện giữa người với bot
  • Dòng 6 - 7: Thiết kế giao diện của Chatbot, đây là một giao diện đơn giản chỉ bao gồm tên của Chatbot (dòng 6) và khung chat (dòng 7)
  • Dòng 10 - 11: Đọc thông tin từ lịch sử chat từ biến history và hiển thị lên khung chat bằng hàm st_message từ streamlit-chat

Lưu ý rằng khi tạo khung chat ở dòng 7, chúng ta có biến on_change=generate_answer, điều này có nghĩa là mỗi khi có tin nhắn mới từ người dùng, hàm generate_answer được khởi động để trả lời tin nhắn đó.

1
2
3
4
5
6
7
8
9
10
11
12
def generate_answer():
    # get user message and add to chat history 
    user_message = st.session_state.input_text
    st.session_state.history.append({'message': user_message, 'is_user': True})
    # convert to OpenAI format
    messages = convert_st_chat_to_openai_format(st.session_state.history)
    messages = [{'role': 'system', 'content': BOT_SETTINGS}] + messages
    # get bot message and add to chat history
    bot_message = get_completion_from_messages(messages)
    st.session_state.history.append({'message': bot_message, 'is_user': False})
    # clear input text
    st.session_state['input_text'] = ''
  • Dòng 3 - 4: Đọc tin nhắn từ người dùng và lưu vào lịch sử chat
  • Dòng 6 - 7: Dùng hàm convert_st_chat_to_openai_format để chuyển đổi lịch sử chat sang định dạng có thể sử dụng với OpenAI API Dưới đây là ví dụ 2 định dạng của streamlit-chatOpenAI API
      streamlit-chat format                             => OpenAI format
      {'message': 'Hi', is_user: True}                  => {'role': 'user', 'content': 'Hi'}
      {'message': 'How are you today?', is_user: False} => {'role': 'assistant', 'content': 'How are you today?'}
    
  • Dòng 9 - 10: Dùng hàm get_completion_from_messages để tạo câu trả lời thông qua OpenAI API
  • Dòng 12: Xoá dòng chat của người dùng để tăng trải nghiệm chat của người dùng

Nếu các bạn để ý, bên cạnh chuyển đổi lịch sử chat sang định dạng của OpenAPI, chúng ta có gắn thêm [{‘role’: ‘system’, ‘content’: BOT_SETTINGS}] ở dòng 7. Đây chính là trái tim của Chatbot, hướng dẫn cách bot trả lời như thế nào, lấy thông tin ra sao…

BOT_SETTINGS = """

Bạn là OrderBot, trợ lý ảo hỗ trợ nhận đơn hàng cho cửa hàng quần áo PandaML Shop. \

Trước tiên bạn cần chào khách hàng, sau đó hỏi khách hàng về mẫu quần áo mà họ lựa chọn và địa chỉ để giao hàng. \

Khi có đủ thông tin, bạn tóm tắt lại và hỏi khách hàng lần nữa xem họ muốn lấy thêm mẫu nào không trước khi \

tổng hợp lại đơn hàng cùng với giá tiền để khách hàng chốt đơn. \

Nhớ rằng bạn cần phải hỏi rõ thông tin để có thể xác định được đúng mẫu quần áo mà khách hàng lựa chọn. \

Shop chúng ta có những mẫu với giá cỡ S, M, L như sau (giá tiền theo trăm nghìn Việt Nam đồng) \
A1 100, 150, 200 \
A2 100, 160, 300 \
A3 80, 100, 120 \

"""

Mã nguồn

Panda ML Github

Tạm kết

Quả thực, mình chưa bao giờ thấy việc xây dựng Chatbot lại dễ dàng đến thế với chỉ vài chục dùng code. Trước đây, để xây dựng 1 Chatbot tượng tự, bạn có thể phải xây dựng 1 loạt các quy tắc (if-else) cho các tình huống khác nhau, đồng thời xây dựng một (hoặc vài) mô hình phân loại mục đích của người dùng khi tương tác với bot. Quá trình này thì thường mất thời gian từ vài tuần đến vài tháng tuỳ theo độ phức tạp của ứng dụng Chatbot.

Với sự hỗ trợ của ChatGPT, giờ đây chúng ta có thể rút ngắn thời gian phát triển Chatbot một cách đáng kể. Mình tin là chỉ một thời gian ngắn nữa, sẽ có rất nhiều các Chatbot được xây dựng theo hướng này, chúng ta cùng chờ xem nhé :)

P/S: Còn các bạn thì sao? Các bạn có ý tưởng nào hay sử dụng ChatGPT thì cùng chia sẻ để mọi nguời tham khảo nhé.

Tham khảo

Leave a comment