Bài 36.1: Giới thiệu LangChain và use cases

Bài 36.1: Giới thiệu LangChain và use cases
Chào mừng trở lại với series lập trình web của chúng ta! Trong những bài gần đây, chúng ta đã bắt đầu hé mở cánh cửa sang thế giới AI và cách nó giao thoa với lập trình web hiện đại. Nếu như các Large Language Models (LLMs) như GPT của OpenAI, hay các mô hình từ Google, Anthropic... là những "bộ não" kỳ diệu có khả năng hiểu và tạo ra văn bản, thì câu hỏi lớn đặt ra là: Làm thế nào để chúng ta kết nối những bộ não này với thế giới thực, với dữ liệu của chúng ta, và xây dựng nên những ứng dụng AI thực sự hữu ích?
Đây chính là lúc LangChain tỏa sáng. Hãy cùng tìm hiểu framework mạnh mẽ này là gì và nó mang lại những khả năng đột phá nào cho chúng ta.
LangChain là gì? Tại sao chúng ta cần nó?
Hãy tưởng tượng bạn có một mô hình LLM cực kỳ thông minh. Nó có thể trả lời câu hỏi, viết code, sáng tác thơ... nhưng nó có một số hạn chế cố hữu:
- Kiến thức giới hạn: Nó chỉ biết những gì đã được huấn luyện đến một thời điểm nhất định. Nó không biết về dữ liệu cá nhân của bạn, tài liệu nội bộ của công ty bạn, hay thông tin mới nhất trên internet.
- Thiếu trạng thái (Stateless): Mỗi lần tương tác là một phiên mới. Nó không nhớ cuộc trò chuyện trước đó nếu không được cung cấp lại toàn bộ ngữ cảnh.
- Không có khả năng sử dụng công cụ: Nó không thể tự tìm kiếm thông tin trên web, tính toán, hay tương tác với các API bên ngoài.
- Khó xây dựng luồng phức tạp: Để giải quyết một tác vụ phức tạp (ví dụ: đọc tài liệu, tóm tắt, sau đó gửi email), bạn cần kết hợp nhiều bước gọi LLM và xử lý dữ liệu trung gian. Việc này có thể trở nên rất lộn xộn.
LangChain ra đời để giải quyết những vấn đề này. Nó không phải là một mô hình LLM khác, mà là một framework mã nguồn mở được thiết kế để giúp bạn xây dựng các ứng dụng dựa trên LLMs một cách có cấu trúc và hiệu quả. LangChain cung cấp các thành phần trừu tượng (abstractions) và các chuỗi (chains) sẵn có để dễ dàng:
- Kết nối LLMs với nguồn dữ liệu bên ngoài (tài liệu, database, API...).
- Cho LLMs khả năng "ghi nhớ" trạng thái hội thoại.
- Cho phép LLMs sử dụng các "công cụ" (tools) để tương tác với môi trường (web search, tính toán...).
- Tạo ra các luồng xử lý phức tạp gồm nhiều bước sử dụng LLM và các thành phần khác.
Nói cách khác, LangChain giúp bạn biến các LLMs từ "bộ não" độc lập thành một phần tích hợp trong hệ thống ứng dụng của bạn. Nó là "keo dán" giúp kết nối LLMs với "thế giới thực".
LangChain hỗ trợ cả hai ngôn ngữ phổ biến là Python và JavaScript (LangChain.js), rất tiện lợi cho lập trình viên web, đặc biệt là những người dùng Node.js ở backend hoặc thậm chí là các ứng dụng edge/client-side nhất định (mặc dù phần lớn use case mạnh mẽ sẽ chạy ở backend).
Các Khái Niệm Chính trong LangChain
Để hiểu cách LangChain hoạt động, chúng ta cần làm quen với các thành phần cốt lõi của nó:
Models: Đây là giao diện để tương tác với các mô hình ngôn ngữ. LangChain hỗ trợ nhiều loại:
- LLMs: Các mô hình text completion cổ điển (nhận text -> trả về text).
- Chat Models: Các mô hình được điều chỉnh cho hội thoại (nhận danh sách tin nhắn -> trả về tin nhắn phản hồi).
- Embedding Models: Các mô hình biến văn bản thành vector số, hữu ích cho tìm kiếm ngữ nghĩa, phân cụm...
- Ví dụ đơn giản gọi một Chat Model (sử dụng OpenAI, cần cài đặt thư viện và có API key):
from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage # Khởi tạo Chat Model chat = ChatOpenAI(model="gpt-4o", temperature=0) # temperature=0 làm cho kết quả ít ngẫu nhiên # Gọi model với một tin nhắn response = chat.invoke([HumanMessage(content="Hãy cho tôi biết 3 lợi ích của việc học lập trình web.")]) print(response.content)
Giải thích: Đoạn code này tạo một instance của
ChatOpenAI
(giao diện cho GPT-4o qua LangChain), sau đó gọi phương thứcinvoke
với một danh sách các tin nhắn (ở đây chỉ có 1HumanMessage
).chat.invoke
sẽ gửi tin nhắn này đến API của OpenAI và trả về phản hồi.Prompts: Đây là cách bạn định dạng đầu vào cho LLMs. LangChain cung cấp các công cụ để quản lý và tạo động các prompt.
- Prompt Templates: Các template có thể điền biến vào.
- Output Parsers: Giúp cấu trúc đầu ra của LLM thành các format mong muốn (ví dụ: JSON, list...).
- Ví dụ sử dụng Prompt Template:
from langchain_core.prompts import ChatPromptTemplate # Định nghĩa một template cho prompt prompt = ChatPromptTemplate.from_messages([ ("system", "Bạn là một trợ lý AI chuyên nghiệp và thân thiện."), ("user", "Hãy viết một đoạn giới thiệu ngắn về chủ đề: {topic}") ]) # Tạo prompt hoàn chỉnh từ template và biến formatted_prompt = prompt.format(topic="Học LangChain") print(formatted_prompt)
Giải thích:
ChatPromptTemplate
cho phép định nghĩa cấu trúc của prompt gồm các vai trò (system, user, assistant).format
là phương thức điền giá trị của biến{topic}
vào template. Kết quả trả về là prompt sẵn sàng gửi đến Chat Model.Indexes: Giúp cấu trúc tài liệu và sử dụng LLMs để tương tác với chúng. Đây là nền tảng của kỹ thuật Retrieval Augmented Generation (RAG). Quy trình thường gồm:
- Document Loaders: Tải dữ liệu từ nhiều nguồn (file PDF, trang web, database...).
- Text Splitters: Chia văn bản lớn thành các phần nhỏ hơn để phù hợp với cửa sổ ngữ cảnh của LLM.
- Vector Stores: Lưu trữ và tìm kiếm các vector embedding của các đoạn văn bản.
- Retrievers: Lấy các đoạn văn bản liên quan nhất đến một truy vấn.
- Không code minh họa đầy đủ cho phần này vì khá dài, nhưng hãy hiểu đây là cách bạn cho LLM truy cập và "đọc" dữ liệu bên ngoài.
Chains: Các chuỗi kết hợp nhiều thành phần lại với nhau để thực hiện một tác vụ cụ thể.
- Ví dụ đơn giản về một LLMChain (kết hợp Prompt Template và LLM):
from langchain_core.prompts import PromptTemplate from langchain_openai import OpenAI from langchain.chains import LLMChain # Sử dụng LLM cổ điển llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0.9) # Tạo prompt template prompt = PromptTemplate.from_template("Hãy viết một câu chuyện ngắn về {animal} là nhân vật chính.") # Kết hợp prompt và LLM thành một Chain chain = LLMChain(llm=llm, prompt=prompt) # Chạy Chain story = chain.invoke({"animal": "một chú chó nhỏ"}) print(story)
Giải thích:
LLMChain
nối output củaPromptTemplate
với input củaLLM
. Khi bạn chạychain.invoke
, nó sẽ format prompt với biếnanimal="một chú chó nhỏ"
, gửi prompt đó đến mô hình OpenAI, và trả về kết quả từ mô hình.Agents: Đây là các hệ thống phức tạp hơn cho phép LLM sử dụng "công cụ" dựa trên suy luận. Agent quyết định bước tiếp theo nên làm gì, dựa vào kết quả của các bước trước đó.
- Ví dụ Agent sử dụng công cụ tìm kiếm (cần cài đặt thêm
langchain-community
vàduckduckgo-search
):
from langchain.agents import load_tools, initialize_agent, AgentType from langchain_openai import OpenAI # Khởi tạo LLM llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0) # Load các công cụ (ví dụ: tìm kiếm) tools = load_tools(["ddg-search"], llm=llm) # ddg-search là công cụ tìm kiếm DuckDuckGo # Khởi tạo Agent agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # Chạy Agent với một yêu cầu phức tạp agent.invoke("Ai là tổng thống hiện tại của Việt Nam và ông ấy sinh năm bao nhiêu?")
Giải thích: Agent này được cung cấp công cụ tìm kiếm. Khi nhận yêu cầu, LLM bên trong Agent sẽ suy luận (nhờ
verbose=True
bạn có thể thấy quá trình suy luận) rằng nó cần dùng công cụ tìm kiếm để tìm thông tin. Nó sẽ gọi công cụ, nhận kết quả, và sử dụng kết quả đó để trả lời câu hỏi ban đầu. Agent rất mạnh mẽ cho các tác vụ cần nhiều bước và tương tác với thế giới bên ngoài.- Ví dụ Agent sử dụng công cụ tìm kiếm (cần cài đặt thêm
Memory: Cho phép Chains hoặc Agents nhớ các tương tác trước đó trong một phiên hội thoại. Có nhiều loại memory khác nhau (Buffer Memory, Summary Memory...).
Các Use Cases Điển Hình của LangChain trong Phát triển Ứng dụng AI
Với các thành phần và khái niệm trên, LangChain mở ra cánh cửa cho vô số ứng dụng AI mạnh mẽ. Dưới đây là một số use cases phổ biến và cách chúng có thể liên quan đến lập trình web:
Hệ thống Hỏi & Đáp trên Dữ liệu Riêng (RAG - Retrieval Augmented Generation):
- Đây là use case quan trọng nhất. Bạn có tài liệu PDF, file Word, trang web, dữ liệu trong database...? LangChain giúp bạn nạp dữ liệu đó, xử lý (chia nhỏ, tạo embedding), lưu trữ vào Vector Store (ví dụ: Chroma, Pinecone, Weaviate...), và sau đó, khi người dùng hỏi một câu hỏi, LangChain sẽ tìm các đoạn dữ liệu liên quan nhất (Retrieval) và đưa chúng vào prompt để LLM trả lời câu hỏi dựa trên chính dữ liệu của bạn (Generation).
- Ứng dụng web: Xây dựng chatbot nội bộ trả lời câu hỏi về quy trình công ty dựa trên handbook, tạo công cụ tìm kiếm nâng cao trên website sản phẩm dựa trên mô tả chi tiết, tạo AI trợ lý cho khách hàng dựa trên FAQ và tài liệu hỗ trợ.
Chatbots có Khả năng Ghi Nhớ (Stateful Chatbots):
- Các LLM nguyên bản không nhớ lịch sử trò chuyện. LangChain thêm "memory" vào các Chain hoặc Agent, cho phép chatbot duy trì ngữ cảnh qua nhiều lượt tương tác.
- Ứng dụng web: Xây dựng chatbot hỗ trợ khách hàng có thể theo dõi yêu cầu qua nhiều câu hỏi, tạo trợ lý ảo có thể nhớ sở thích hoặc thông tin người dùng đã cung cấp trước đó trong phiên.
Agent Thông Minh Thực Hiện Tác Vụ Phức Tạp:
- Agent có thể sử dụng nhiều công cụ để thực hiện các yêu cầu phức tạp. Ví dụ: tìm kiếm thông tin trên web, đọc nội dung trang web, tính toán, gọi API...
- Ứng dụng web: Xây dựng tính năng "trợ lý nghiên cứu" có thể tìm thông tin về sản phẩm cạnh tranh, tạo AI có thể tự động điền form đơn giản sau khi thu thập thông tin, tạo bot điều khiển các chức năng khác của ứng dụng.
Xử lý và Trích xuất Thông tin từ Văn bản:
- Sử dụng LangChain để tạo các Chain hoặc Agent có khả năng tóm tắt văn bản dài, trích xuất thông tin cấu trúc (tên, địa chỉ, sản phẩm...) từ văn bản tự do (ví dụ: email khách hàng, phản hồi khảo sát), phân loại văn bản theo chủ đề.
- Ứng dụng web: Xây dựng dashboard phân tích phản hồi người dùng tự động, tạo tính năng tóm tắt bài viết hoặc báo cáo, tự động phân loại yêu cầu hỗ trợ khách hàng.
Kết nối LLMs với Database hoặc API:
- LangChain cung cấp các công cụ và Agent đặc biệt để cho phép LLM tương tác với SQL database (chuyển câu hỏi tiếng người thành SQL query) hoặc gọi các API web.
- Ứng dụng web: Tạo giao diện ngôn ngữ tự nhiên để truy vấn dữ liệu trong ứng dụng, cho phép AI thực hiện các hành động thông qua API (ví dụ: đặt hàng, gửi tin nhắn, cập nhật thông tin người dùng) dựa trên yêu cầu của người dùng.
LangChain & Frontend: Chúng Kết Nối Thế Nào?
Là lập trình viên frontend, bạn có thể tự hỏi: Tôi sẽ dùng LangChain ở đâu? LangChain mạnh mẽ nhất khi chạy ở backend. Ứng dụng web frontend của bạn (React, Next.js...) sẽ tương tác với một backend service (ví dụ: Node.js với Express/Next.js API Routes hoặc Python với Flask/Django/FastAPI) và backend service đó mới là nơi sử dụng LangChain để gọi LLM, xử lý dữ liệu, tương tác với database...
Mô hình tương tác sẽ là:
- Người dùng nhập yêu cầu vào giao diện frontend (ví dụ: trong một ô chat, một form).
- Frontend gửi yêu cầu đó đến một API endpoint trên backend của bạn (sử dụng
fetch
,axios
...). - Backend nhận yêu cầu, sử dụng LangChain để gọi các thành phần cần thiết (lấy dữ liệu, gọi LLM, chạy Chain/Agent...).
- Backend nhận kết quả từ LangChain và LLM.
- Backend trả kết quả về cho frontend dưới dạng JSON hoặc streaming text.
- Frontend hiển thị kết quả cho người dùng.
Ví dụ minh họa cách frontend có thể gọi API backend sử dụng LangChain (giả định backend có endpoint /api/chat
xử lý yêu cầu chat):
// Trong một component React/Next.js chẳng hạn
async function sendMessageToChatbot(messageText) {
try {
const response = await fetch('/api/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ message: messageText }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log("Bot response:", data.reply);
// Cập nhật state để hiển thị tin nhắn bot trên UI
return data.reply;
} catch (error) {
console.error("Error sending message:", error);
// Xử lý lỗi trên UI
return "Có lỗi xảy ra. Vui lòng thử lại.";
}
}
// Sử dụng function này khi người dùng gửi tin nhắn
// e.g., sendMessageToChatbot("Xin chào!").then(reply => console.log(reply));
Giải thích: Đoạn code này cho thấy một hàm JavaScript đơn giản dùng fetch
để gửi yêu cầu POST
tới endpoint /api/chat
trên cùng server. Body của request chứa tin nhắn của người dùng. Endpoint này (chạy ở backend) sẽ là nơi code Python hoặc JavaScript của LangChain xử lý tin nhắn, gọi LLM, và tạo ra phản hồi. Phản hồi được gửi về dưới dạng JSON và được hiển thị ra console (trong ứng dụng thực tế sẽ cập nhật giao diện người dùng).
Mặc dù phần lớn công việc nặng nhọc của LangChain nằm ở backend, việc hiểu về nó giúp lập trình viên frontend thiết kế giao diện tốt hơn, biết cách gửi dữ liệu cần thiết cho backend, và hiển thị kết quả từ AI một cách hiệu quả. LangChain.js cũng cho phép một số use cases chạy ở frontend hoặc edge, nhưng thường liên quan đến các mô hình nhỏ hơn hoặc các tác vụ không yêu cầu xử lý dữ liệu nhạy cảm/số lượng lớn.
Comments