0
0
Lập trình
TT

Xây Dựng Quy Trình Tự Động Hoá Truyền Thông Xã Hội với LangGraph

Đăng vào 5 ngày trước

• 6 phút đọc

Tại sao cần tự động hóa?

Gần đây, tôi đã bắt đầu viết blog, đặc biệt là về các chủ đề kỹ thuật. Tôi thích khám phá các tài liệu, bài viết và kho lưu trữ GitHub mà khiến tôi hứng thú. Điều này dẫn tôi đến ý tưởng chia sẻ những nội dung tương tự. Tuy nhiên, tôi nhận ra rằng viết blog kỹ thuật có thể hơn cả một phương tiện để chia sẻ sở thích, mà còn là một cách mạnh mẽ để xây dựng thương hiệu cá nhân.

Khi nói đến việc tạo dựng thương hiệu cá nhân, có rất nhiều yếu tố cần xem xét, nhưng theo cách nhìn đơn giản của tôi, chỉ cần hai điều:

  • Nội dung có giá trị cao và tác động lớn
  • Một chiến lược phân phối tuyệt vời

Mạng xã hội chính là "chiến lược phân phối tuyệt vời".

Tuy nhiên, việc viết nội dung tối ưu cho mạng xã hội, đặc biệt là LinkedIn và X, không phải là lĩnh vực tôi muốn dành nhiều thời gian cho và với tư cách là một kỹ sư, tôi bị thu hút bởi việc tự động hóa quy trình này.


Cách hoạt động của nó?

Ý tưởng trung tâm

Tâm điểm của dự án này là một quy trình LangGraph tự động hóa chuỗi nội dung của tôi, nghĩa là, từ giai đoạn ý tưởng đến giai đoạn soạn thảo và xuất bản bài viết trên mạng xã hội (không phải blog của tôi), quy trình này đảm nhiệm toàn bộ quá trình tạo ra nội dung.

  • Tôi muốn loại bài viết nào?
  • Loại bài viết nào tôi cần tùy thuộc vào ngày trong tuần?
  • Nội dung của bài viết có hợp lệ và có cơ sở không?
  • Bài viết có đưa ra bất kỳ tuyên bố nào không có cơ sở không?
  • Bài viết có đề cập đến bất kỳ thông tin nào mà không có nguồn gốc hợp lý không?

Tại sao chọn LangGraph?

Sau khi sử dụng nhiều công cụ để tạo lập các tác nhân như LCEL, Crew AI và DSPY, tôi cảm thấy LangGraph rất dễ theo dõi về mặt quy trình vì nó khớp rất tốt với các lưu đồ và UML mà chúng ta gặp hàng ngày. Tôi cũng quen thuộc với LangGraph vì tôi đã sử dụng nó rất nhiều trong kỳ thực tập để xây dựng các hệ thống tác nhân.

Lưu đồ

Phân tích quy trình:

  • Bắt và Nghiên cứu

    • Quy trình bắt đầu bằng việc ghi lại một ý tưởng thô (capture_idea).
    • Sau đó, nó thu thập ghi chú và tài liệu tham khảo từ Obsidian (obsidian_research), đảm bảo rằng ý tưởng có căn cứ trong nghiên cứu trước đó.
  • Lập kế hoạch & Tạo Teaser

    • planner_agent cấu trúc ý tưởng thành một lộ trình.
    • Tùy thuộc vào giai đoạn, hệ thống có thể tạo ra một bài viết teaser sớm (teaser_generator) để chia sẻ vào thứ Hai như một bản xem trước.
  • Soạn thảo Blog

    • Nếu chúng ta đang trong giai đoạn soạn thảo, blog_drafter sẽ tạo ra một bản nháp dài.
    • Khi URL của blog cuối cùng có sẵn, hệ thống sẽ thu thập nội dung đã xuất bản (scraper) và xây dựng một tóm tắt ngắn gọn (summarizer).
  • Tạo Bài Đăng Trên Mạng Xã Hội

    • Sử dụng tóm tắt blog, quy trình sẽ tạo ra các bài đăng LinkedIn được tùy chỉnh (final_post_generator) và bài đăng X/Twitter (x_generator).
  • Xác thực & Đánh giá

    • Các bài đăng được xác thực về cấu trúc, giọng điệu và tính phù hợp với nền tảng (validator).
    • Nếu phát hiện vấn đề, chúng sẽ được gửi cho đánh giá đồng nghiệp (peer_reviewer) và, nếu cần, được cải thiện bởi content_improver.
    • Quy trình giới hạn việc cải thiện ở 3 lần lặp để tránh vòng lặp vô hạn.
  • Tự Đánh Giá & Khôi Phục

    • Trước khi hoàn tất, các bài đăng trải qua một kiểm tra tự động (self_evaluator).
    • Nếu xảy ra lỗi (ví dụ: thiếu URL blog, logic bị hỏng), một recovery_agent sẽ can thiệp để sửa chữa hoặc thoát một cách nhẹ nhàng.
  • Hoàn Thành

    • Khi đã được xác thực, hệ thống xuất ra các bài đăng sẵn sàng để xuất bản cho LinkedIn và X.
    • Nếu cần sự giám sát của con người (ví dụ: cách diễn đạt gây tranh cãi hoặc ngữ cảnh mơ hồ), quy trình sẽ tạm dừng và đánh dấu cho đánh giá thủ công.

Mẫu mã quy trình:

python Copy
def create_workflow():
    workflow = StateGraph(AutomationState)

    workflow.add_node("capture_idea", capture_idea)
    workflow.add_node("obsidian_research", process_obsidian_content)
    workflow.add_node("planner_agent", planner_agent)
    workflow.add_node("teaser_generator", teaser_generator)
    workflow.add_node("blog_drafter", blog_drafter)
    workflow.add_node("scraper", scrape_blog_content)
    workflow.add_node("summarizer", generate_blog_summary)
    workflow.add_node("final_post_generator", generate_linkedin_posts)
    workflow.add_node("x_generator", generate_x_posts)
    workflow.add_node("validator", validate_posts)
    workflow.add_node("peer_reviewer", peer_review_agent)
    workflow.add_node("content_improver", content_improver_agent)
    workflow.add_node("self_evaluator", self_evaluator)
    workflow.add_node("recovery_agent", recovery_agent)

    workflow.set_entry_point("capture_idea")

    workflow.add_edge("capture_idea", "obsidian_research")
    workflow.add_edge("obsidian_research", "planner_agent")

    workflow.add_conditional_edges(
        "planner_agent",
        should_generate_teaser,
        {
            "teaser_generator": "teaser_generator",
            "planner_agent": "planner_agent",
            "scraper": "scraper",
        },
    )

    workflow.add_conditional_edges(
        "teaser_generator",
        should_generate_blog_draft,
        {
            "blog_drafter": "blog_drafter",
            "planner_agent": "planner_agent",
            "scraper": "scraper",
        },
    )

    workflow.add_conditional_edges(
        "blog_drafter", should_scrape_blog, {"scraper": "scraper", "END": END}
    )

    workflow.add_edge("scraper", "summarizer")
    workflow.add_edge("summarizer", "final_post_generator")
    workflow.add_edge("final_post_generator", "x_generator")

    workflow.add_conditional_edges(
        "x_generator",
        should_validate_or_end,
        {"validator": "validator", "recovery_agent": "recovery_agent", "END": END},
    )

    workflow.add_conditional_edges(
        "validator",
        should_improve_or_evaluate,
        {
            "peer_reviewer": "peer_reviewer",
            "self_evaluator": "self_evaluator",
            "recovery_agent": "recovery_agent",
        },
    )

    workflow.add_conditional_edges(
        "peer_reviewer",
        should_improve_or_end,
        {
            "content_improver": "content_improver",
            "self_evaluator": "self_evaluator",
            "recovery_agent": "recovery_agent",
        },
    )

    workflow.add_edge("content_improver", "validator")

    workflow.add_conditional_edges(
        "self_evaluator",
        should_loop_or_end,
        {"validator": "validator", "recovery_agent": "recovery_agent", "END": END},
    )

    workflow.add_edge("recovery_agent", END)

    return workflow.compile()

Toàn bộ mã cho tự động hóa của tôi: GitHub


Những suy nghĩ cuối cùng

Việc xây dựng tự động hóa này thực sự rất thú vị. Tất nhiên, nó không thể được xem là một lợi ích cho năng suất của tôi trong một khoảng thời gian ngắn như vậy, nhưng tôi sẽ theo dõi kỹ lưỡng những lợi ích (hoặc thiệt hại) do tự động hóa này mang lại, mà tôi chắc chắn sẽ chia sẻ.

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