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 đó.
- Quy trình bắt đầu bằng việc ghi lại một ý tưởng thô (
-
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
).
- Nếu chúng ta đang trong giai đoạn soạn thảo,
-
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
).
- 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 (
-
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ởicontent_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.
- 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 (
-
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.
- Trước khi hoàn tất, các bài đăng trải qua một kiểm tra tự độ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
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ẻ.