optillm是一个兼容 OpenAI API 的优化推理代理,它实现了多种最先进的技术,可以提高 LLM 的准确性和性能。当前的重点是实施改进编码推理、逻辑和数学查询的技术。通过在推理时进行额外的计算,可以在不同的任务中使用这些技术来击败前沿模型。
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
环境变量,并使用 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
)
提示
您还可以通过使用符号&
和|
来组合不同的技术。 。当您使用&
时,这些技术将在管道中按从左到右的顺序进行处理,并将前一阶段的响应用作下一阶段的请求。同时,与|
我们并行运行所有请求并生成多个响应,并以列表形式返回。
请注意,上述约定仅在optillm服务器启动且推理方法设置为auto
时才有效。否则,客户端请求中的model
属性必须仅使用模型名称进行设置。
我们现在支持所有 LLM 提供商(通过包装 LiteLLM sdk)。例如,您可以通过在环境变量os.environ['GEMINI_API_KEY']
中设置传递 api 密钥,然后调用模型moa-gemini/gemini-1.5-flash-002
,将 Gemini Flash 模型与moa
一起使用。在输出中,您将看到 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
是现有工具(如 oobabooga)、框架(如 patchwork)或您自己的代码,您希望在其中使用optillm的结果。您可以使用任何 OpenAI 客户端 sdk 直接使用它。B
是optillm服务(直接运行或在 docker 容器中运行),它将向base_url
发送请求。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 | 通过两次处理查询来实现重读以提高推理能力 |
自我一致性 | self_consistency | 实施先进的自洽方法 |
Z3解算器 | z3 | 利用 Z3 定理证明器进行逻辑推理 |
R*算法 | rstar | 实现 R* 算法来解决问题 |
飞跃 | leap | 从几个镜头示例中学习特定于任务的原则 |
往返优化 | rto | 通过往返流程优化响应 |
最佳 N 采样 | bon | 生成多个响应并选择最好的一个 |
药剂混合物 | moa | 结合多种批评的回应 |
蒙特卡罗树搜索 | mcts | 使用 MCTS 在聊天响应中进行决策 |
光伏游戏 | pvg | 在推理时应用证明者-验证者博弈方法 |
科特解码 | 代理不适用 | 实现思路链解码以在没有明确提示的情况下引发推理 |
熵解码 | 对于代理不适用 | 根据代币生成过程中的不确定性实现自适应采样 |
插件 | 蛞蝓 | 描述 |
---|---|---|
路由器 | router | 使用optillm -bert-uncased 模型根据用户提示将请求路由到不同的方法 |
代码链 | coc | 实现将 CoT 与代码执行和基于 LLM 的代码模拟相结合的代码链方法 |
记忆 | memory | 实现短期记忆层,使您能够在任何 LLM 中使用无限的上下文长度 |
隐私 | privacy | 对请求中的 PII 数据进行匿名化,并在响应中将其去匿名化回原始值 |
读取网址 | 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-十四行诗-20241022 | 46.67 |
coc-gemini/gemini-exp-1121 | 46.67 |
o1-预览 | 40:00 |
双子座-exp-1114 | 36.67 |
克劳德-3-5-十四行诗-20241022 | 20:00 |
双子座-1.5-pro-002 | 20:00 |
双子座-1.5-flash-002 | 16.67 |
模型 | 准确性 |
---|---|
readurls&内存-gpt-4o-mini | 61.29 |
GPT-4O-迷你 | 50.61 |
readurls&内存-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 客户端轻松地将其与现有工具和框架集成。我们将optillm与 patchwork 结合使用,这是一个开源框架,可以使用称为 patchflow 的工作流程自动执行 PR 审查、错误修复、安全修补等开发繁琐工作。当使用混合代理方法 (moa) 时,我们看到所有受支持的补丁流的性能都有巨大的提升,如下所示。