Bộ nhớ LLM
Hầu hết các ứng dụng dựa trên LLM đều có giao diện trò chuyện tương tự như WeChat. Một chức năng quan trọng của quá trình giao tiếp AI là khả năng tham chiếu thông tin đã nói trước đó trong cuộc trò chuyện, giống như quá trình trò chuyện của con người, mà không cần phải lặp lại nội dung trước đó. Con người sẽ tự động gọi lại thông tin lịch sử.
Khả năng lưu trữ thông tin trò chuyện lịch sử trong lĩnh vực LLM thường được gọi là "Bộ nhớ", giống như con người có khả năng ghi nhớ. LangChain đóng gói các thành phần chức năng bộ nhớ khác nhau, có thể được sử dụng một cách độc lập hoặc tích hợp mượt mà vào chuỗi.
Các thành phần bộ nhớ cần phải thực hiện hai hoạt động cơ bản: đọc và viết.
Đối với các thành phần nhiệm vụ chuỗi khác nhau của LangChain, nếu bạn kích hoạt chức năng Bộ nhớ, nó sẽ thực hiện logic tương tự như sau:
- Khi nhận được thông tin người dùng ban đầu, nhiệm vụ chuỗi sẽ cố gắng truy vấn thông tin lịch sử liên quan từ thành phần bộ nhớ, sau đó nối thông tin lịch sử và đầu vào của người dùng thành câu hỏi để truyền cho LLM.
- Khi nhận được nội dung trả về từ LLM, nó sẽ tự động lưu kết quả vào thành phần bộ nhớ để dễ dàng truy vấn lần sau.
Quá trình triển khai khả năng bộ nhớ trong LangChain được thể hiện trong biểu đồ dưới đây:
Tích hợp Các Thành Phần Bộ Nhớ vào Hệ Thống
Trước khi sử dụng các thành phần bộ nhớ, bạn cần xem xét hai câu hỏi sau:
- Làm thế nào để lưu trữ dữ liệu tin nhắn lịch sử
- Làm thế nào để truy vấn dữ liệu tin nhắn lịch sử
Lưu trữ: Danh Sách Tin Nhắn Trò Chuyện
Nếu sử dụng mô hình Trò chuyện, dữ liệu cuộc trò chuyện là một danh sách các tin nhắn trò chuyện. LangChain hỗ trợ các công cụ lưu trữ khác nhau để lưu trữ dữ liệu tin nhắn lịch sử, với phương pháp đơn giản nhất là lưu trữ chúng trong bộ nhớ. Trong thực tế, phương pháp phổ biến nhất là lưu trữ chúng trong cơ sở dữ liệu.
Truy Vấn: Làm thế nào để Truy Vấn Tin Nhắn Trò Chuyện Lịch Sử Liên Quan
Để triển khai khả năng bộ nhớ của LLM, cốt lõi là nối nội dung tin nhắn lịch sử vào thông tin nền thành các câu hỏi. Như vậy, LLM có thể tham khảo thông tin nền khi trả lời câu hỏi.
Lưu trữ dữ liệu tin nhắn lịch sử tương đối dễ dàng, và một khía cạnh khó khăn hơn là làm thế nào để truy vấn các tin nhắn lịch sử liên quan đến nội dung trò chuyện hiện tại. Lý do chính là cần phải truy vấn các tin nhắn lịch sử liên quan đến cuộc trò chuyện hiện tại là do giới hạn mã thông tin tối đa của LLM; chúng ta không thể chất đầy toàn bộ nội dung trò chuyện lịch sử vào các câu hỏi để cung cấp cho AI.
Các chiến lược truy vấn tin nhắn lịch sử phổ biến bao gồm:
- Chỉ truy vấn N tin nhắn gần đây nhất làm thông tin nền cho các câu hỏi
- Sử dụng trí tuệ nhân tạo để tóm tắt tin nhắn lịch sử, với bản tóm tắt phục vụ làm thông tin nền cho câu hỏi
- Tận dụng cơ sở dữ liệu vector để truy vấn các tin nhắn lịch sử tương tự với cuộc trò chuyện hiện tại làm thông tin nền cho các câu hỏi
Ví dụ về việc sử dụng Thành Phần LangChain
Hãy xem xét mẫu sử dụng thành phần Bộ nhớ trong LangChain. Ở đây, chúng ta sẽ giới thiệu kiến thức cơ bản về tương tác với thành phần Bộ nhớ.
Trước hết, hãy xem cách sử dụng ConversationBufferMemory trong chuỗi nhiệm vụ. ConversationBufferMemory là một thành phần bộ nhớ rất đơn giản chỉ có thể lưu trữ một danh sách các tin nhắn trò chuyện trong bộ nhớ và chuyển chúng đến mẫu câu hỏi trò chuyện mới.
from langchain.memory import ConversationBufferMemory
bộ_nhớ = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")
- Lưu ý: LangChain cung cấp các thành phần Bộ nhớ khác nhau với cách sử dụng tương tự.
Tiếp theo, hãy xem cách sử dụng thành phần Bộ nhớ trong chuỗi. Dưới đây, chúng tôi sẽ giới thiệu cách các mô hình LLM và ChatModel, hai mô hình được đóng gói trong LangChain, sử dụng thành phần Bộ nhớ.
Ví dụ về LLM sử dụng thành phần Bộ nhớ
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
llm = OpenAI(temperature=0)
template = """Bạn là một chatbot tuyệt vời đang trò chuyện với một con người.
Cuộc trò chuyện trước đó:
{chat_history}
Câu hỏi mới: {question}
Câu trả lời của AI:"""
prompt = PromptTemplate.from_template(template)
memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
conversation({"question": "hi"})
Ví dụ về ChatModel sử dụng thành phần Memory
from langchain_openai import ChatOpenAI
from langchain.prompts import (
ChatPromptTemplate,
MessagesPlaceholder,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
llm = ChatOpenAI()
prompt = ChatPromptTemplate(
messages=[
SystemMessagePromptTemplate.from_template(
"Bạn là một chatbot tốt đẹp và đang trò chuyện với một con người."
),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessagePromptTemplate.from_template("{question}")
]
)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
conversation = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
conversation({"question": "Xin chào"})