optillm adalah proksi inferensi pengoptimalan yang kompatibel dengan OpenAI API yang menerapkan beberapa teknik canggih yang dapat meningkatkan akurasi dan kinerja LLM. Fokus saat ini adalah penerapan teknik yang meningkatkan penalaran atas pengkodean, pertanyaan logis dan matematis. Model frontier dapat dikalahkan menggunakan teknik ini di berbagai tugas dengan melakukan komputasi tambahan pada waktu inferensi.
pip install optillm
optillm
2024-10-22 07:45:05,612 - INFO - Loaded plugin: privacy
2024-10-22 07:45:06,293 - INFO - Loaded plugin: memory
2024-10-22 07:45:06,293 - INFO - Starting server with approach: auto
Kloning repositori dengan git
dan gunakan pip install
untuk mengatur dependensi.
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Siapkan variabel lingkungan OPENAI_API_KEY
(untuk OpenAI) atau variabel lingkungan AZURE_OPENAI_API_KEY
, AZURE_API_VERSION
dan AZURE_API_BASE
(untuk Azure OpenAI) atau variabel lingkungan AZURE_API_VERSION
dan AZURE_API_BASE
dan masuk menggunakan az login
untuk Azure OpenAI dengan identitas terkelola (lihat di sini).
Anda kemudian dapat menjalankan proxy optillm sebagai berikut.
python optillm .py
2024-09-06 07:57:14,191 - INFO - Starting server with approach: auto
2024-09-06 07:57:14,191 - INFO - Server configuration: { ' approach ' : ' auto ' , ' mcts_simulations ' : 2, ' mcts_exploration ' : 0.2, ' mcts_depth ' : 1, ' best_of_n ' : 3, ' model ' : ' gpt-4o-mini ' , ' rstar_max_depth ' : 3, ' rstar_num_rollouts ' : 5, ' rstar_c ' : 1.4, ' base_url ' : ' ' }
* Serving Flask app ' optillm '
* Debug mode: off
2024-09-06 07:57:14,212 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://192.168.10.48:8000
2024-09-06 07:57:14,212 - INFO - Press CTRL+C to quit
Setelah proksi berjalan, Anda dapat menggunakannya sebagai pengganti klien OpenAI dengan mengatur base_url
sebagai http://localhost:8000/v1
.
import os
from openai import OpenAI
OPENAI_KEY = os . environ . get ( "OPENAI_API_KEY" )
OPENAI_BASE_URL = "http://localhost:8000/v1"
client = OpenAI ( api_key = OPENAI_KEY , base_url = OPENAI_BASE_URL )
response = client . chat . completions . create (
model = "moa-gpt-4o" ,
messages = [
{
"role" : "user" ,
"content" : "Write a Python program to build an RL model to recite text from any position that the user provides, using only numpy."
}
],
temperature = 0.2
)
print ( response )
Kode di atas berlaku untuk OpenAI dan Azure OpenAI, ingatlah untuk mengisi variabel env OPENAI_API_KEY
dengan kunci yang tepat. Ada beberapa cara untuk mengontrol teknik pengoptimalan, yang diterapkan dalam urutan preferensi berikut:
{slug}-model-name
. Misalnya dalam kode di atas kita menggunakan moa
atau campuran agen sebagai pendekatan optimasi. Di log proksi Anda akan melihat tampilan berikut yang menunjukkan moa
telah digunakan dengan model dasar sebagai gpt-4o-mini
. 2024-09-06 08:35:32,597 - INFO - Using approach moa, with gpt-4o-mini
2024-09-06 08:35:35,358 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:39,553 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,795 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions " HTTP/1.1 200 OK "
2024-09-06 08:35:44,797 - INFO - 127.0.0.1 - - [06/Sep/2024 08:35:44] " POST /v1/chat/completions HTTP/1.1 " 200 -
optillm _approach
di extra_body
. response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " " }],
temperature=0.2,
extra_body={ " optillm _approach " : " bon|moa|mcts " }
)
system
atau perintah user
Anda, dalam tag < optillm _approach> </ optillm _approach>
. response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " < optillm _approach>re2</ optillm _approach> How many r's are there in strawberry? " }],
temperature=0.2
)
Tip
Anda juga dapat menggabungkan teknik yang berbeda baik dengan menggunakan simbol &
dan |
. Saat Anda menggunakan &
teknik tersebut diproses dalam urutan dari kiri ke kanan dalam saluran dengan respons dari tahap sebelumnya digunakan sebagai permintaan ke tahap berikutnya. Sedangkan dengan |
kami menjalankan semua permintaan secara paralel dan menghasilkan beberapa respons yang dikembalikan sebagai daftar.
Harap dicatat bahwa konvensi yang dijelaskan di atas hanya berfungsi ketika server optillm telah dimulai dengan pendekatan inferensi disetel ke auto
. Jika tidak, atribut model
dalam permintaan klien harus disetel dengan nama model saja.
Kami sekarang mendukung semua penyedia LLM (dengan menggunakan SDK LiteLLM). Misalnya, Anda dapat menggunakan model Flash Gemini dengan moa
dengan menyetel meneruskan kunci api ke variabel lingkungan os.environ['GEMINI_API_KEY']
lalu memanggil model moa-gemini/gemini-1.5-flash-002
. Pada output Anda akan melihat bahwa LiteLLM digunakan untuk memanggil model dasar.
9:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,011 - INFO -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
2024-09-29 19:43:21,481 - INFO - HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-002:generateContent ? key=[redacted] " HTTP/1.1 200 OK "
19:43:21 - LiteLLM:INFO: utils.py:988 - Wrapper: Completed Call, calling success_handler
2024-09-29 19:43:21,483 - INFO - Wrapper: Completed Call, calling success_handler
19:43:21 - LiteLLM:INFO: utils.py:2952 -
LiteLLM completion () model= gemini-1.5-flash-002; provider = gemini
Tip
optillm adalah proksi transparan dan akan bekerja dengan API atau penyedia LLM mana pun yang memiliki titik akhir penyelesaian obrolan yang kompatibel dengan API OpenAI, dan pada gilirannya, optillm juga memperlihatkan titik akhir penyelesaian obrolan yang kompatibel dengan API OpenAI yang sama. Ini akan memungkinkan Anda untuk mengintegrasikannya ke dalam alat atau kerangka kerja yang ada dengan mudah. Jika LLM yang ingin Anda gunakan tidak memiliki titik akhir yang kompatibel dengan OpenAI API (seperti Google atau Anthropic), Anda dapat menggunakan server proxy LiteLLM yang mendukung sebagian besar LLM.
Diagram urutan berikut menggambarkan bagaimana permintaan dan tanggapan melewati optillm .
Dalam diagram:
A
adalah alat yang sudah ada (seperti oobabooga), kerangka kerja (seperti tambal sulam) atau kode Anda sendiri tempat Anda ingin menggunakan hasil dari optillm . Anda dapat menggunakannya secara langsung menggunakan SDK klien OpenAI apa pun.B
adalah layanan optillm (berjalan secara langsung atau dalam wadah buruh pelabuhan) yang akan mengirimkan permintaan ke base_url
.C
adalah layanan apa pun yang menyediakan titik akhir penyelesaian obrolan yang kompatibel dengan OpenAI API. Kami mendukung pemuatan model HuggingFace atau LoRA apa pun secara langsung di optillm . Untuk menggunakan server inferensi bawaan, atur optillm _API_KEY
ke nilai apa pun (mis. export optillm _API_KEY=" optillm "
) lalu gunakan nilai yang sama di klien OpenAI Anda. Anda dapat meneruskan model HuggingFace apa pun di bidang model. Jika ini adalah model pribadi, pastikan Anda menyetel variabel lingkungan HF_TOKEN
dengan kunci HuggingFace Anda. Kami juga mendukung penambahan sejumlah LoRA di atas model dengan menggunakan pemisah +
.
Misalnya Kode berikut memuat model dasar meta-llama/Llama-3.2-1B-Instruct
dan kemudian menambahkan dua LoRA di atas - patched-codes/Llama-3.2-1B-FixVulns
dan patched-codes/Llama-3.2-1B-FastApply
. Anda dapat menentukan LoRA mana yang akan digunakan menggunakan parameter active_adapter
di bidang extra_args
klien OpenAI SDK. Secara default kami akan memuat adaptor yang terakhir ditentukan.
OPENAI_BASE_URL = "http://localhost:8000/v1"
OPENAI_KEY = " optillm "
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct+patched-codes/Llama-3.2-1B-FastApply+patched-codes/Llama-3.2-1B-FixVulns" ,
messages = messages ,
temperature = 0.2 ,
logprobs = True ,
top_logprobs = 3 ,
extra_body = { "active_adapter" : "patched-codes/Llama-3.2-1B-FastApply" },
)
Anda juga dapat menggunakan teknik decoding alternatif seperti cot_decoding
dan entropy_decoding
langsung dengan server inferensi lokal.
response = client . chat . completions . create (
model = "meta-llama/Llama-3.2-1B-Instruct" ,
messages = messages ,
temperature = 0.2 ,
extra_body = {
"decoding" : "cot_decoding" , # or "entropy_decoding"
# CoT specific params
"k" : 10 ,
"aggregate_paths" : True ,
# OR Entropy specific params
"top_k" : 27 ,
"min_p" : 0.03 ,
}
)
OPENAI_API_KEY
ke nilai placeholderexport OPENAI_API_KEY="sk-no-key"
./llama-server -c 4096 -m path_to_model
untuk memulai server dengan model yang ditentukan dan panjang konteks 4096 tokenpython3 optillm .py --base_url base_url
untuk memulai proksipython3 optillm .py --base_url http://localhost:8080/v1
Peringatan
Perhatikan bahwa API Antropik, llama-server (dan ollama) saat ini tidak mendukung pengambilan sampel beberapa respons dari suatu model, sehingga membatasi pendekatan yang tersedia sebagai berikut: cot_reflection
, leap
, plansearch
, rstar
, rto
, self_consistency
, re2
, dan z3
. Untuk model di HuggingFace, Anda dapat menggunakan server inferensi lokal bawaan karena mendukung banyak respons.
Mendekati | Siput | Keterangan |
---|---|---|
CoT dengan Refleksi | cot_reflection | Mengimplementasikan penalaran rantai pemikiran dengan bagian <thinking>, <reflection> dan <output> |
Pencarian Rencana | plansearch | Menerapkan algoritma pencarian atas rencana kandidat untuk memecahkan masalah dalam bahasa alami |
Membaca kembali | re2 | Menerapkan pembacaan ulang untuk meningkatkan penalaran dengan memproses kueri dua kali |
Konsistensi Diri | self_consistency | Menerapkan metode konsistensi diri tingkat lanjut |
Pemecah Z3 | z3 | Memanfaatkan pembukti teorema Z3 untuk penalaran logis |
Algoritma R* | rstar | Menerapkan algoritma R* untuk pemecahan masalah |
MELOMPAT | leap | Mempelajari prinsip-prinsip khusus tugas dari beberapa contoh contoh |
Optimasi Perjalanan Pulang Pergi | rto | Mengoptimalkan respons melalui proses bolak-balik |
Pengambilan Sampel N Terbaik | bon | Menghasilkan banyak tanggapan dan memilih yang terbaik |
Campuran Agen | moa | Menggabungkan tanggapan dari berbagai kritik |
Pencarian Pohon Monte Carlo | mcts | Menggunakan MCTS untuk pengambilan keputusan dalam tanggapan obrolan |
Permainan PV | pvg | Menerapkan pendekatan permainan pemverifikasi pada waktu inferensi |
Dekode CoT | T/A untuk proksi | Menerapkan penguraian rantai pemikiran untuk memperoleh penalaran tanpa dorongan eksplisit |
Penguraian Entropi | T/A untuk proksi | Menerapkan pengambilan sampel adaptif berdasarkan ketidakpastian token selama pembuatan |
Pengaya | Siput | Keterangan |
---|---|---|
Perute | router | Menggunakan model optillm -bert-uncased untuk merutekan permintaan ke pendekatan berbeda berdasarkan permintaan pengguna |
Rantai Kode | coc | Menerapkan pendekatan rantai kode yang menggabungkan CoT dengan eksekusi kode dan simulasi kode berbasis LLM |
Ingatan | memory | Menerapkan lapisan memori jangka pendek, memungkinkan Anda menggunakan panjang konteks tak terbatas dengan LLM apa pun |
Pribadi | privacy | Anonimkan data PII dalam permintaan dan deanonimkan kembali ke nilai asli sebagai respons |
Baca URL | readurls | Membaca semua URL yang ditemukan dalam permintaan, mengambil konten di URL dan menambahkannya ke konteksnya |
Jalankan Kode | executecode | Memungkinkan penggunaan penerjemah kode untuk mengeksekusi kode python dalam permintaan dan respons yang dihasilkan LLM |
optillm mendukung berbagai argumen baris perintah dan variabel lingkungan untuk konfigurasi.
Parameter | Keterangan | Nilai Bawaan |
---|---|---|
--approach | Pendekatan inferensi yang digunakan | "auto" |
--simulations | Jumlah simulasi MCTS | 2 |
--exploration | Bobot eksplorasi untuk MCTS | 0,2 |
--depth | Kedalaman simulasi untuk MCTS | 1 |
--best-of-n | Jumlah sampel untuk pendekatan best_of_n | 3 |
--model | Model OpenAI yang akan digunakan | "gpt-4o-mini" |
--base-url | URL dasar untuk titik akhir yang kompatibel dengan OpenAI | "" |
--rstar-max-depth | Kedalaman maksimum untuk algoritma rStar | 3 |
--rstar-num-rollouts | Jumlah peluncuran algoritma rStar | 5 |
--rstar-c | Konstanta eksplorasi untuk algoritma rStar | 1.4 |
--n | Jumlah tanggapan akhir yang akan dikembalikan | 1 |
--return-full-response | Kembalikan respons lengkap termasuk CoT dengan tag | False |
--port | Tentukan port untuk menjalankan proxy | 8000 |
-- optillm -api-key | Kunci API opsional untuk autentikasi klien agar optillm | "" |
Saat menggunakan Docker, ini dapat ditetapkan sebagai variabel lingkungan yang diawali dengan optillm _
.
optillm secara opsional dapat dibangun dan dijalankan menggunakan Docker dan Dockerfile yang disediakan.
Pastikan Anda telah menginstal Docker dan Docker Compose di sistem Anda.
Perbarui variabel lingkungan di file docker-compose.yaml atau buat file .env
di direktori root proyek dan tambahkan variabel lingkungan apa pun yang ingin Anda atur. Misalnya, untuk menyetel kunci API OpenAI, tambahkan baris berikut ke file .env
:
OPENAI_API_KEY=your_openai_api_key_here
Jalankan perintah berikut untuk memulai optillm :
docker compose up -d
Ini akan membangun image Docker jika tidak ada dan memulai layanan optillm .
optillm akan tersedia di http://localhost:8000
.
Saat menggunakan Docker, Anda dapat mengatur parameter ini sebagai variabel lingkungan. Misalnya, untuk menetapkan pendekatan dan model, Anda akan menggunakan:
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
Untuk mengamankan proksi optillm dengan kunci API, atur variabel lingkungan optillm _API_KEY
:
optillm _API_KEY=your_secret_api_key
Ketika kunci API disetel, klien harus menyertakannya dalam permintaan mereka menggunakan header Authorization
:
Authorization: Bearer your_secret_api_key
Model | Skor |
---|---|
o1-mini | 56.67 |
coc-claude-3-5-soneta-20241022 | 46.67 |
coc-gemini/gemini-exp-1121 | 46.67 |
o1-pratinjau | 40.00 |
gemini-exp-1114 | 36.67 |
claude-3-5-soneta-20241022 | 20.00 |
gemini-1.5-pro-002 | 20.00 |
gemini-1.5-flash-002 | 16.67 |
Model | Ketepatan |
---|---|
readurls&memori-gpt-4o-mini | 61.29 |
gpt-4o-mini | 50.61 |
readurls&memori-Gemma2-9b | 30.1 |
Permata2-9b | 5.1 |
Permata2-27b | 30.8 |
Gemini Flash 1.5 | 66.5 |
Gemini Pro 1.5 | 72.9 |
Model | lulus@1 | lulus@5 | lulus@10 |
---|---|---|---|
plansearch-gpt-4o-mini | 44.03 | 59.31 | 63.5 |
gpt-4o-mini | 43.9 | 50.61 | 53.25 |
claude-3.5-soneta | 51.3 | ||
gpt-4o-2024-05-13 | 45.2 | ||
gpt-4-turbo-2024-04-09 | 44.2 |
Karena optillm adalah pengganti OpenAI API, Anda dapat dengan mudah mengintegrasikannya dengan alat dan kerangka kerja yang ada menggunakan klien OpenAI. Kami menggunakan optillm dengan patchwork yang merupakan kerangka kerja sumber terbuka yang mengotomatiskan proses pengembangan seperti tinjauan PR, perbaikan bug, patching keamanan menggunakan alur kerja yang disebut patchflows. Kami melihat peningkatan kinerja yang sangat besar di semua alur patch yang didukung seperti yang ditunjukkan di bawah ini saat menggunakan pendekatan campuran agen (moa).