Xây dựng chatbot có khả năng mở rộng và nhận thức ngữ cảnh với Amazon DynamoDB, Amazon Bedrock và LangChain

Mục lục:

  1. Sự quan trọng của nhận thức ngữ cảnh trong chatbot
  2. DynamoDB với LangChain cho lịch sử trò chuyện
  3. Tổng quan về giải pháp
  4. Thiết lập lịch sử trò chuyện DynamoDB
  5. Tạo mẫu lời nhắc trò chuyện
  6. Tích hợp Amazon Bedrock với LangChain
  7. Quản lý ngữ cảnh qua các tương tác
  8. Kiểm tra tích hợp
  9. Tạo UI với Streamlit
  10. Tóm tắt

1. Sự quan trọng của nhận thức ngữ cảnh trong chatbot

Chatbot được kỳ vọng không chỉ hiểu các truy vấn tức thời mà còn hiểu được ngữ cảnh của cuộc trò chuyện đang diễn ra. Đối với các nhà phát triển, thử thách nằm ở việc tạo ra chatbot có thể mở rộng một cách liền mạch trong khi vẫn duy trì lịch sử trò chuyện qua nhiều phiên. Amazon DynamoDB, Amazon Bedrock và LangChain có thể cung cấp một sự kết hợp mạnh mẽ để xây dựng chatbot mạnh mẽ và nhận thức ngữ cảnh.

Bài viết này khám phá cách sử dụng LangChain với DynamoDB để quản lý lịch sử trò chuyện và tích hợp với Amazon Bedrock để cung cấp các phản hồi thông minh và có ngữ cảnh. Bài viết sẽ phân tích các khái niệm đằng sau trình kết nối trò chuyện DynamoDB trong LangChain, thảo luận về lợi thế của cách tiếp cận này và hướng dẫn bạn qua các bước cần thiết để triển khai nó trong chatbot của riêng bạn.

2. DynamoDB với LangChain cho lịch sử trò chuyện

Bạn có thể hưởng lợi từ các lợi thế chính sau đây khi sử dụng DynamoDB với LangChain để quản lý lịch sử trò chuyện:

  • Cải thiện trải nghiệm người dùng: Bằng cách sử dụng DynamoDB cho lịch sử trò chuyện, chatbot của bạn có thể mang đến trải nghiệm nhất quán và cá nhân hóa. Người dùng có thể tiếp tục cuộc trò chuyện từ nơi họ đã dừng lại, và chatbot có thể sử dụng các tương tác trước đó để thông báo cho các phản hồi của mình.
  • Tích hợp liền mạch: LangChain cung cấp một cách liền mạch để tích hợp với DynamoDB, cho phép bạn lưu trữ và truy xuất các tin nhắn trò chuyện với chi phí tối thiểu. Bằng cách sử dụng lớp DynamoDBChatMessageHistory của LangChain, bạn có thể tự động quản lý lịch sử trò chuyện như một phần của luồng trò chuyện, cho phép chatbot duy trì ngữ cảnh theo thời gian.
  • Mở rộng khả năng: Khi xây dựng chatbot tương tác với hàng nghìn hoặc thậm chí hàng triệu người dùng, việc quản lý ngữ cảnh trở thành một vấn đề không tầm thường. Khả năng mở rộng của DynamoDB có nghĩa là chatbot của bạn có thể lưu trữ và truy xuất lịch sử trò chuyện trong thời gian thực, bất kể có bao nhiêu người dùng đang tương tác với nó cùng lúc.

3. Tổng quan về giải pháp

LangChain là một khung được thiết kế để đơn giản hóa việc tạo và quản lý các ứng dụng mô hình ngôn ngữ nâng cao, đặc biệt là những ứng dụng yêu cầu liên kết nhiều thành phần với nhau, chẳng hạn như lưu trữ dữ liệu, mẫu lời nhắc và mô hình ngôn ngữ. Nó cho phép bạn xây dựng chatbot nhận thức ngữ cảnh bằng cách cung cấp các công cụ để tích hợp liền mạch các hệ thống back-end khác nhau như DynamoDB để lưu trữ lịch sử trò chuyện và Bedrock để tạo ra các phản hồi thông minh.

Sự tích hợp DynamoDB tập trung vào lớp DynamoDBChatMessageHistory, lớp này trừu tượng hóa các phức tạp của việc lưu trữ và truy xuất lịch sử trò chuyện từ DynamoDB. Trong các phần tiếp theo, chúng ta sẽ phân tích các thành phần chính để thiết lập chatbot và các bước để tạo UI.

4. Thiết lập lịch sử trò chuyện DynamoDB

Lớp DynamoDBChatMessageHistory được cung cấp bởi LangChain được tạo với một bảng nhất định (để lưu trữ dữ liệu) và phiên (xác định phiên lịch sử trò chuyện này). Lớp này cung cấp một giao diện để lưu trữ và truy xuất các tin nhắn trong DynamoDB, sử dụng ID phiên làm khóa để xác định lịch sử trò chuyện của mỗi người dùng:

from langchain_community.chat_message_histories import DynamoDBChatMessageHistory

Khởi tạo lịch sử tin nhắn trò chuyện DynamoDB

history = DynamoDBChatMessageHistory( table_name="SessionTable", session_id="user123" )

Các cuộc trò chuyện hiện được lưu trữ trong bảng DynamoDB của chúng ta, được sắp xếp theo khóa phân vùng session_id (chẳng hạn như user123). Lịch sử trò chuyện, cùng với siêu dữ liệu có liên quan, được quản lý hiệu quả trong thuộc tính History, do đó tất cả các tương tác trước đó đều dễ dàng truy cập.

5. Tạo mẫu lời nhắc trò chuyện

Để sử dụng lịch sử, chúng ta cần điều chỉnh lời nhắc được đưa cho mô hình AI và LangChain có ChatPromptTemplate dành cho điều này. Mẫu sau đây chỉ dẫn cách chatbot sẽ sử dụng lịch sử trò chuyện được lưu trữ để tạo phản hồi:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

Tạo mẫu lời nhắc trò chuyện

prompt_template = ChatPromptTemplate.from_messages( [ ("system", "Bạn là một trợ lý hữu ích."), MessagesPlaceholder(variable_name="history"), ("human", "{question}"), ] )

MessagesPlaceholder cho phép LangChain tiêm toàn bộ lịch sử trò chuyện, bao gồm cả câu hỏi và câu trả lời, vào lời nhắc một cách động. Điều này cho phép mô hình xem xét toàn bộ ngữ cảnh của tương tác, thay vì chỉ tin nhắn gần đây nhất. Nó duy trì một luồng đệ quy, trong đó mỗi lời nhắc mới bao gồm toàn bộ lịch sử của các trao đổi trước đó. Điều này đảm bảo rằng các phản hồi của chatbot được thông báo đầy đủ bởi tất cả các tương tác trước đó, tạo ra một cuộc trò chuyện nhận thức ngữ cảnh.

6. Tích hợp Amazon Bedrock với LangChain

Với lịch sử trò chuyện và mẫu lời nhắc được thiết lập, bước tiếp theo là tích hợp mô hình ngôn ngữ Amazon Bedrock. Mô hình này tạo ra các phản hồi dựa trên mẫu lời nhắc và lịch sử trò chuyện được lưu trữ trong DynamoDB:

from langchain_aws import ChatBedrockConverse
from langchain_core.output_parsers import StrOutputParser

Khởi tạo mô hình Bedrock

model = ChatBedrockConverse( model="anthropic.claude-3-haiku-20240307-v1:0", # Chỉ định mô hình Bedrock max_tokens=2048, temperature=0.0, top_p=1, stop_sequences=["\n\nHuman"], verbose=True )

Kết hợp lời nhắc với LLM Bedrock

chain = prompt_template | model | StrOutputParser()

LangChain cho phép bạn dễ dàng liên kết các thành phần khác nhau với nhau. Ở đây, mẫu lời nhắc, mô hình Amazon Bedrock và trình phân tích đầu ra được liên kết với nhau để tạo ra một đường dẫn xử lý đầu vào của người dùng và tạo ra các phản hồi thông minh, nhận thức ngữ cảnh.

7. Quản lý ngữ cảnh qua các tương tác

Để duy trì ngữ cảnh qua các tương tác, chúng ta sử dụng lớp RunnableWithMessageHistory của LangChain. Lớp này đảm bảo rằng mỗi tương tác với chatbot được thông báo bởi toàn bộ lịch sử trò chuyện được lưu trữ trong DynamoDB:

from langchain_core.runnables.history import RunnableWithMessageHistory

Tích hợp với lịch sử tin nhắn

chain_with_history = RunnableWithMessageHistory( chain, lambda session_id: history # Tham chiếu DynamoDBChatMessageHistory input_messages_key="question", history_messages_key="history", )

Lớp RunnableWithMessageHistory đảm bảo rằng mỗi khi người dùng tương tác với chatbot, toàn bộ lịch sử trò chuyện được truy xuất, được chuyển qua mô hình và được cập nhật trong DynamoDB. Điều này khiến chatbot có khả năng ghi nhớ các tương tác trước đó và cung cấp các phản hồi có liên quan về ngữ cảnh.

8. Kiểm tra tích hợp

Cuối cùng, chúng ta có thể kiểm tra chatbot bằng cách mô phỏng một cuộc trò chuyện và quan sát cách nó sử dụng lịch sử được lưu trữ để tạo phản hồi:

config = {"configurable": {"session_id": "user123"}}

response = chain_with_history.invoke({"question": "Xin chào! Tôi là Bob"}, config=config) print(response)

“Rất vui được gặp bạn, Bob! Tôi là trợ lý AI được tạo bởi Anthropic. Tôi ở đây để giúp bạn với bất kỳ câu hỏi hoặc nhiệm vụ nào bạn có thể có. Hãy cho tôi biết nếu có điều gì tôi có thể hỗ trợ bạn.”

response = chain_with_history.invoke({"question": "Tên tôi là gì?"}, config=config)
print(response)

“Tên của bạn là Bob, như bạn đã giới thiệu bản thân với tôi trước đó.”

Bằng cách mô phỏng một cuộc trò chuyện, bạn có thể thấy cách chatbot ghi nhớ các tương tác trước đó và sử dụng chúng để tạo ra các phản hồi nhận thức ngữ cảnh. Điều này chứng minh hiệu quả của việc sử dụng DynamoDB để quản lý lịch sử trò chuyện.

9. Tạo UI với Streamlit

Bây giờ chúng ta đã hiểu cách LangChain tương tác với DynamoDB và Bedrock, hãy kết hợp tất cả lại với nhau và bọc nó bằng một GUI để kiểm tra. Chúng ta sẽ sử dụng Streamlit để tạo một GUI web.

Streamlit là một khung ứng dụng mã nguồn mở cho phép bạn xây dựng và triển khai các ứng dụng web chỉ với một vài dòng mã Python. Nó đặc biệt hữu ích để tạo mẫu và kiểm tra các ứng dụng AI, vì nó cho phép bạn nhanh chóng tạo ra các giao diện tương tác mà không yêu cầu kỹ năng phát triển frontend rộng rãi.

Hãy khám phá một ví dụ về cách bạn có thể thiết lập một ứng dụng Streamlit để tương tác với chatbot được hỗ trợ bởi Amazon Bedrock của bạn. Mã sau đây nên được lưu trữ trong một tệp có tên app.py:

import boto3
import logging
import streamlit as st
from langchain_community.chat_message_histories import DynamoDBChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.output_parsers import StrOutputParser
from langchain_aws import ChatBedrockConverse
client = boto3.client('sts')
logging.basicConfig(level=logging.CRITICAL)

def get_iam_user_id(): # Lấy danh tính người gọi identity = client.get_caller_identity()

# Trích xuất và trả về ID người dùng
user_id = identity['UserId']
return user_id

Tạo mô hình bedrock

model = ChatBedrockConverse( model="anthropic.claude-3-haiku-20240307-v1:0", max_tokens=2048, temperature=0.0, top_p=1, stop_sequences=["\n\nHuman"], verbose=True )

Khởi tạo lịch sử tin nhắn trò chuyện DynamoDB

table_name = "SessionTable" session_id = get_iam_user_id() # Bạn có thể làm cho điều này động dựa trên phiên của người dùng history = DynamoDBChatMessageHistory(table_name=table_name, session_id=session_id)

Tạo mẫu lời nhắc trò chuyện

prompt_template = ChatPromptTemplate.from_messages( [ ("system", "Bạn là một trợ lý hữu ích."), MessagesPlaceholder(variable_name="history"), ("human", "{question}"), ] )

Kết hợp lời nhắc với LLM Bedrock

chain = prompt_template | model | StrOutputParser()

Tích hợp với lịch sử tin nhắn

chain_with_history = RunnableWithMessageHistory( chain, lambda session_id: DynamoDBChatMessageHistory( table_name=table_name, session_id=session_id ), input_messages_key="question", history_messages_key="history", )

st.title("LangChain DynamoDB Bot")

Tải các tin nhắn từ DynamoDB và điền vào lịch sử trò chuyện

if "messages" not in st.session_state: st.session_state.messages = []

# Tải các tin nhắn được lưu trữ từ DynamoDB
stored_messages = history.messages # Truy xuất tất cả các tin nhắn được lưu trữ

# Điền vào trạng thái phiên với các tin nhắn được truy xuất
for msg in stored_messages:
    role = "user" if msg.__class__.__name__ == "HumanMessage" else "assistant"
    st.session_state.messages.append({"role": role, "content": msg.content})

Hiển thị các tin nhắn trò chuyện từ lịch sử khi chạy lại ứng dụng

for message in st.session_state.messages: with st.chat_message(message["role"]): st.markdown(message["content"])

Phản hồi đầu vào của người dùng

if prompt := st.chat_input("Bạn muốn gì?"): # Hiển thị tin nhắn của người dùng trong vùng chứa tin nhắn trò chuyện with st.chat_message("user"): st.markdown(prompt) # Thêm tin nhắn của người dùng vào lịch sử trò chuyện st.session_state.messages.append({"role": "user", "content": prompt})

# Tạo phản hồi của trợ lý bằng cách sử dụng Bedrock LLM và LangChain
config = {"configurable": {"session_id": session_id}}
response = chain_with_history.invoke({"question": prompt}, config=config)

# Hiển thị phản hồi của trợ lý trong vùng chứa tin nhắn trò chuyện
with st.chat_message("assistant"):
    st.markdown(response)
# Thêm phản hồi của trợ lý vào lịch sử trò chuyện
st.session_state.messages.append({"role": "assistant", "content": response})

Để chạy ứng dụng, hãy mở terminal của bạn (Linux/macOS) hoặc Command Prompt/PowerShell (Windows) và chạy lệnh sau:

streamlit run app.py

Đầu ra cung cấp cho bạn URL để truy cập ứng dụng Streamlit của bạn:

Bây giờ bạn có thể xem ứng dụng Streamlit của mình trong trình duyệt của bạn.

  Local URL: http://localhost:8501
  Network URL: http://<private ip address>:8501
  External URL: http://<public ip address>:8501

Ứng dụng Streamlit cho phép người dùng tương tác với chatbot trong thời gian thực, với toàn bộ lịch sử trò chuyện được hiển thị trên trang. Thiết lập này giúp đơn giản hóa việc kiểm tra khả năng của chatbot để duy trì ngữ cảnh qua nhiều tương tác của người dùng.

Sơ đồ luồng sau đây minh họa tương tác giữa các thành phần khác nhau để mang đến trải nghiệm chatbot nhận thức ngữ cảnh đầy đủ.

10. Tóm tắt

DynamoDB, kết hợp với Amazon Bedrock, cung cấp một giải pháp mạnh mẽ, có khả năng mở rộng để xây dựng chatbot có thể ghi nhớ và sử dụng lịch sử trò chuyện. Bằng cách lưu trữ lịch sử trò chuyện trong DynamoDB, chatbot của bạn có thể duy trì ngữ cảnh qua các phiên, cho phép tương tác tự nhiên và hấp dẫn hơn với người dùng. Và với Streamlit, bạn có thể nhanh chóng tạo mẫu và kiểm tra chatbot của mình, đưa tầm nhìn AI trò chuyện của bạn thành hiện thực trong thời gian ngắn.

Bạn đã sẵn sàng bắt đầu? Khám phá bộ sưu tập đầy đủ các ví dụ về chatbot DynamoDB và Amazon Bedrock trong kho lưu trữ GitHub sau đây và bắt đầu xây dựng chatbot thông minh hơn, phản hồi nhanh hơn ngay hôm nay!

Logo

0 comments Blogger 0 Facebook

Đăng nhận xét

 
Agent.ai.vn © 2024 - Nắm bắt tương lai
Top