Buat Chatbot dari API LLM: Tutorial Python
Model Abliterated adalah model bahasa besar di mana mekanisme penegakan penolakan keamanan telah dihapus, memungkinkan model menjawab pertanyaan kontroversial, dewasa, atau niche tanpa terkena filter konten. Pendekatan ini memberikan pengembang kontrol penuh atas suara model dan batas pengetahuan, yang sangat berharga untuk pemrograman, permainan peran, dan penulisan kreatif di mana pagar pembatas standar mungkin memblokir output yang berguna.
Diperbarui

Poin utama
- API bersifat stateless, sehingga kode Anda yang menyimpan riwayat percakapan dan mengirimkannya pada setiap permintaan.
- Streaming, pemanggilan fungsi, dan mode JSON semuanya menggunakan parameter standar OpenAI.
- Potong atau ringkas riwayat sebelum mendekati jendela 100.000 token.
- 1.000 obrolan dengan 2.000 token input dan 400 token output berbiaya sekitar $0,50.
Ide intinya: chatbot adalah loop dan daftar
Model bahasa tidak mengingat apa pun di antara permintaan. Setiap panggilan ke POST /v1/chat/completions bersifat independen. Apa yang terasa seperti memori adalah program Anda yang mengirim kembali pesan sebelumnya, masing-masing ditandai dengan peran: system untuk instruksi tetap, user untuk apa yang diketik orang, assistant untuk balasan model sebelumnya.
Jadi arsitekturnya kecil. Simpan daftar. Lampirkan pesan pengguna. Kirim daftar. Lampirkan balasan. Ulangi. Semua hal lain dalam tutorial ini, dari streaming hingga alat, adalah variasi dari loop tersebut.
API di sini kompatibel dengan OpenAI, sehingga Anda menggunakan paket openai biasa. Atur base URL ke https://api.abliterated.cc/v1, gunakan kunci Anda, dan atur model ke uncensored. Dapatkan kunci dari halaman kunci API; kredit uji coba $0,50 sudah cukup untuk ratusan pesan uji pendek.
Langkah 1: chatbot konsol yang berfungsi
Instal SDK dengan pip install openai dan jalankan ini.
from openai import OpenAI
client = OpenAI(
base_url="https://api.abliterated.cc/v1",
api_key="YOUR_KEY",
)
messages = [
{"role": "system", "content": "You are a concise, friendly support assistant for a bike shop."}
]
while True:
text = input("you: ")
if text.strip() in {"quit", "exit"}:
break
messages.append({"role": "user", "content": text})
resp = client.chat.completions.create(
model="uncensored",
messages=messages,
temperature=0.7,
)
answer = resp.choices[0].message.content
messages.append({"role": "assistant", "content": answer})
print("bot:", answer)
Itu adalah chatbot lengkap. Pesan sistem menetapkan tugasnya, daftar membawa memori, dan temperature mengontrol seberapa bervariasi balasan. Turunkan menjadi 0,2 untuk bot dukungan faktual, naikkan menjadi 1,0 untuk yang kreatif.
Tulis prompt sistem yang menetapkan tugas
Pesan sistem adalah cara termurah untuk meningkatkan chatbot. Buatlah pesan tersebut singkat dan spesifik. Sebutkan peran, audiens, panjang dan nada balasan, serta apa yang harus dilakukan ketika bot tidak tahu. Sebuah prompt seperti "Anda menjawab pertanyaan untuk toko sepeda. Balas dalam maksimal tiga kalimat. Jika pertanyaannya tentang harga perbaikan, katakan bahwa mekanik harus memeriksa sepeda" lebih efektif daripada satu halaman berisi berbagai keunggulan umum.
Dua kebiasaan memberikan hasil. Pertama, masukkan aturan dalam bentuk tindakan, bukan sikap: "tanyakan satu pertanyaan klarifikasi ketika permintaan ambigu" daripada "bersikap membantu". Kedua, uji dengan input bermusuhan, seperti pesan kosong, salinan sangat panjang, dan permintaan yang tidak ada hubungannya dengan produk Anda. Perbaiki prompt berdasarkan apa yang Anda lihat, lalu simpan input tersebut sebagai daftar regresi.
Karena pesan sistem dikirim ulang setiap giliran, setiap kata di dalamnya ditagih pada setiap permintaan. Prompt 400 token selama 1.000 obrolan dengan 5 giliran masing-masing menambah 2.000.000 token input, atau 2 x $0,15 = $0,30. Itu kecil, tetapi itu menunjukkan mengapa prompt yang besar bertambah banyak pada volume tinggi.
Langkah 2: alirkan balasan
Menunggu jawaban lengkap terasa lambat di jendela obrolan. Atur stream: true dan cetak bagian saat tiba. Stream menggunakan server-sent events dan berakhir dengan blok penggunaan, sehingga Anda dapat mencatat jumlah token.
from openai import OpenAI
client = OpenAI(base_url="https://api.abliterated.cc/v1", api_key="YOUR_KEY")
messages = [{"role": "user", "content": "Explain tire pressure in two sentences."}]
stream = client.chat.completions.create(
model="uncensored",
messages=messages,
stream=True,
)
reply = ""
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
part = chunk.choices[0].delta.content
reply += part
print(part, end="", flush=True)
if getattr(chunk, "usage", None):
print("\ntokens:", chunk.usage.prompt_tokens, chunk.usage.completion_tokens)
Ingat untuk menambahkan reply yang telah disusun ke dalam riwayat Anda, atau putaran berikutnya tidak akan tahu apa yang dikatakan bot.
Langkah 3: kelola konteks sebelum membesar
Jendela konteks adalah 100.000 token, dibagi antara prompt dan hasil. Sebagian besar chatbot tidak pernah mendekati batas itu, tetapi biaya tumbuh seiring riwayat karena Anda membayar untuk seluruh prompt pada setiap giliran. Kebijakan sederhana menjaga keduanya terkendali:
- Selalu pertahankan pesan sistem.
- Simpan 10 hingga 20 pesan terakhir apa adanya.
- Ketika daftar melewati batas ukuran yang Anda pilih, seperti 8.000 token estimasi, kirim blok tertua ke model dengan instruksi "ringkas percakapan ini dalam kurang dari 150 kata", dan ganti blok tersebut dengan ringkasan sebagai pesan sistem.
Perkiraan kasar satu token per empat karakter Inggris sudah cukup untuk pemicu. Angka penggunaan dalam setiap respons memberi Anda angka tepat setelah fakta, sehingga Anda dapat mengkalibrasi batasnya.
Jika Anda memangkas dengan membuang pesan tertua, buang mereka dalam pasangan pengguna dan asisten. Balasan tanpa pertanyaan, atau pertanyaan tanpa balasan, membingungkan model lebih dari yang Anda duga.
Langkah 4: berikan alat kepada bot
Pemanggilan fungsi memungkinkan model meminta kode Anda melakukan sesuatu, seperti mencari pesanan. Anda mendeskripsikan fungsi dengan tools, model membalas dengan entri tool_calls, Anda menjalankan fungsi, dan Anda mengirim hasilnya kembali sebagai pesan role: "tool".
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.abliterated.cc/v1", api_key="YOUR_KEY")
tools = [{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Look up the status of an order by its id",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
},
}]
def get_order_status(order_id):
return {"order_id": order_id, "status": "shipped"}
messages = [{"role": "user", "content": "Where is order A1042?"}]
resp = client.chat.completions.create(
model="uncensored", messages=messages, tools=tools, tool_choice="auto"
)
msg = resp.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_order_status(**args)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result),
})
final = client.chat.completions.create(
model="uncensored", messages=messages, tools=tools
)
print(final.choices[0].message.content)
Selalu validasi argumen sebelum menjalankan apa pun dengan efek samping. Model mengusulkan panggilan; kode Anda memutuskan apakah akan mengeksekusinya.
Langkah 5: output terstruktur dengan mode JSON
Ketika langkah selanjutnya dalam program Anda membutuhkan data daripada prosa, seperti mengurutkan pesan ke dalam kategori, gunakan mode JSON dengan response_format. Sebutkan kata JSON dan kunci yang diharapkan dalam prompt Anda juga.
curl https://api.abliterated.cc/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"response_format": {"type": "json_object"},
"messages": [
{"role": "system", "content": "Reply with JSON: {\"intent\": string, \"urgent\": boolean}"},
{"role": "user", "content": "My brakes squeal and I ride tomorrow morning."}
]
}'
Tetap bungkus json.loads dalam blok try. Jika parsing gagal, coba lagi sekali dengan teks kesalahan yang ditambahkan; permintaan yang gagal tidak dikenakan biaya.
Catatan kesalahan, biaya, dan peluncuran
Tangani kesalahan, percobaan ulang, dan batas laju
Pengguna nyata mengirim permintaan pada waktu yang canggung, dan jaringan gagal. Bungkus panggilan sehingga satu respons buruk tidak merusak percakapan.
import time
from openai import OpenAI, APIError, RateLimitError
client = OpenAI(base_url="https://api.abliterated.cc/v1", api_key="YOUR_KEY")
def chat(messages, tries=3):
for attempt in range(tries):
try:
resp = client.chat.completions.create(
model="uncensored", messages=messages, temperature=0.7
)
return resp.choices[0].message.content
except RateLimitError:
time.sleep(2 ** attempt)
except APIError as exc:
if attempt == tries - 1:
raise
time.sleep(1)
return "Sorry, the assistant is busy. Please try again in a moment."
Kunci penuh mengizinkan 8 permintaan simultan dan 300 permintaan per menit; kunci uji coba mengizinkan 2 dan 60. Jika bot Anda melayani banyak pengguna sekaligus, antrikan permintaan dengan batas worker di bawah 8 daripada mengandalkan coba ulang. Karena permintaan yang gagal tidak ditagih, mencoba ulang tidak memiliki biaya token. Jaga jumlah coba ulang kecil agar kegagalan nyata gagal cepat.
Juga catat header X-Request-Id pada setiap giliran percakapan. Saat balasan tampak salah, id tersebut memungkinkan Anda menemukan permintaan yang tepat di kemudian hari.
Biaya dan peluncuran
Harga adalah $0,15 per 1M token input dan $0,50 per 1M token output. Katakanlah obrolan dukungan menggunakan 2.000 token input secara total dan 400 token output.
- Input: 0,002M x $0,15 = $0,0003
- Output: 0,0004M x $0,50 = $0,0002
- Satu obrolan: $0,0005, jadi 1.000 obrolan berbiaya $0,50
Periksa tarif saat ini dan bonus isi saldo di halaman harga. Untuk produksi, simpan kunci di server Anda, jangan di kode browser, dan pantau header respons X-Balance-USD untuk memberi tahu Anda sebelum saldo habis. Kunci penuh memungkinkan 8 permintaan paralel dan 300 permintaan per menit, jadi antrikan lonjakan permintaan alih-alih mengirimkannya sekaligus. Halaman dokumentasi mencantumkan setiap parameter yang didukung.
Panduan lainnya
Tanya jawab
Apakah saya memerlukan kerangka kerja untuk membuat chatbot?
Tidak. SDK OpenAI dan daftar pesan sudah cukup untuk bot yang berfungsi. Tambahkan kerangka kerja nanti hanya jika Anda membutuhkan fiturnya.
Apakah API mengingat pesan sebelumnya?
Tidak. Setiap permintaan bersifat independen, sehingga kode Anda harus mengirim ulang riwayat setiap kali.
Bagaimana cara mencegah riwayat menjadi terlalu panjang?
Pertahankan pesan sistem dan putaran terbaru, serta ringkas putaran yang lebih lama menjadi catatan singkat setelah daftar melebihi ukuran yang Anda atur.
Dapatkah bot memanggil fungsi Anda sendiri?
Ya. Teruskan alat dan tool_choice, jalankan fungsi ketika balasan berisi tool_calls, dan kembalikan hasilnya sebagai pesan alat.
Kunci Anda hanya selangkah lagi dari satu formulir
Buat akun, salin kunci, ubah URL dasar. Itu saja seluruh proses pengaturannya.