LangChain là một framework mã nguồn mở hỗ trợ phát triển ứng dụng được điều khiển bởi mô hình ngôn ngữ lớn (LLM). Nó cung cấp các thành phần có thể tái sử dụng, tích hợp hệ sinh thái phong phú và giúp giảm đáng kể lượng code mẫu khi xây dựng ứng dụng LLM.
Vòng đời ứng dụng LLM với LangChain
- Phát triển: Sử dụng các khối xây dựng sẵn như prompt template, memory, agent để nhanh chóng tạo prototype.
- Triển khai & giám sát: Dùng
LangSmithđể gỡ lỗi, kiểm thử và theo dõi hiệu năng chuỗi xử lý. - Xuất bản API: Với
LangServe, bất kỳ chuỗi xử lý nào cũng có thể được đóng gói thành RESTful API mà không cần viết thêm boilerplate code.
Trong ngữ cảnh này, "chuỗi" (chain) là một luồng logic hoàn chỉnh thực hiện một nhiệm vụ cụ thể — ví dụ như tổng hợp thông tin từ tài liệu, trả lời câu hỏi hoặc điều phối nhiều công cụ.
Các thành phần cốt lõi
1. Giao tiếp với mô hình (Model I/O)
| Thành phần | Mô tả |
|---|---|
LLMs |
Giao diện cơ bản cho mô hình sinh văn bản (text completion). |
ChatModels |
Giao diện tối ưu cho hội thoại, hỗ trợ vai trò hệ thống/người dùng/trợ lý. |
Prompt Templates |
Mẫu hóa đầu vào để tái sử dụng và quản lý dễ dàng hơn. |
Output Parsers |
Chuyển đổi kết quả thô từ LLM sang cấu trúc dữ liệu có thể xử lý (JSON, dict, v.v.). |
2. Truy xuất thông tin (Retrieval / RAG)
- Document Loaders: Trích xuất nội dung từ PDF, HTML, Notion, v.v.
- Text Splitters: Chia nhỏ văn bản dài thành đoạn phù hợp với giới hạn token của LLM.
- Embedding Models: Biến đổi văn bản thành vector số học để biểu diễn ngữ nghĩa.
- Vector Stores: Cơ sở dữ liệu chuyên biệt lưu trữ và tìm kiếm vector (ví dụ: Chroma, FAISS).
- Retrievers: Truy vấn vector store để lấy tài liệu liên quan nhất dựa trên câu hỏi người dùng.
3. Agent và công cụ
- Tools: Hàm hoặc API thực hiện tác vụ cụ thể (tìm kiếm web, tính toán, truy vấn DB).
- Toolkits: Bộ sưu tập tools được nhóm theo lĩnh vực (ví dụ: SQL toolkit, file system toolkit).
Các thư viện chính trong hệ sinh thái
langchain-core: Định nghĩa giao diện trừu tượng cơ bản.langchain-community: Tích hợp với bên thứ ba (OpenAI, Anthropic, Chroma, v.v.).langchain: Cài đặt chuỗi, agent và chiến lược truy xuất.langgraph: Xây dựng ứng dụng đa bước có trạng thái bằng đồ thị.langserve: Xuất chuỗi thành API REST.LangSmith: Nền tảng giám sát và đánh giá ứng dụng LLM.
Ví dụ minh họa
1. Gọi mô hình hội thoại
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
api_key=os.getenv("API_KEY"),
base_url=os.getenv("BASE_URL"),
model="qwen-plus"
)
response = llm.invoke("Giải thích ngắn gọn về nguyên lý bất định Heisenberg.")
print(response.content)
2. Hội thoại đa vòng
from langchain.schema import SystemMessage, HumanMessage, AIMessage
messages = [
SystemMessage(content="Bạn là trợ lý AI tên là Nova."),
HumanMessage(content="Tôi tên là Minh."),
AIMessage(content="Rất vui được gặp bạn, Minh!"),
HumanMessage(content="Hôm nay trời thế nào?")
]
response = llm.invoke(messages)
print(response.content)
3. Sử dụng prompt template
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "Bạn là chuyên gia về thơ Đường luật."),
("user", "{poem_start}")
])
chain = prompt | llm
result = chain.invoke({"poem_start": "Sáng ra bờ suối, tối vào hang"})
print(result.content)
4. Phân tích kết quả dưới dạng JSON
from langchain_core.output_parsers import JsonOutputParser
parser = JsonOutputParser()
structured_chain = prompt | llm | parser
response = structured_chain.invoke({
"input": "Trích dẫn 'Tổ quốc ta chưa bao giờ đẹp thế này'. Trả lời theo định dạng JSON: {\"quote\": \"...\", \"source\": \"...\"}"
})
print(response) # {'quote': 'Tổ quốc ta chưa bao giờ đẹp thế này', 'source': 'Bài ca hy vọng'}
5. Lưu trữ vector với Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://example.gov.vn/van-ban")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
embeddings = DashScopeEmbeddings(
dashscope_api_key=os.getenv("QW_KEY"),
model="text-embedding-v2"
)
vector_db = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
vector_db.persist()
6. Triển khai RAG từ cơ sở vector
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
# Tải lại vector store
retriever = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
).as_retriever(k=3)
# Thiết lập chuỗi trả lời
qa_prompt = ChatPromptTemplate.from_template(
"Dựa trên ngữ cảnh sau, trả lời câu hỏi:\n{context}\n\nCâu hỏi: {input}"
)
doc_chain = create_stuff_documents_chain(llm, qa_prompt)
rag_chain = create_retrieval_chain(retriever, doc_chain)
answer = rag_chain.invoke({"input": "Nội dung chính của văn bản là gì?"})
print(answer["answer"])