# Chạy marketing bằng agent: những lỗi không sửa bằng prompt

> Marketing và hỗ trợ khách của 2found chạy trên một đội Soot. Chín lỗi gặp trong những ngày đầu, vì sao chúng trông như lỗi prompt, và thay đổi ở runtime đã sửa chúng cho mọi Soot.

- URL: https://2found.dev/vi/blog/agent-marketing-fixes-not-prompts-vi/
- Published: 2026-10-17T01:39:40.765Z
- Updated: 2026-10-17T01:39:40.765Z
- Language: vi

---

2found là một đội nhỏ làm nhiều sản phẩm, nên marketing, bán hàng và hỗ trợ khách của chúng tôi chạy trên [Soot](https://trysoot.com/vi). Một radar đọc nơi dân làm sản phẩm bàn luận, một Soot viết bản nháp, một Soot biên tập duyệt và đăng lên ba blog, một Soot hỗ trợ trả lời khách trong khung chat trên các site, và một bàn tiếp nhận ghi lại những gì khách nói. Tất cả chạy theo lịch, trên máy chủ của chính chúng tôi, mỗi ngày.

Phần lớn lỗi trong những ngày đầu trông như lỗi prompt. Gần như không cái nào thật sự là lỗi prompt. Mỗi lần định thêm một dòng vào hướng dẫn của một Soot, nguyên nhân thật lại nằm ở runtime, ở tool, hoặc ở cách cả đội được nối với nhau. Sửa ở đó thì mọi Soot cùng được sửa. Dưới đây là những gì chúng tôi rút ra, gần đúng theo thứ tự gặp phải.

## 1. Thông tin sản phẩm thuộc về trang web, không thuộc về prompt

Những Soot đầu tiên mang thông tin sản phẩm ngay trong mission. Một thông tin chép vào prompt đúng vào ngày viết, và sai từ ngày sản phẩm thay đổi; không ai nhớ bản chép nằm trong mission nào trong năm cái. Cách sửa mà chúng tôi cứ quay lại, là sửa mission thêm lần nữa, lại chính là nguyên nhân.

Giờ mỗi sản phẩm có một trang facts, site liệt kê các trang đó trong `llms.txt`, và runtime chép chúng vào một kho kiến thức theo lịch. Soot nào cũng tra `knowledge_search` trước khi nói về sản phẩm, và nói rõ là chưa xác nhận được khi không tìm thấy. Khi khách ở hai cuộc trò chuyện khác nhau cùng hỏi một điều trang chưa có, Nest hiện nó thành một "khoảng trống kiến thức" kèm các câu khách đã hỏi, để người bổ sung. Cập nhật thông tin giờ chỉ là sửa một trang web.

## 2. Tìm kiếm khớp chữ, không khớp nghĩa

Một khách hỏi bằng tiếng Việt Soot giá bao nhiêu. Lệnh tìm "Soot giá" trả về trang bảng giá tiếng Việt của 2Novel, vì trang đó trùng nhiều chữ nhất với câu hỏi; còn trang tiếng Anh về Soot, nơi ghi rõ Soot chưa công bố giá, không hề xuất hiện.

Chúng tôi không dạy Soot hỗ trợ về trường hợp này. Chính tool tìm kiếm giờ nói với mọi Soot rằng nó khớp theo chữ, rằng trang có thể viết bằng ngôn ngữ khác với ngôn ngữ của khách, và rằng kết quả về sản phẩm khác không trả lời cho sản phẩm đang được hỏi. Tìm không ra gì liên quan thì thử lại một lần bằng từ khác hoặc bằng ngôn ngữ của trang.

## 3. Ngân sách luôn hết đúng ở bước quan trọng nhất

Một Soot hỗ trợ bị giới hạn 7 lượt gọi tool: nó đọc hai skill, tra kiến thức, và không còn lượt nào để ghi lại thông tin liên hệ của khách. Trong khi đó lại chính là việc chính.

Ba thay đổi ở runtime, không đụng tới prompt:

- Lần đầu đọc mỗi skill trong một lượt chạy thì không tính lượt.
- Hai kết quả tool cuối cùng trước khi chạm trần cho Soot biết còn bao nhiêu lượt, để nó dành chúng cho việc chỉ tool làm được.
- Lượt chạy chạm trần vẫn gửi câu trả lời nó đã viết, và vẫn báo được khoảng trống kiến thức trong câu trả lời đó. Trước đây lượt chạy của khách thất bại, còn chat của người vận hành thì đứng cho tới khi có người gõ lệnh.

## 4. Đừng mời dùng một tùy chọn mà mình không muốn ai dùng

Trước đây tool nào cũng nhận `async`. Các model nhỏ bật nó cho mọi lệnh, rồi tốn thêm một lệnh nữa để lấy kết quả. Radar hết lượt theo đúng kiểu đó trước khi kịp viết brief, và pack của nó phải ghi "đừng bao giờ bật async".

Giờ chỉ những tool thật sự có thể chậm (`web_fetch`, `web_search`, `http_request`, shell, hoặc tool của pack tự khai báo chạy nền) mới có tùy chọn này. Dòng cảnh báo trong pack đã được xóa.

## 5. Lịch chạy chỉ nên nói chạy chu kỳ nào

Lịch buổi sáng từng mô tả từng bước của chu kỳ, và mission của Soot biên tập cũng vậy. Vài ngày sau hai bản đã lệch nhau, và Soot biên tập làm theo bản nó đọc sau cùng. Giờ lịch chỉ ghi "chạy một chu kỳ như mission mô tả", và quy trình chỉ tồn tại ở một chỗ.

## 6. Runtime không nên tự viết gì cho khách

Trong lúc chuẩn bị câu trả lời, runtime từng tự chèn một câu "bạn chờ một chút nhé" vào khung chat. Đó là câu duy nhất model không viết, nên runtime phải tự đoán ngôn ngữ của khách, và nó chỉ biết hai thứ tiếng. Một cuộc chat mở trên trang tiếng Việt đã bảo một khách nói tiếng Anh chờ, bằng tiếng Việt. Chuyện tương tự xảy ra khi Soot chuyển cuộc chat cho người.

Cả hai câu đó đã bị bỏ. Widget giờ hiện một dòng tiến độ bằng chính ngôn ngữ của nó (đã nhận, đang suy nghĩ, đang tra cứu · bước 2, đang soạn câu trả lời), lấy từ sự kiện của lượt chạy, không lộ tên tool hay tham số. Khi chuyển cuộc chat cho người, Soot tự viết điều cần nói với khách, bằng ngôn ngữ của khách. Mọi chữ trong cuộc trò chuyện giờ là của Soot hoặc của người trong đội.

## 7. Hỏi người ít hơn, và không bao giờ đứng chờ người

Đội bắt đầu với việc duyệt từng bài, và yêu cầu duyệt chất đống. Hỏi ít đi chỉ hiệu quả khi chúng tôi đổi cách Soot hỏi:

- Chỉ có một danh sách, **Cần bạn**, cho mọi yêu cầu duyệt, quyết định, việc chuyển cho người và lỗi.
- Một câu hỏi đi kèm tối đa bốn lựa chọn bấm một lần, lựa chọn Soot đề xuất được đánh dấu.
- Câu hỏi có thể ghi một lựa chọn an toàn và một thời hạn. Hết hạn mà chưa ai trả lời thì runtime tự chọn (giữ bài lại, bỏ qua mục đó) và công việc chạy tiếp.
- Yêu cầu duyệt không ai quyết trong 7 ngày sẽ hết hạn và quay về Soot đã hỏi.
- Tool nào phải chờ người duyệt là chính sách của máy chủ, không phải của pack. Nest gợi ý cho Soot tự chạy một tool đã được duyệt ba lần và chưa bị từ chối lần nào.

Soot biên tập của chúng tôi giờ tự đăng bài. Nó chỉ hỏi khi một bài sẽ công bố giá, ngày hay quan hệ đối tác mà trang của chúng tôi chưa nói, hoặc khi bài trả lời một người cụ thể. Những việc chỉ người làm được, như tự tay đăng video, gom thành một thẻ mỗi chu kỳ.

## 8. Ghi lại điều khách đã được trả lời

Bàn tiếp nhận so từng ghi chú của khách với tài liệu để tìm những câu Soot hỗ trợ đã bỏ sót. Nó đánh dấu hai khách tiềm năng là "bị bỏ sót", trong khi câu trả lời cho họ đã đầy đủ: ghi chú chỉ lưu câu hỏi. Giờ ghi chú lưu cả việc khách đã được trả lời chưa và đã được nói gì.

## 9. Mã dùng chung cần có tiền tố

Soot, nhóm, lịch chạy và kho dữ liệu dùng chung trên cả runtime. Đội thứ hai đặt tên kho là `marketing` sẽ đọc nhầm brief của đội thứ nhất. Ví dụ chúng tôi công bố gắn tiền tố tên công ty vào mọi mã.

## Điểm chung

Không bản sửa nào nhắc tới 2found. Mỗi bản sửa đổi mô tả của một tool, một quy tắc của runtime, một giá trị mặc định, hoặc chỗ đặt một thông tin, nên Soot chạy trên runtime của người khác cũng được hưởng. Khi một bản sửa cần một câu về một sản phẩm cụ thể trong prompt của một Soot cụ thể, đó là bản sửa sai.

Đội mà chúng tôi đang chạy được công bố dưới dạng Soot source trên Soot Forge: [ví dụ marketing-team](https://github.com/2found/soot-forge/tree/main/examples/marketing-team). Triển khai bằng `soot bundle --refresh ./soot-source`, rồi `soot source deploy ./soot-source` (CLI cần quyền truy cập repo private; nếu chỉ có Nest thì tạo lại các Soot, nhóm và lịch chạy bằng tay theo các file đó). Template cũ [`groups/marketing-team`](https://github.com/2found/soot-forge/tree/main/groups/marketing-team) vẫn duyệt từng bài. Hướng dẫn nằm trên blog Soot: [Dựng đội marketing tự vận hành bằng Soot](https://trysoot.com/vi/blog/marketing-team-that-runs-itself-vi).
