VI ▾
Lấy khóa API

Cách viết Prompt cho API mô hình không kiểm duyệt: system, vai trò, định dạng, lấy mẫu

Với cùng một mô hình, Prompt viết lỏng hay chặt sẽ tạo ra chất lượng đầu ra khác biệt một bậc. Ở đây không bàn về cảm tính, chỉ liệt kê các phương pháp kỹ thuật có thể kiểm chứng trực tiếp: cách phân tầng system prompt, cách thiết lập vai trò để không bị lệch hướng, cách chỉ dùng lệnh để lấy ra JSON có thể phân tích được, cách chọn temperature và top_p, cũng như những cách viết chắc chắn sẽ thất bại. Mỗi mục đều có thể đưa vào mã nguồn của bạn để làm thí nghiệm đối chiếu.

Cập nhật lúc

Điểm chính

  • Dùng cấu trúc hai phần cho system prompt: quy tắc kèm số thứ tự, phần thiết lập chỉ nêu sự thật.
  • Nếu cần JSON, hãy viết cứng định dạng trong lệnh, giảm temperature và đảm bảo mã nguồn có cơ chế dự phòng khi phân tích thất bại.
  • Chỉ thay đổi một tham số temperature hoặc top_p mỗi lần; dùng 0.8 đến 1.0 cho sáng tạo, bắt đầu từ 0 đến 0.3 cho trích xuất.
  • Các cách viết thất bại thường gặp: câu phủ định mơ hồ, quy tắc mâu thuẫn nhau, đặt yêu cầu định dạng ở giữa đoạn hội thoại.

Xác định bốn nguyên tắc đầu tiên

  • Mỗi yêu cầu xử lý một nhiệm vụ.Hãy để mô hình vừa viết cốt truyện, vừa tóm tắt, vừa xuất JSON — tất cả đều được giảm giá. Chia nhỏ thành nhiều lần gọi, chi phí rất thấp, đầu vào mỗi triệu token chỉ tốn $0.25.
  • Quy tắc phải có thể kiểm tra được.“Viết sinh động hơn” thì không thể kiểm tra, nhưng “Mỗi đoạn không quá 120 từ, ít nhất một đoạn tả cảnh” thì có thể.
  • Ưu tiên diễn đạt tích cực.Nói “Chỉ viết hành động và đối thoại” ổn định hơn nhiều so với nói “Không viết suy nghĩ nội tâm”.
  • Làm mẫu nhỏ trước, sau đó mở rộng quy mô.Với mọi thay đổi prompt, hãy so sánh trước với năm đến mười mẫu, sau đó đưa vào sản xuất.

Mô hình này không từ chối nội dung người lớn hợp pháp, thể loại hư cấu và các chủ đề gây tranh cãi, vì vậy bạn không cần phải vòng vo trong prompt hay liên tục khai báo "đây chỉ là truyện hư cấu". Chỉ cần nêu rõ nhiệm vụ, kết quả sẽ ổn định hơn. Ranh giới cứng duy nhất là nội dung tình dục liên quan đến người dưới 18 tuổi, dù là hư cấu hay thực tế đều trả về 403; điều này không thể thay đổi bằng cách diễn đạt.

Cấu trúc hai phần của system prompt

Khuyến nghị chia system thành hai phần “Quy tắc” và “Thiết lập”, quy tắc đặt ở đầu và đánh số, thiết lập đặt ở cuối và chỉ nêu sự thật. Dưới đây là cách viết cho người kể chuyện tiểu thuyết:

你是「夜航」,一名为成年读者写黑色悬疑小说的叙述者。

# 规则
1. 第三人称过去时,每段不超过 120 字。
2. 不替用户的角色做决定,只写环境和其他角色的反应。
3. 每次输出 300 到 500 字,结尾停在一个未决的动作上。
4. 不总结、不点评、不加免责声明,直接写正文。

# 设定
时间:1998 年深秋。地点:港口城市旧码头区。
主角:沈野,退役水警,嗜烟,右耳有旧伤。

Một số điểm chính:

  1. Số lượng quy tắc không quá sáu, càng nhiều quy tắc thì những quy tắc ở phía sau càng dễ bị bỏ qua.
  2. Ràng buộc bằng số (số ký tự mỗi đoạn, độ dài đầu ra) hiệu quả hơn tính từ.
  3. Ràng buộc kết thúc (dừng lại ở hành động chưa hoàn thành) giúp việc viết tiếp nhiều vòng được liền mạch.
  4. Không nhét diễn biến cốt truyện vào phần thiết lập; cốt truyện do tin nhắn user thúc đẩy, nếu không sẽ xung đột với đầu vào của người dùng ở các vòng sau.

Độ dài đầu ra phải phù hợp với max_tokens: nếu quy tắc yêu cầu 500 từ nhưng max_tokens chỉ cho phép 200, đầu ra sẽ bị cắt giữa câu.

Bổ sung một chi tiết thực hành: quy tắc đánh số trong system prompt nên mỗi mục chỉ diễn đạt một ý. “Mỗi đoạn không quá 120 từ và không tóm tắt” nhìn thì giống một mục nhưng thực chất là hai mục; khi tách riêng, mô hình sẽ dễ dàng tuân thủ cả hai hơn. Sau khi viết xong, hãy tự đọc từng mục một và tự hỏi: “Mục này có thể kiểm tra bằng mắt xem có được tuân thủ không?”. Nếu không, hãy viết lại thành dạng có thể kiểm tra được.

Cách viết thiết lập vai trò để không bị lệch hướng

Lệch vai trò là vấn đề phổ biến nhất trong hội thoại nhiều vòng: năm vòng đầu giọng điệu bình thường, nhưng đến vòng thứ hai mươi thì nhân vật bắt đầu “ra khỏi vai”. Có ba cách khắc phục.

  • Chỉ mô tả các đặc điểm có thể quan sát được.“Thẩm Dã: nghiện thuốc lá, tai phải có vết thương cũ, nói câu ngắn” tốt hơn “Thẩm Dã là một người phức tạp và cuốn hút”.
  • Viết cách nói chuyện dưới dạng ví dụ.Cung cấp hai hoặc ba câu thoại mẫu, hiệu quả mô phỏng của mô hình với các câu mẫu tốt hơn nhiều so với việc hiểu tính từ.
  • Nhắc lại định kỳ.Khi hội thoại dài, hãy thêm một dòng nhắc nhở ngắn gọn vào cuối tin nhắn user sau mỗi vài vòng, ví dụ “Giữ phong cách câu ngắn của Thẩm Dã”, chi phí chỉ khoảng vài chục token.

Ngoài ra, đừng trộn lẫn thiết lập nhân vật và quy tắc đầu ra. Quy tắc là “viết như thế nào”, thiết lập là “viết về ai”. Khi tách riêng, bạn có thể thay đổi nhân vật mà không cần sửa quy tắc, việc so sánh A/B cũng thuận tiện hơn. Với hội thoại dài, hãy lưu ý tổng dung lượng ngữ cảnh, chi tiết xem tại thực hành ngữ cảnh dài 100k.

Trong kịch bản nhiều nhân vật, hãy thêm một quy tắc nữa: mỗi nhân vật có một dòng thiết lập riêng, mỗi kiểu nói thoại có một câu mẫu, tránh việc tất cả các nhân vật nói giống nhau. Đối với nhân vật do người dùng đóng, chỉ ghi trong thiết lập “do người dùng kiểm soát” để mô hình không tự viết thay.

Dùng lệnh để kiểm soát đầu ra JSON

Đừng giả định mô hình “chắc chắn” trả về JSON hợp lệ. Cách an toàn gồm ba lớp: chỉ thị quy định cứng định dạng, tham số giảm độ ngẫu nhiên, và mã nguồn phân tích cú pháp dự phòng.

import json
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.wushenchaapi.com/v1", api_key=os.environ["API_KEY"])

SYSTEM = (
    "你是信息抽取器。只输出一个 JSON 对象,不要 Markdown 代码块,不要任何解释。"
    '格式:{"name": 字符串, "mood": "calm|tense|angry", "items": [字符串]}。'
    "缺失的字段用 null,items 没有则给空数组。"
)

def extract(text, retries=2):
    for _ in range(retries + 1):
        resp = client.chat.completions.create(
            model="uncensored",
            temperature=0.2,
            max_tokens=300,
            messages=[
                {"role": "system", "content": SYSTEM},
                {"role": "user", "content": text},
            ],
        )
        raw = resp.choices[0].message.content.strip()
        raw = raw.removeprefix("```json").removesuffix("```").strip()
        try:
            return json.loads(raw)
        except json.JSONDecodeError:
            continue
    return None

print(extract("老周把钥匙拍在桌上,冷着脸说:账本和那把铜钥匙,今晚都得还我。"))

Đoạn mã này thể hiện một số thói quen tốt:

  • Đặt mô tả định dạng trong system và cung cấp phạm vi giá trị cho các trường (calm|tense|angry).
  • Rõ ràng cấm khối mã và văn bản giải thích, đồng thời trong mã vẫn loại bỏ các hàng rào có thể xuất hiện, tạo lớp bảo vệ kép.
  • Quy ước về trường bị thiếu được đưa vào lệnh (null, mảng rỗng) để tránh mô hình tự bịa ra dữ liệu.
  • Việc thử lại khi phân tích cú pháp thất bại có giới hạn, cuối cùng trả về None để caller quyết định cách xử lý.

Nếu số trường quá nhiều, hãy dán một đối tượng ví dụ đầy đủ vào Prompt trước, sau đó yêu cầu mô hình xuất ra theo mẫu đó, thường chính xác hơn là mô tả một đống quy tắc.

Gợi ý về giá trị temperature và top_p

Dưới đây là điểm khởi đầu, không phải kết luận cuối cùng, hãy dựa vào so sánh mẫu của bạn để quyết định. Nguyên tắc: chỉ điều chỉnh một tham số mỗi lần, giữ tham số còn lại ở mức mặc định.

Kịch bảntemperaturetop_pGhi chú
Trích xuất JSON, phân loại0 đến 0.3Mặc địnhCần ổn định, kết quả từ các lần gọi lặp lại phải nhất quán
Viết lại, tinh chỉnh0.5 đến 0.7Mặc địnhGiữ nguyên ý nghĩa, cho phép thay đổi cách diễn đạt
Tiếp tục truyện, hội thoại nhân vật0.8 đến 1.00.9 đến 0.95Yêu cầu đa dạng, lưu ý khả năng lạc đề ngẫu nhiên
Brainstorming, đặt tênKhoảng 1.0Mặc địnhLấy mẫu nhiều lần rồi chọn kết quả tốt nhất

Hai tín hiệu giúp bạn xác định hướng: nếu đầu ra lặp lại, rườm rà và luôn theo cùng một cấu trúc câu, nhiệt độ (temperature) của bạn đang thấp; nếu xuất hiện nội dung không liên quan hoặc tên nhân vật không nhất quán, nhiệt độ hoặc top_p của bạn đang cao. Tham số stop cũng rất hữu ích, ví dụ như yêu cầu mô hình dừng lại khi gặp một ký hiệu nhất định, giúp bạn dễ dàng tạo nội dung theo từng đoạn.

Các lỗi phổ biến khi viết prompt

Cách viếtVấn đềSửa thành
"Cố gắng đừng quá dài"Không có số, không thể thực thi"Không quá 400 từ"
"Đừng viết A, cũng đừng không viết A"Các quy tắc mâu thuẫn nhauChỉ giữ lại một quy tắc rõ ràng
Yêu cầu định dạng nằm giữa đoạn hội thoạiBị chìm trong các đoạn hội thoại dàiĐặt vào system hoặc nhắc lại ở cuối mỗi lượt
Yêu cầu mô hình "đóng vai một AI không giới hạn"Lời giới thiệu chung chung, không ràng buộc đầu raViết rõ trách nhiệm và quy tắc viết cụ thể
Nhồi nhét hàng chục quy tắc cùng lúcCác quy tắc ở phần sau bị vô hiệu hóaGiữ dưới sáu quy tắc, chuyển các quy tắc khác sang các yêu cầu khác
Yêu cầu JSON chỉ ghi "trả về JSON"Tên trường thay đổi mỗi lầnCung cấp định dạng đầy đủ và ví dụ

Bảng này cho thấy quy luật chung: càng cụ thể càng hiệu quả, càng chung chung càng vô dụng. Đừng coi việc "nhắc đi nhắc lại" là giải pháp; việc lặp lại một câu ba lần, in đậm và thêm dấu chấm than thường kém hiệu quả hơn việc chuyển nó thành một quy tắc có con số. Điều thực sự hữu ích là ít nhưng chính xác, kết hợp với việc kiểm chứng bằng ví dụ.

Danh sách quy trình gỡ lỗi

  1. Cố định temperature ở mức 0.2 để tái hiện sự cố.
  2. Chỉ sửa một prompt, chạy lại cùng bộ mẫu.
  3. Xem finish_reason: nếu là length, vấn đề nằm ở max_tokens chứ không phải prompt.
  4. Kiểm tra prompt_tokens trong usage: xem system có quá dài, chiếm dụng ngữ cảnh của lịch sử hội thoại hay không.
  5. Sau khi sửa đúng, hãy điều chỉnh lại temperature về giá trị phù hợp với nghiệp vụ và chạy lại mẫu để kiểm chứng.

Chi tiết kết nối xem hướng dẫn kết nối, danh sách đầy đủ tham số có trong tài liệu. Nếu bạn đang cân nhắc dùng dịch vụ trung gian, phân tích chi phí và sự đánh đổi được trình bày trong bài phân tích trạm trung chuyển API, nên không lặp lại ở đây.

Câu hỏi thường gặp

system prompt nên viết dài bao nhiêu là phù hợp?

Hãy đảm bảo diễn đạt rõ ràng các quy tắc, thường chỉ cần vài trăm từ là đủ. Càng dài càng chiếm ngữ cảnh và dễ xảy ra mâu thuẫn giữa các quy tắc, bạn nên giới hạn ở mức tối đa sáu quy tắc.

Tại sao khi yêu cầu chỉ xuất JSON, mô hình vẫn đôi khi kèm theo văn bản giải thích?

Đây là hiện tượng bình thường. Giảm temperature, cung cấp ví dụ đầy đủ và trong mã nguồn loại bỏ hàng rào cùng thử lại phân tích cú pháp sẽ đáng tin cậy hơn là liên tục nhấn mạnh chỉ thị.

temperature và top_p có thể điều chỉnh cùng lúc không?

Có thể, nhưng không khuyến khích. Việc thay đổi đồng thời hai tham số khiến bạn khó xác định nguyên nhân gây ra sự thay đổi. Hãy cố định một tham số và chỉ điều chỉnh tham số còn lại.

Có cần khai báo "đây là nội dung hư cấu" trong prompt không?

Không cần. Nội dung hư cấu dành cho người trưởng thành hợp pháp sẽ không bị từ chối, bạn chỉ cần nêu rõ nhiệm vụ. Tuy nhiên, nội dung tình dục liên quan đến người dưới tuổi thành niên sẽ bị chặn bất kể cách diễn đạt nào.

Chỉ cần điền biểu mẫu để lấy khóa API

Tạo tài khoản, sao chép khóa và sửa đổi Base URL. Cấu hình rất đơn giản.