optillm 은 LLM의 정확성과 성능을 향상시킬 수 있는 여러 가지 최첨단 기술을 구현하는 OpenAI API 호환 최적화 추론 프록시입니다. 현재 초점은 코딩, 논리적, 수학적 쿼리에 대한 추론을 향상시키는 기술을 구현하는 데 있습니다. 추론 시 추가 컴퓨팅을 수행함으로써 다양한 작업에 걸쳐 이러한 기술을 사용하여 프론티어 모델을 능가하는 것이 가능합니다.
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
git
으로 저장소를 복제하고 pip install
사용하여 종속성을 설정합니다.
git clone https://github.com/codelion/optillm.git
cd optillm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
OPENAI_API_KEY
환경 변수(OpenAI의 경우) 또는 AZURE_OPENAI_API_KEY
, AZURE_API_VERSION
및 AZURE_API_BASE
환경 변수(Azure OpenAI의 경우) 또는 AZURE_API_VERSION
및 AZURE_API_BASE
환경 변수를 설정하고 관리 ID가 있는 Azure OpenAI에 대해 az login
사용하여 로그인합니다(여기 참조).
그런 다음 다음과 같이 optillm 프록시를 실행할 수 있습니다.
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
프록시가 실행되면 base_url
http://localhost:8000/v1
로 설정하여 OpenAI 클라이언트를 대체하는 데 사용할 수 있습니다.
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 )
위의 코드는 OpenAI와 Azure OpenAI 모두에 적용됩니다. OPENAI_API_KEY
환경 변수를 적절한 키로 채우는 것을 기억하세요. 최적화 기술을 제어하는 방법에는 여러 가지가 있으며 다음과 같은 기본 설정 순서에 따라 적용됩니다.
{slug}-model-name
앞에 슬러그를 추가하여 최적화에 사용하는 기술을 제어할 수 있습니다. 예를 들어 위 코드에서는 최적화 접근 방식으로 moa
또는 에이전트 혼합을 사용하고 있습니다. 프록시 로그에서 moa
기본 모델과 함께 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 -
extra_body
의 optillm _approach
필드에 슬러그를 전달할 수 있습니다. response = client.chat.completions.create(
model= " gpt-4o-mini " ,
messages=[{ " role " : " user " , " content " : " " }],
temperature=0.2,
extra_body={ " optillm _approach " : " bon|moa|mcts " }
)
system
이나 user
프롬프트의 < 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
)
팁
&
및 |
기호를 사용하여 다양한 기술을 결합할 수도 있습니다. . &
기술을 사용하면 이전 단계의 응답이 다음 단계의 요청으로 사용되는 파이프라인에서 왼쪽에서 오른쪽 순서로 처리됩니다. 동안 |
우리는 모든 요청을 병렬로 실행하고 목록으로 반환되는 여러 응답을 생성합니다.
위에 설명된 규칙은 추론 접근 방식이 auto
로 설정된 optillm 서버가 시작된 경우에만 작동합니다. 그렇지 않으면 클라이언트 요청의 model
속성을 모델 이름만으로 설정해야 합니다.
이제 우리는 모든 LLM 공급자를 지원합니다(LiteLLM SDK를 래핑하여). 예를 들어 환경 변수 os.environ['GEMINI_API_KEY']
에 api 키를 전달한 다음 moa-gemini/gemini-1.5-flash-002
모델을 호출하여 moa
와 함께 Gemini Flash 모델을 사용할 수 있습니다. 그러면 출력에서 LiteLLM이 기본 모델을 호출하는 데 사용되는 것을 볼 수 있습니다.
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
팁
optillm 은 투명한 프록시이며 OpenAI API 호환 채팅 완료 엔드포인트가 있는 모든 LLM API 또는 공급자와 작동하며, 결과적으로 optillm 동일한 OpenAI API 호환 채팅 완료 엔드포인트도 노출합니다. 이를 통해 기존 도구나 프레임워크에 쉽게 통합할 수 있습니다. 사용하려는 LLM에 OpenAI API 호환 엔드포인트(예: Google 또는 Anthropic)가 없는 경우 대부분의 LLM을 지원하는 LiteLLM 프록시 서버를 사용할 수 있습니다.
다음 시퀀스 다이어그램은 요청과 응답이 optillm 통과하는 방법을 보여줍니다.
다이어그램에서:
A
optillm 의 결과를 사용하려는 기존 도구(oobabooga 등), 프레임워크(패치워크 등) 또는 자체 코드입니다. OpenAI 클라이언트 SDK를 사용하여 직접 사용할 수 있습니다.B
base_url
에 요청을 보내는 optillm 서비스(직접 또는 docker 컨테이너에서 실행)입니다.C
OpenAI API 호환 채팅 완료 엔드포인트를 제공하는 서비스입니다. 우리는 optillm 에서 HuggingFace 모델 또는 LoRA를 직접 로드하는 것을 지원합니다. 내장 추론 서버를 사용하려면 optillm _API_KEY
임의의 값(예: export optillm _API_KEY=" optillm "
)으로 설정한 다음 OpenAI 클라이언트에서 동일한 값을 사용하십시오. 모델 필드에서 HuggingFace 모델을 전달할 수 있습니다. 비공개 모델인 경우 HuggingFace 키를 사용하여 HF_TOKEN
환경 변수를 설정했는지 확인하세요. +
구분 기호를 사용하여 모델 위에 LoRA를 원하는 만큼 추가할 수도 있습니다.
예를 들어 다음 코드는 기본 모델 meta-llama/Llama-3.2-1B-Instruct
로드한 다음 맨 위에 두 개의 LoRA( patched-codes/Llama-3.2-1B-FixVulns
및 patched-codes/Llama-3.2-1B-FastApply
를 추가합니다. . OpenAI SDK 클라이언트의 extra_args
필드에 있는 active_adapter
매개변수를 사용하여 사용할 LoRA를 지정할 수 있습니다. 기본적으로 마지막으로 지정된 어댑터를 로드합니다.
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" },
)
cot_decoding
및 entropy_decoding
과 같은 대체 디코딩 기술을 로컬 추론 서버에서 직접 사용할 수도 있습니다.
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
환경 변수를 자리 표시자 값으로 설정export OPENAI_API_KEY="sk-no-key"
./llama-server -c 4096 -m path_to_model
실행하여 지정된 모델과 4096 토큰의 컨텍스트 길이로 서버를 시작합니다.python3 optillm .py --base_url base_url
실행하여 프록시를 시작하세요.python3 optillm .py --base_url http://localhost:8080/v1
실행합니다. 경고
Anthropic API인 llama-server(및 ollama)는 현재 모델에서 다중 응답 샘플링을 지원하지 않으므로 사용 가능한 접근 방식이 cot_reflection
, leap
, plansearch
, rstar
, rto
, self_consistency
, re2
및 z3
으로 제한됩니다. HuggingFace 모델의 경우 다중 응답을 지원하는 내장 로컬 추론 서버를 사용할 수 있습니다.
접근하다 | 강타 | 설명 |
---|---|---|
반사 기능이 있는 CoT | cot_reflection | <thinking>, <reflection> 및 <output> 섹션을 사용하여 사고 연쇄 추론을 구현합니다. |
계획검색 | plansearch | 자연어 문제 해결을 위한 후보 계획에 대한 검색 알고리즘을 구현합니다. |
다시 읽기 | re2 | 쿼리를 2번 처리하여 추론력 향상을 위한 재읽기를 구현합니다. |
자기 일관성 | self_consistency | 고급 자체 일관성 방법 구현 |
Z3 솔버 | z3 | 논리적 추론을 위해 Z3 정리 증명자를 활용합니다. |
R* 알고리즘 | rstar | 문제 해결을 위한 R* 알고리즘 구현 |
뛰다 | leap | 몇 가지 예시를 통해 작업별 원리를 학습합니다. |
왕복 최적화 | rto | 왕복 프로세스를 통해 응답 최적화 |
N 샘플링의 최고 | bon | 여러 응답을 생성하고 가장 좋은 응답을 선택합니다. |
에이전트의 혼합물 | moa | 여러 비평의 응답을 결합합니다. |
몬테카를로 트리 검색 | mcts | 채팅 응답 시 의사 결정을 위해 MCTS를 사용합니다. |
PV 게임 | pvg | 추론 시 증명자-검증자 게임 접근 방식을 적용합니다. |
CoT 디코딩 | 프록시의 경우 해당 없음 | 명시적인 메시지 없이 추론을 이끌어내기 위해 사고 연쇄 디코딩을 구현합니다. |
엔트로피 디코딩 | 프록시의 경우 해당 없음 | 생성 중 토큰의 불확실성을 기반으로 적응형 샘플링을 구현합니다. |
플러그인 | 강타 | 설명 |
---|---|---|
라우터 | router | optillm -bert-uncased 모델을 사용하여 사용자 프롬프트에 따라 요청을 다양한 접근 방식으로 라우팅합니다. |
코드 체인 | coc | CoT와 코드 실행 및 LLM 기반 코드 시뮬레이션을 결합하는 코드 체인 접근 방식을 구현합니다. |
메모리 | memory | 단기 메모리 계층을 구현하여 모든 LLM에서 무제한 컨텍스트 길이를 사용할 수 있습니다. |
은둔 | privacy | 요청 시 PII 데이터를 익명화하고 응답 시 다시 원래 값으로 익명화합니다. |
URL 읽기 | readurls | 요청에서 발견된 모든 URL을 읽고, URL에서 콘텐츠를 가져와서 컨텍스트에 추가합니다. |
코드 실행 | executecode | 코드 해석기를 사용하여 요청 및 LLM 생성 응답에서 Python 코드를 실행할 수 있습니다. |
optillm 구성을 위한 다양한 명령줄 인수와 환경 변수를 지원합니다.
매개변수 | 설명 | 기본값 |
---|---|---|
--approach | 사용할 추론 접근 방식 | "auto" |
--simulations | MCTS 시뮬레이션 수 | 2 |
--exploration | MCTS의 탐색 가중치 | 0.2 |
--depth | MCTS의 시뮬레이션 깊이 | 1 |
--best-of-n | best_of_n 접근 방식의 샘플 수 | 3 |
--model | 사용할 OpenAI 모델 | "gpt-4o-mini" |
--base-url | OpenAI 호환 엔드포인트의 기본 URL | "" |
--rstar-max-depth | rStar 알고리즘의 최대 깊이 | 3 |
--rstar-num-rollouts | rStar 알고리즘의 롤아웃 수 | 5 |
--rstar-c | rStar 알고리즘의 탐색 상수 | 1.4 |
--n | 반환할 최종 응답 수 | 1 |
--return-full-response | 태그가 포함된 CoT를 포함한 전체 응답을 반환합니다. | False |
--port | 프록시를 실행할 포트를 지정하세요. | 8000 |
-- optillm -api-key | optillm 에 대한 클라이언트 인증을 위한 선택적 API 키 | "" |
Docker를 사용하는 경우 optillm _
접두사가 붙은 환경 변수로 설정할 수 있습니다.
optillm 선택적으로 Docker 및 제공된 Dockerfile을 사용하여 빌드하고 실행할 수 있습니다.
시스템에 Docker 및 Docker Compose가 설치되어 있는지 확인하십시오.
docker-compose.yaml 파일에서 환경 변수를 업데이트하거나 프로젝트 루트 디렉터리에 .env
파일을 만들고 설정하려는 환경 변수를 추가하세요. 예를 들어 OpenAI API 키를 설정하려면 .env
파일에 다음 줄을 추가합니다.
OPENAI_API_KEY=your_openai_api_key_here
optillm 시작하려면 다음 명령을 실행하십시오.
docker compose up -d
Docker 이미지가 없으면 이를 빌드하고 optillm 서비스를 시작합니다.
optillm http://localhost:8000
에서 사용할 수 있습니다.
Docker를 사용하는 경우 이러한 매개변수를 환경 변수로 설정할 수 있습니다. 예를 들어 접근 방식과 모델을 설정하려면 다음을 사용합니다.
optillm _APPROACH=mcts
optillm _MODEL=gpt-4
API 키를 사용하여 optillm 프록시를 보호하려면 optillm _API_KEY
환경 변수를 설정하십시오.
optillm _API_KEY=your_secret_api_key
API 키가 설정되면 클라이언트는 Authorization
헤더를 사용하여 요청에 이를 포함해야 합니다.
Authorization: Bearer your_secret_api_key
모델 | 점수 |
---|---|
o1-미니 | 56.67 |
coc-클로드-3-5-sonnet-20241022 | 46.67 |
coc-gemini/gemini-exp-1121 | 46.67 |
o1-미리보기 | 40.00 |
쌍둥이자리-exp-1114 | 36.67 |
클로드-3-5-소네트-20241022 | 20.00 |
gemini-1.5-pro-002 | 20.00 |
gemini-1.5-플래시-002 | 16.67 |
모델 | 정확성 |
---|---|
readurls&memory-gpt-4o-mini | 61.29 |
gpt-4o-미니 | 50.61 |
URL 읽기&메모리-Gemma2-9b | 30.1 |
젬마2-9b | 5.1 |
젬마2-27b | 30.8 |
제미니 플래시 1.5 | 66.5 |
제미니 프로 1.5 | 72.9 |
모델 | 패스@1 | 패스@5 | 패스@10 |
---|---|---|---|
plansearch-gpt-4o-mini | 44.03 | 59.31 | 63.5 |
gpt-4o-미니 | 43.9 | 50.61 | 53.25 |
클로드-3.5-소네트 | 51.3 | ||
gpt-4o-2024-05-13 | 45.2 | ||
gpt-4-터보-2024-04-09 | 44.2 |
optillm OpenAI API를 즉시 대체하므로 OpenAI 클라이언트를 사용하여 기존 도구 및 프레임워크와 쉽게 통합할 수 있습니다. 우리는 패치플로우라는 워크플로우를 사용하여 PR 검토, 버그 수정, 보안 패치와 같은 개발 작업을 자동화하는 오픈 소스 프레임워크인 패치워크와 함께 optillm 사용했습니다. 에이전트 혼합 접근 방식(moa)을 사용할 때 아래와 같이 지원되는 모든 패치 흐름에서 엄청난 성능 향상을 확인했습니다.