Giới Thiệu
Trong phần 2 của bài viết này, chúng ta sẽ tiếp tục khám phá các khái niệm quan trọng trong LangGraph.js mà bạn cần biết để tối ưu hóa quy trình làm việc AI của mình.
Root Reducer
LangGraph.js sử dụng StateGraph
, cho phép thiết kế một cấu trúc state phức tạp hơn. Ví dụ dưới đây sẽ giúp bạn hiểu rõ hơn về cách sử dụng root reducer:
javascript
import { StateGraph, END, START } from "@langchain/langgraph";
const builderE = new StateGraph({
channels: {
__root__: {
reducer: (x: string[], y?: string[]) => x.concat(y ?? []),
default: () => [],
},
},
})
.addNode("my_node", (state) => {
return [`Thêm một tin nhắn vào ${state}`];
})
.addEdge(START, "my_node")
.addEdge("my_node", END);
const graphE = builderE.compile();
console.log(await graphE.invoke(["Chào"]));
// ["Chào", 'Thêm một tin nhắn vào Chào']
Trong ví dụ trên, StateGraph
cho phép chúng ta tạo ra các luồng dữ liệu có thể theo dõi và thay đổi, cung cấp cho chúng ta nhiều lợi ích trong việc xây dựng quy trình làm việc AI.
Lợi ích của State Graph
- Kiểm tra dữ liệu: Bạn có thể kiểm tra luồng dữ liệu trước và sau mỗi "siêu bước".
- Thay đổi State: State có thể thay đổi, cho phép kiểm soát hướng của các agent dễ dàng hơn.
- Checkpoint: Các điểm kiểm tra xác định rõ ràng giúp lưu trữ và khôi phục quy trình dễ dàng.
Persistence: Tại Sao Cần Bộ Nhớ?
Hệ thống AI cần bộ nhớ để duy trì thông tin trong suốt quá trình hoạt động:
- Nhớ các bước thực hiện trong nhiệm vụ.
- Giữ lại các cuộc trò chuyện trước đó với người dùng.
- Ghi nhớ các tương tác và hành vi để hệ thống trở nên cá nhân hóa.
Bộ nhớ trong LangGraph.js rất quan trọng và có thể xử lý thông qua các checkpoint.
Checkpoints: Quản Lý Bộ Nhớ
Checkpoint trong LangGraph.js đánh dấu trạng thái tại một thời điểm nhất định, hỗ trợ lưu trữ và tiếp tục từ nơi đã dừng lại.
- Bộ Nhớ Trong Một Lần Chạy: Checkpoint được tạo ở mọi bước, cho phép khôi phục trạng thái trước đó khi có lỗi xảy ra.
- Bộ Nhớ Nhiều Lượt: Các checkpoint lưu dưới dạng
thread_id
giúp duy trì thông tin giữa các lượt tương tác.
Cấu Hình Trong Graph
Các giá trị cấu hình cho một triển khai graph rất quan trọng. Một số giá trị như thread_id
, user_id
, hay thông tin liên quan đến LLM có thể được tách biệt khỏi luồng dữ liệu chính để tối ưu hóa hiệu suất.
Ví Dụ Thực Tế
Hãy xem một ví dụ chi tiết về cách nhiều nhớ hoạt động trong LangGraph.js:
javascript
import { END, MemorySaver, START, StateGraph } from "@langchain/langgraph";
interface State {
total: number;
turn?: string;
}
function addF(existing: number, updated?: number) {
return existing + (updated ?? 0);
}
const builder = new StateGraph<State>({
channels: {
total: {
value: addF,
default: () => 0,
},
},
})
.addNode("add_one", (_state) => ({ total: 1 }))
.addEdge(START, "add_one")
.addEdge("add_one", END);
const memory = new MemorySaver();
const graphG = builder.compile({ checkpointer: memory });
let threadId = "some-thread";
let config = { configurable: { thread_id: threadId } };
const result = await graphG.invoke({ total: 1, turn: "Lượt đầu tiên" }, config);
const result2 = await graphG.invoke({ turn: "Lượt tiếp theo" }, config);
const result3 = await graphG.invoke({ total: 5 }, config);
const result4 = await graphG.invoke(
{ total: 5 },
{ configurable: { thread_id: "new-thread-id" } }
);
console.log(result);
// { total: 2, turn: 'Lượt đầu tiên' }
console.log(result2);
// { total: 3, turn: 'Lượt tiếp theo' }
console.log(result3);
// { total: 9, turn: 'Lượt tiếp theo' }
console.log(result4);
// { total: 6 }
Trong ví dụ trên, bạn có thể thấy rõ cách checkpoint
hoạt động và cách mà các cập nhật từ người dùng được xử lý trong LangGraph.js.
Kết Luận
LangGraph.js không chỉ là một thư viện, mà là một công cụ mạnh mẽ để xây dựng các hệ thống AI linh hoạt. Bằng cách hiểu và áp dụng các khái niệm như Root Reducer, Persistence, Checkpoints và cấu hình, bạn có thể phát triển các ứng dụng AI đáng tin cậy và tối ưu hóa quy trình làm việc cho riêng mình.
Hãy theo dõi các bài viết tiếp theo để tìm hiểu thêm về LangGraph.js và cách ứng dụng của nó trong phát triển AI.
source: viblo