Cách gọi Jev trên AiHubMix: Hướng dẫn phân loại có cấu trúc

AIHubMixĐọc 5 phút
Cách gọi Jev trên AiHubMix: Hướng dẫn phân loại có cấu trúc

Trả lời ngắn gọn: jev-1.13 không tạo ra văn bản. Bạn gửi POST một đoạn văn bản cùng một tập hợp câu hỏi được đặt tên tới https://aihubmix.com/v1/systemone, và nhận lại các câu trả lời có kiểu dữ liệu rõ ràng, được khóa theo tên câu hỏi của bạn: một danh mục, một điểm số hoặc một xác suất. Không cần phân tích cú pháp gì thêm. Dưới đây là một yêu cầu hoạt động, định dạng phản hồi đầy đủ, và một lỗi thiết kế duy nhất sẽ âm thầm làm giảm độ chính xác của bạn.

Jev dùng để làm gì

Hãy dùng khi bạn cần một đánh giá, chứ không phải một đoạn văn: định tuyến yêu cầu hỗ trợ, chấm mức độ nghiêm trọng, gắn cờ mức độ khẩn cấp, kiểm duyệt nội dung. Trang mô hình nêu rõ: "Không tạo văn bản, không có gì để phân tích cú pháp."

Hãy dùng một mô hình chat thông thường khi bạn cần giải thích, tóm tắt hoặc bất kỳ đầu ra tự do nào. jev không thể tạo ra những thứ đó.

Trước khi bắt đầu

  • [ ] Đã cài Python 3 (thư viện chuẩn là đủ)
  • [ ] Một tài khoản AiHubMix và khóa API
  • [ ] Khóa được xuất ra dưới tên AIHUBMIX_API_KEY, không bao giờ ghi cứng trong mã nguồn

Bạn không cần OpenAI SDK, LangChain hay gói requests.

Bước 1 — Nắm endpoint

POST https://aihubmix.com/v1/systemone
Authorization: Bearer YOUR_KEY
Content-Type: application/json

Đây là một route dành riêng cho mô hình, không phải /v1/chat/completions. Các client tương thích OpenAI không thể gọi nó. Hãy dùng HTTP thuần.

Bước 2 — Chọn loại câu hỏi

Có ba loại, và bạn có thể kết hợp tự do trong cùng một yêu cầu:

LoạiDùng đểBạn cung cấp
choiceChọn một danh mụccriteria dạng dict: nhãn → định nghĩa
scoreĐánh giá trên thang có thứ tựcriteria dạng list, thấp nhất trước
noulĐánh giá có/khôngkhông cần gì thêm ngoài instructions

Bước 3 — Xây dựng yêu cầu

state là văn bản cần được đánh giá. questions là các khóa do bạn tự đặt tên; phản hồi sẽ dùng cùng tên đó.

payload = {
    "model": "jev-1.13",
    "state": "Hi, I have been trying to connect my Stripe account for 3 days "
             "and it keeps failing. I am losing sales. Please help ASAP.",
    "questions": {
        "department": {
            "type": "choice",
            "instructions": "Which team should handle this",
            "criteria": {
                "billing":   "Payment or subscription issues",
                "technical": "Bugs or integration problems",
                "sales":     "Pricing or account questions",
            },
        },
        "frustration": {
            "type": "score",
            "instructions": "How frustrated the customer appears",
            "criteria": [
                "Calm, just stating facts",
                "Frustrated but civil",
                "Very angry, strong language",
            ],
        },
        "is_urgent": {
            "type": "noul",
            "instructions": "The message conveys urgency or time-sensitivity",
        },
    },
}

Bước 4 — Gửi bằng thư viện chuẩn

import json, os, urllib.error, urllib.request

def ask(payload):
    req = urllib.request.Request(
        "https://aihubmix.com/v1/systemone",
        data=json.dumps(payload).encode(),
        headers={"Authorization": "Bearer " + os.environ["AIHUBMIX_API_KEY"],
                 "Content-Type": "application/json"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            return json.loads(r.read())
    except urllib.error.HTTPError as e:
        raise SystemExit(f"HTTP {e.code}: {e.read().decode(errors='replace')[:500]}")

Hãy đặt việc xây dựng yêu cầu bên trong một hàm. Nếu bạn xây dựng và gửi ở cấp module, việc import tệp sẽ kích hoạt lại lệnh gọi và tiêu tốn token.

Bước 5 — Đọc câu trả lời

Mỗi câu trả lời lưu giá trị của nó dưới khóa khớp với type của nó, nên một hàm truy cập duy nhất có thể xử lý cả ba loại:

data = ask(payload)
for name, ans in data["answers"].items():
    kind = ans["type"]
    print(name, kind, ans[kind], ans.get("confidence"))
print("usage:", data.get("usage"))

Đầu ra đã được kiểm chứng:

department   choice  billing   0.51
frustration  score   1         1
is_urgent    noul    1         None
usage: {'input_tokens': 424, 'output_tokens': 73}

Bước 6 — Hiểu toàn bộ envelope

Vòng lặp in ra ẩn đi các trường hữu ích. Đây là JSON thô cho một câu trả lời kiểu score:

{
  "type": "score",
  "score": 1,
  "legend": {"0": "Calm, just stating facts", "1": "Frustrated but civil", "2": "Very angry, strong language"},
  "probabilities": {"0": 0, "1": 1, "2": 0},
  "confidence": 1
}
  • legend ánh xạ chỉ số trở lại cách diễn đạt của chính bạn. Số nguyên tự mô tả nên bạn không cần bảng tra cứu trong mã.
  • probabilities cho toàn bộ phân phối, hữu ích để phát hiện trường hợp hòa gần nhau.
  • noul không có trường confidence. Xác suất của nó chính là tín hiệu.

Cấp cao nhất cũng trả về usage, id, provider (TypeSafe), và phiên bản backend đã được phân giải typesafe/jev-1.13-20260917.

Lỗi làm giảm độ chính xác

Trong yêu cầu trên, department trả về billing với độ tin cậy là 0.51. Khi lặp lại đúng yêu cầu đó, kết quả trả về cùng nhãn nhưng độ tin cậy chỉ là 0.38 — câu trả lời ổn định, còn mức độ chắc chắn được báo cáo thì không.

Nguyên nhân nằm ở criteria, không phải ở mô hình. billing là "Vấn đề về thanh toán hoặc đăng ký" và technical là "Lỗi hoặc vấn đề tích hợp." Một tích hợp Stripe liên tục lỗi thực sự khớp với cả hai. Mô hình đang phản ánh một sự mơ hồ đã được viết sẵn trong schema.

Hai quy tắc trước khi đưa vào sản xuất:

  1. Viết các choice criteria loại trừ lẫn nhau. Nếu con người sẽ phân vân giữa hai nhãn, mô hình cũng sẽ như vậy.
  2. Đặt ngưỡng độ tin cậy và chuyển các kết quả có độ tin cậy thấp sang hàng đợi xử lý thủ công thay vì chấp nhận chúng như quyết định. Một mô hình thừa nhận sự không chắc chắn có giá trị hơn một mô hình che giấu nó.

Danh sách kiểm tra trước khi ra mắt

  • [ ] Khóa được nạp từ biến môi trường hoặc từ một tệp có quyền 600 mà VCS bỏ qua
  • [ ] Đã rà soát các choice criteria xem có chồng chéo không
  • [ ] Đã định nghĩa ngưỡng độ tin cậy, kèm đường dẫn dự phòng bên dưới ngưỡng đó
  • [ ] Các câu trả lời noul được xử lý riêng vì chúng không có confidence
  • [ ] Đã xóa các câu hỏi không dùng đến (3 câu hỏi tốn 424 input token; 2 câu hỏi tốn 355)
  • [ ] Các phản hồi không thuộc nhóm 2xx được ghi log cùng nội dung thô

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

Tôi có thể dùng OpenAI SDK không? Không. /v1/systemone không phải là route tương thích OpenAI.

Jev có thể trả về một câu hoặc bản tóm tắt không? Không. Nó chỉ trả lời các câu hỏi có kiểu dữ liệu mà bạn định nghĩa.

Mỗi yêu cầu có thể có bao nhiêu câu hỏi? Các bài kiểm tra đã xác minh sử dụng hai và ba câu hỏi. Mỗi câu hỏi làm tăng cả input và output token, nên chỉ đưa vào những gì bạn sẽ hành động dựa trên đó.

Có bí danh phiên bản nào không? Trang mô hình liệt kê bí danh jev-latest cùng với jev-1.13. Hãy ghim phiên bản cụ thể nếu khả năng tái lập là quan trọng.

Chi phí là bao nhiêu? Trang mô hình công bố $0.0462 / M cho input token và $0 / M cho output token. Đây là số liệu của nhà cung cấp, hãy xác nhận bảng giá hiện hành trước khi lập ngân sách.

Cửa sổ ngữ cảnh là bao nhiêu? Trang mô hình không nhất quán: 64K ở phần tiêu đề, 32K trong bảng nhà cung cấp. Hãy kiểm tra với đầu vào dài nhất của riêng bạn trước khi dựa vào một trong hai con số.

Phạm vi của hướng dẫn này

Mọi nội dung trên đều được kiểm chứng bằng ba lần gọi trực tiếp với cùng một đầu vào. Hướng dẫn không đề cập đến độ trễ, xử lý theo lô, thông lượng, hay hành vi trên các đầu vào khác với ví dụ. Hiện tượng trôi độ tin cậy là một quan sát đã được tái hiện, không phải tỷ lệ lỗi đã đo lường. Hãy lặp lại trên dữ liệu của riêng bạn trước khi đặt ngưỡng.

Bắt đầu với AiHubMix

jev-1.13 có sẵn qua AiHubMix, và trang mô hình chứa đầy đủ mọi nội dung mà hướng dẫn này đề cập: endpoint /v1/systemone, ba loại câu hỏi cùng định dạng criteria của chúng, đầy đủ các trường phản hồi, và bảng giá công bố là $0.0462 / M input token và $0 / M output token. Bí danh jev-latest trỏ tới bản phát hành mới nhất, nên nó luôn được cập nhật khi các phiên bản thay đổi.

Bắt đầu tại đây: https://aihubmix.com/model/jev-latest

Các bước tiếp theo:

  1. Tạo tài khoản AiHubMix và lấy khóa API
  2. Sao chép yêu cầu từ Bước 3 và hàm ask() từ Bước 4
  3. Thay state bằng một bản ghi thực từ hàng đợi của bạn
  4. So sánh kết quả với cách bạn đang phân loại bản ghi đó hiện nay

Nếu hướng dẫn này hữu ích, hãy đăng ký để nhận các bài viết tiếp theo về mô hình đầu ra có cấu trúc và pipeline phân loại.

Một cổng duy nhất tới nhiều nhà cung cấp AI. Sẵn sàng cho môi trường production.

Truy cập AIHubMix