0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Xây Dựng Ứng Dụng AI Có Con Người Giám Sát Với LangGraph

Đăng vào 4 tháng trước

• 12 phút đọc

Giới Thiệu

Bạn đã bao giờ muốn tạm dừng quá trình suy luận của một AI, xem xét kỹ lưỡng những gì nó đang làm và điều chỉnh hướng đi trước khi nó tiếp tục? Ý tưởng cốt lõi đằng sau hệ thống Human-in-the-Loop (HITL) chính là như vậy. Trong hướng dẫn này, chúng ta sẽ xây dựng một ứng dụng từ đầu sử dụng LangGraph để tổ chức quy trình làm việc, Ollama để suy diễn mô hình AI cục bộ và Python để kết nối tất cả lại với nhau. Thiết lập này cho phép bạn tạo ra các ứng dụng AI tương tác, nơi con người có thể can thiệp tại những điểm quan trọng, làm cho hệ thống trở nên đáng tin cậy và thích ứng hơn với các trường hợp sử dụng thực tế như tạo nội dung, công cụ ra quyết định hoặc thậm chí là trợ giúp gỡ lỗi.

Hướng dẫn này phục vụ như một tài liệu tham khảo chi tiết cho video YouTube của tôi, nơi tôi trình diễn toàn bộ quá trình với giải thích mã và mẹo khắc phục sự cố.
📺 Xem video từng bước tại đây

Bằng cách theo dõi, bạn sẽ có được kinh nghiệm thực hành với một số khái niệm quan trọng: thiết kế quy trình làm việc AI theo mô-đun sử dụng kiến trúc đồ thị của LangGraph, tận dụng các mô hình ngôn ngữ lớn (LLMs) để tự động tinh chỉnh đầu vào của người dùng, thực hiện các điểm dừng cho sự giám sát của con người để đảm bảo chất lượng và sự phù hợp, và tạo ra các đầu ra chất lượng cao với các mô hình cục bộ hiệu quả của Ollama. Những kỹ năng này đang ngày càng trở nên quý giá khi các hệ thống AI phát triển để kết hợp nhiều hơn sự hợp tác giữa con người và AI.


🚀 Chúng Ta Đang Xây Dựng Gì

Ở cốt lõi, chúng ta đang xây dựng một ứng dụng Python giao diện dòng lệnh (CLI) chuyển đổi một prompt cơ bản của người dùng thành một phản hồi được tạo bởi AI qua một quy trình có cấu trúc. Ứng dụng bắt đầu bằng cách chấp nhận một prompt đơn giản từ người dùng, sau đó sử dụng một LLM để cải thiện nó về độ rõ ràng và hiệu quả - coi đây như là việc kỹ thuật hóa prompt tự động. Tiếp theo, ứng dụng tạm dừng quy trình để cho phép con người xem xét, nơi bạn có thể chấp nhận prompt được cải thiện hoặc điều chỉnh thủ công. Cuối cùng, nó sẽ đưa prompt đã tinh chỉnh trở lại LLM để sản xuất một câu trả lời hoàn chỉnh.

Điều làm cho điều này trở nên đặc biệt là vai trò của LangGraph trong việc mô hình hóa quy trình làm việc như một đồ thị có hướng: mỗi giai đoạn (như cải thiện prompt hoặc xem xét của con người) trở thành một "nút", và các kết nối giữa chúng xác định dòng chảy. Cách tiếp cận dựa trên đồ thị này đảm bảo ứng dụng linh hoạt, dễ mở rộng (ví dụ, thêm nhiều nút cho các kiểm tra bổ sung), và có trạng thái, nghĩa là nó nhớ tiến trình qua các bước. Chúng ta sẽ sử dụng Ollama để chạy mọi thứ cục bộ, giữ cho mọi thứ nhanh chóng, riêng tư và không tốn chi phí so với các API dựa trên đám mây. Cuối cùng, bạn sẽ có một mẫu tái sử dụng để xây dựng các hệ thống HITL cân bằng giữa sự tự chủ của AI và sự kiểm soát của con người.


🛠️ Bước 1 — Cài Đặt và Nhập Khẩu

Để bắt đầu, chúng ta cần cài đặt các phụ thuộc cần thiết. Nếu bạn chưa làm, hãy chạy pip install langgraph langchain-ollama rich trong terminal của bạn. Những thư viện này cung cấp các khối xây dựng: LangGraph cho quy trình làm việc đồ thị, tích hợp Ollama của LangChain cho các tương tác mô hình, và Rich để cải thiện đầu ra console.

Dưới đây là mã cơ bản với các import của chúng ta:

python Copy
import uuid
from typing import TypedDict, Optional

from langgraph.graph import StateGraph, START, END
from langgraph.types import interrupt, Command
from langgraph.checkpoint.memory import InMemorySaver
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_ollama import ChatOllama
from rich import print

Hãy phân tích điều này: uuid giúp tạo ra các định danh duy nhất cho mỗi phiên ứng dụng, đảm bảo rằng nhiều lần chạy không can thiệp vào nhau - đặc biệt hữu ích nếu bạn mở rộng điều này cho một thiết lập đa người dùng. StateGraph là cốt lõi của LangGraph, cho phép chúng ta định nghĩa các nút và các cạnh theo cách lập trình. Các kiểu interruptCommand cho phép cơ chế tạm dừng cho đầu vào của con người. InMemorySaver hoạt động như một hệ thống checkpoint đơn giản để duy trì trạng thái giữa các bước, điều này rất quan trọng để tiếp tục sau khi bị gián đoạn. Các lớp HumanMessageSystemMessage của LangChain cấu trúc các tương tác của chúng ta với LLM, trong khi ChatOllama kết nối với mô hình Ollama đang chạy cục bộ của bạn. Cuối cùng, rich.print làm cho console trở nên sinh động với màu sắc, biểu tượng cảm xúc và định dạng để tạo trải nghiệm người dùng hấp dẫn hơn.

Với các import đã sẵn sàng, khởi tạo LLM như sau:

python Copy
llm = ChatOllama(model='phi4-mini', temperature=0.7)

Chúng ta đang sử dụng mô hình 'phi4-mini' ở đây vì sự cân bằng giữa tốc độ và khả năng trên phần cứng hàng ngày, nhưng bạn có thể thay thế nó bằng một cái gì đó như 'llama3' nếu bạn cần sức mạnh hơn. Cài đặt temperature=0.7 giới thiệu một chút sáng tạo mà không làm cho các đầu ra trở nên quá không thể đoán trước - điều chỉnh điều này dựa trên nhu cầu của bạn về tính xác định so với sự đổi mới.


🧩 Bước 2 — Định Nghĩa Trạng Thái Ứng Dụng

Trong LangGraph, "bộ nhớ" của ứng dụng là một từ điển trạng thái chung được cập nhật khi nó chảy qua đồ thị. Điều này đảm bảo mỗi nút có quyền truy cập vào dữ liệu mới nhất mà không phải truyền tải dư thừa.

python Copy
class PromptState(TypedDict):
    original_prompt: str
    improved_prompt: Optional[str]
    final_prompt: Optional[str]
    final_answer: Optional[str]
    step: str

Lớp PromptState này theo dõi sự phát triển của prompt và phản hồi: original_prompt lưu giữ đầu vào thô của người dùng, improved_prompt chứa phiên bản đã được tinh chỉnh của LLM, final_prompt là kết quả sau khi con người xem xét, final_answer lưu giữ đầu ra cuối cùng, và step là một bộ theo dõi đơn giản cho việc gỡ lỗi (ví dụ, biết chúng ta đang ở "prompt_improved" hoặc "human_reviewed"). Việc sử dụng TypedDict với các trường Optional thêm tính an toàn về kiểu, giúp phát hiện lỗi sớm trong quá trình phát triển. Thiết kế trạng thái này có thể mở rộng - nếu bạn muốn thêm các tính năng như ghi lại dấu thời gian hoặc điểm tự tin, bạn có thể dễ dàng mở rộng từ điển này.


🧠 Bước 3 — Cải Thiện Prompt

Phép màu bắt đầu ở đây: nút đầu tiên của chúng ta sử dụng LLM để viết lại prompt của người dùng, làm cho nó chính xác và hiệu quả hơn. Bước này mô phỏng các kỹ thuật kỹ thuật hóa prompt nâng cao, thường dẫn đến những kết quả tốt hơn đáng kể từ việc tạo AI cuối cùng.

python Copy
def improve_prompt_node(state: PromptState) -> PromptState:
    print(f"🤖 Cải thiện prompt với Ollama: {state['original_prompt']}")

    system_message = """Bạn là một chuyên gia kỹ thuật hóa prompt. Mục tiêu của bạn là tiếp nhận prompt gốc của người dùng và cải thiện nó về độ rõ ràng, tính cụ thể và hiệu quả khi sử dụng với LLM. Hãy làm cho nó chi tiết hơn, thêm ngữ cảnh nếu cần và đảm bảo nó được tối ưu hóa để tạo ra các phản hồi chất lượng cao. Chỉ trả về prompt đã cải thiện, không giải thích."""

    improved_prompt = call_llm(state['original_prompt'], system_message)

    return {
        **state,
        "improved_prompt": improved_prompt,
        "step": "prompt_improved"
    }

Trong hàm này, chúng ta xây dựng một thông điệp hệ thống hướng dẫn LLM cách tinh chỉnh prompt - nhấn mạnh độ rõ ràng và tối ưu hóa mà không thêm thắt gì không cần thiết. Hàm call_llm (mà bạn sẽ cần định nghĩa như một trợ giúp để gọi llm.invoke với các thông điệp) xử lý cuộc gọi mô hình thực tế. Ví dụ, nếu người dùng nhập "Nói cho tôi về học máy," LLM có thể trả về một cái gì đó như "Cung cấp một cái nhìn tổng quan về học máy, bao gồm lịch sử, các thuật toán chính, các ứng dụng thực tế và xu hướng tương lai." Việc cải thiện tự động này giảm bớt nỗ lực của người dùng và nâng cao chất lượng đầu ra.


✋ Bước 4 — Đánh Giá Của Con Người

Nút này giới thiệu yếu tố "con người", tạm dừng đồ thị để xin phản hồi. Đây chính là điều làm cho ứng dụng trở nên tương tác thực sự và ngăn chặn AI hoạt động không kiểm soát.

python Copy
def human_review_node(state: PromptState) -> PromptState:
    print("👤 Yêu cầu đánh giá của con người...")

    human_response = interrupt({
        "task": "Xin hãy xem xét và chỉnh sửa prompt đã cải thiện nếu cần",
        "original_prompt": state["original_prompt"],
        "improved_prompt": state["improved_prompt"]
    })

    # Chấp nhận hoặc chỉnh sửa prompt đã cải thiện
    final_prompt = human_response.get("edited_prompt", state["improved_prompt"])

    return {
        **state,
        "final_prompt": final_prompt,
        "step": "human_reviewed"
    }

Khi được thực thi, ứng dụng sẽ hiển thị prompt đã cải thiện trong console và chờ nhập liệu: nhấn Enter sẽ chấp nhận nó như hiện tại, hoặc bạn có thể nhập các điều chỉnh. Cơ chế interrupt của LangGraph tạm dừng quá trình tại đây, lưu giữ trạng thái để bạn có thể tiếp tục sau đó. Điều này lý tưởng cho các tình huống mà AI có thể tạo ra thông tin sai lệch hoặc hiểu nhầm, cho phép sự tinh tế của con người tinh chỉnh hướng đi - nghĩ đến việc điều chỉnh nội dung hoặc các hệ thống tư vấn cá nhân hóa.


📝 Bước 5 — Tạo Câu Trả Lời Cuối Cùng

Với prompt đã hoàn thiện, nút này tạo ra phản hồi toàn diện bằng cách sử dụng Ollama.

python Copy
def answer_prompt_node(state: PromptState) -> PromptState:
    print(f"🤖 Tạo câu trả lời cuối cùng với Ollama cho: {state['final_prompt']}")

    system_message = """Bạn là một trợ lý AI hữu ích. Cung cấp một câu trả lời toàn diện cho prompt của người dùng, dựa trên kiến thức chính xác và các giải thích rõ ràng. Cấu trúc phản hồi của bạn theo cách hợp lý với các phần nếu thích hợp."""

    final_answer = call_llm(state['final_prompt'], system_message)

    return {
        **state,
        "final_answer": final_answer,
        "step": "completed"
    }

Thông điệp hệ thống hướng dẫn LLM hướng tới các đầu ra có cấu trúc và thông tin. Ví dụ, nó có thể biến một prompt đã tinh chỉnh thành một bài luận chi tiết với các tiêu đề, ví dụ và tài liệu tham khảo, đảm bảo câu trả lời cuối cùng được tinh chỉnh và thân thiện với người dùng.


🔗 Bước 6 — Xây Dựng Đồ Thị

Bây giờ chúng ta sẽ lắp ghép các phần lại thành một đồ thị quy trình làm việc thống nhất.

python Copy
def create_app():
    builder = StateGraph(PromptState)

    builder.add_node("improve_prompt", improve_prompt_node)
    builder.add_node("human_review", human_review_node)
    builder.add_node("answer_prompt", answer_prompt_node)

    builder.add_edge(START, "improve_prompt")
    builder.add_edge("improve_prompt", "human_review")
    builder.add_edge("human_review", "answer_prompt")
    builder.add_edge("answer_prompt", END)

    return builder.compile(checkpointer=InMemorySaver())

Điều này tạo ra một dòng chảy tuyến tính từ đầu đến cuối, nhưng LangGraph hỗ trợ các nhánh, vòng lặp hoặc điều kiện nếu bạn muốn thêm tính phức tạp (ví dụ, định tuyến lại dựa trên phản hồi của con người). Bộ kiểm tra trong bộ nhớ đảm bảo tính liên tục của trạng thái, giúp việc gián đoạn trở nên mượt mà.


💻 Bước 7 — Chạy Như Một CLI

Kết nối tất cả lại trong một hàm chính để dễ dàng thực thi.

python Copy
def main():
    app = create_app()
    config = {"configurable": {"thread_id": str(uuid.uuid4())}}

    user_prompt = input("Nhập prompt của bạn: ").strip() hoặc "Nói cho tôi về học máy"

    initial_state = {"original_prompt": user_prompt, "step": "starting"}

    print(f"🚀 Đang xử lý với Ollama: {user_prompt}")
    result = app.invoke(initial_state, config=config)

    if "__interrupt__" in result:
        # Logic để hiển thị prompt đã cải thiện và thu thập đầu vào của con người...
        # Ví dụ, in chi tiết và sử dụng input() để nhận chỉnh sửa
        human_response = {"edited_prompt": input("Chỉnh sửa prompt (hoặc nhấn Enter để chấp nhận): ")}  # Ví dụ đơn giản
        final_result = app.invoke(Command(resume=human_response), config=config)

        print(f"Prompt cuối cùng: {final_result['final_prompt']}")
        print(f"🎯 Câu trả lời:\n{final_result['final_answer']}")

Vòng lặp này xử lý toàn bộ chu kỳ, bao gồm việc tiếp tục sau khi gián đoạn đánh giá của con người. Chạy nó bằng cách sử dụng python your_script.py, nhập một prompt và theo dõi phép màu HITL diễn ra.


🎯 Kết Luận

Bạn đã xây dựng một ứng dụng AI Human-in-the-Loop mạnh mẽ tự động hóa quy trình tinh chỉnh prompt, kết hợp giám sát của con người để đảm bảo độ chính xác và cung cấp các phản hồi tinh chỉnh qua Ollama - tất cả được tổ chức bởi động cơ quy trình làm việc mạnh mẽ của LangGraph. Cách tiếp cận này kết hợp hiệu suất của AI với sự tinh tế của sự phán đoán con người, làm cho nó hoàn hảo cho các ứng dụng mà độ tin cậy rất quan trọng, chẳng hạn như công cụ giáo dục, trợ giúp viết sáng tạo hoặc hỗ trợ quyết định trong doanh nghiệp.

Để xem một buổi trình diễn trực tiếp và đi sâu hơn vào các tùy chỉnh, hãy kiểm tra video YouTube đi kèm:
👉 Xem tại đây

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào