搭建个人专属的API中转站,解决本地OpenAI接口调用困扰

今天仅仅只是站在开发者学习交流的角度来介绍一下,我们在日常开发基于LLM的AI应用时遇到的各种瓶颈,毕竟开发出一个优质的应用,舒适的环境和体验还是比较重要的。话不多说,进入正题。

一、搭建OpenAI中转站

如何搭建个人专属的API中转站,这里就不过多赘述了,各位可以移步下面的地址进行查阅:

https://github.com/x-dr/chatgptProxyAPI/blob/main/docs/cloudflare_proxy_pages.md

部署完成后就可以通过你自己的域名来代替 OpenAI 的 API 地址了。比如在本文的例子中,想要请求 ChatGPT 的 API ,即是把官方 API 地址 https://api.openai.com/v1/chat/completions 换为我自己的域名 https://openai-proxy-api.pages.dev/api/v1/chat/completions ,其他参数均参照官方示例即可。

由于 Cloudflare 有每天免费 10 万次的请求额度,所以轻度使用基本是零成本的。

二、本地开发环境配置

2.1、基于 LangChain 开发

2.1.1、安装必要的依赖
!pip install openai langchain
!pip install python-dotenv
2.1.2、新建 .env 文件
OPENAI_API_BASE=your-openai-proxy-url
OPENAI_API_KEY=your-openai-api-key
2.1.3、方式一:通过在 .env 文件中设置 OPENAI_API_BASE 环境变量

LangChain 的源码 openai.py 文件中,可以找到 ChatOpenAI 模型实例里定义了 validateenvironment 函数用于从字典或者环境变量中加载 OPENAIAPI_BASE 的值。

 

我们只需要在 .env 配置 OPENAIAPIBASE 即可正常调用OpenAI API接口。

import os
from dotenv import load_dotenv
from langchain.schema import HumanMessage
from langchain.chat_models import ChatOpenAI

# 加载.env文件中的环境变量
load_dotenv()

# 创建OpenAI实例
llm = ChatOpenAI(
        model_name="gpt-3.5-turbo-0613",
        max_tokens=1024,
        verbose=True
      )
result = llm([HumanMessage(content="根据目前的就业形势,选什么专业比较稳妥?")])
print(result.content)

# 输出模型的参数信息可以看到已成功加载环境变量中OPENAI_API_BASE的值
print(llm.json)

输出结果:

LLM是法学硕士(Master of Laws)的缩写。它是一个专业学位,主要面向已经获得法学学士学位或者相关学科学士学位的学生。LLM的学位课程通常涵盖法学的各个领域,如国际法、商法、民法、刑法等。这个学位旨在深入研究法学领域的专业知识和技能,提供更高水平的法律教育和培训。LLM学位在提升法律职业发展、进入法律界的国际化环境、深化法学研究等方面具有重要作用。
<bound method BaseModel.json of ChatOpenAI(cache=None, verbose=True, callbacks=None, callback_manager=None, tags=None, client=<class 'openai.api_resources.chat_completion.ChatCompletion'>, model_name='gpt-3.5-turbo-0613', temperature=0.7, model_kwargs={}, openai_api_key='xxxxxxxxxx', openai_api_base='https://your-proxy-domain/api/v1', openai_organization='', openai_proxy='', request_timeout=None, max_retries=6, streaming=False, n=1, max_tokens=1024)>

2.1.4、方式二:在初始化 ChatOpenAI 模型时指定 openai_api_base 参数

从 LangChain 的源码 openai.py 文件中,可以找到 ChatOpenAI 模型实例中又个 openaiapibase 参数可以设置URL前缀。

我们只需要在实例化 ChatOpenAI 的时候传入 openaiapibase 参数即可正常调用OpenAI API接口。

import os
from dotenv import load_dotenv
from langchain.schema import HumanMessage
from langchain.chat_models import ChatOpenAI

# 加载.env文件中的环境变量
load_dotenv()

# 创建OpenAI实例
llm = ChatOpenAI(
        model_name="gpt-3.5-turbo-0613",
        max_tokens=1024,
        verbose=True,
        openai_api_base=os.getenv("OPENAI_API_BASE")
      )
result = llm([HumanMessage(content="什么是LLM?")])
print(result.content)

相比较第一种方式来说,配置环境变量属于全局生效,项目中所有OpenAI请求都会统一走代理转发,第二种就是局部针对部分有需要的请求走代理了,按需选择即可。

2.2、基于OpenAI原生API开发

2.2.1、基于Python SDK开发

OpenAI Python SDK 源码包中,init.py 文件中明确定义了从环境变量中加载 OPENAPIBASE 属性,所以在调用官方SDK时,跟2.1.3节一样,只需要在 .env 文件中配置 OPENAPIBASE 即可。

下面的代码演示了直接通过OpenAI原生Python SDK调用GPT模型。 

import os
import openai
from dotenv import load_dotenv

# 加载.env文件中的环境变量
load_dotenv()

openai.api_key = os.getenv("OPENAI_API_KEY")
openai.api_base = os.getenv("OPENAI_API_BASE")

completion = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613", messages=[{"role": "user", "content": "请介绍下Google的PaLM模型!"}])
print(completion.choices[0].message.content)

2.2.2、基于HTTP请求转发

在部署完 API 网关后,可以直接在 Shell 中通过直接通过 curl 调用 OpenAI 接口。替换其中代理地址和 OPENAIAPIKEY

curl --location 'https://openai-proxy-api.pages.dev/api/v1/chat/completions' \
--header 'Authorization: Bearer sk-xxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '{
   "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "介绍下Cohere!"}]
 }'

输出结果:

也可以不走Python SDK直接调用API请求,只需要替换API_BASE即可,以下代码为Python发送Http请求调用GPT的示例。

import requests

url = "https://openai.1rmb.tk/v1/chat/completions"
api_key = 'sk-xxxxxxxxxxxxxxxxxxxx'

headers = {
  'Authorization': f'Bearer {api_key}',
  'Content-Type': 'application/json'
}

payload = {
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "对于向量数据库,Chroma和Pinecone的区别是什么?"
    }
  ]
}

try:
    response = requests.post(url, headers=headers, json=payload)
    response.raise_for_status() # 抛出异常,如果响应码不是200
    data = response.json()
    print(data)
except requests.exceptions.RequestException as e:
    print(f"请求错误: {e}")

输出结果:

Jupyter Notebook 的完整代码

https://github.com/Crossme0809/langchain-tutorials/blob/main/LangChainWithOpenAIProxyInvoke.ipynb

三、总结

今天介绍了如何在本地环境中使用 LangChain 调用 OpenAI 接口。首先,我们需要搭建个人专属的 OpenAI 中转站。接下来,我们就基于 LangChain 开发和基于 OpenAI 原生 API 开发两种模式的环境及代码进行了介绍。

四、资源推荐

  • OpenAI中文文档:https://openai.xiniushu.com/

  • OpenAI中文文档:https://www.openaidoc.com.cn/

  • LangChain中文文档教程:https://www.langchain.asia/

  • OpenAI在线接口调试平台:https://openai.apifox.cn/

  • Pinecone向量库中文文档:https://www.pinecone-io.com/

  • Milvus向量库中文文档https://www.milvus-io.com/overview

### STM32CubeMX与VSCode配置及烧录教程 #### 工具准备 为了实现基于STM32CubeMX和VSCode的开发环境搭建以及程序烧录,需先完成工具链的准备工作。这包括安装STM32CubeMX、VSCode及其插件、GNU Arm Embedded Toolchain编译器套件以及其他必要的依赖项[^1]。 #### 配置流程 以下是具体的配置过程: 1. **初始化项目** 使用STM32CubeMX创建一个新的工程文件并设置目标微控制器型号及相关外设参数。完成后导出适用于GCC编译器的Makefile项目到指定目录下。 2. **安装必要软件** - 安装最新版本的Visual Studio Code编辑器。 - 在VSCode中通过扩展市场添加C/C++ IntelliSense支持插件(由Microsoft提供),用于语法高亮显示等功能;同时还需要安装名为"Cortex-Debug"调试插件来处理ARM Cortex架构下的断点调试操作。 3. **配置工作区** 打开之前从STM32CubeMX导出来的源码所在路径作为新的VSCode workspace加载进来之后调整tasks.json以匹配make命令执行需求,并修改launch.json使得能够连接硬件设备进行在线调试模式启动。 4. **编写构建任务** 编辑`.vscode/tasks.json` 文件定义一个build task用来调用外部make utility完成整个项目的链接组装阶段转换成最终可执行映像文件(.elf): ```json { "version": "2.0.0", "tasks": [ { "label": "Build Project", "type": "shell", "command": "make all", "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] } ``` 5. **设定调试选项** 修改 `.vscode/launch.json` 来适配实际使用的STLink v2 或其他兼容JTAG/SWD接口标准的编程器规格说明文档里提到的相关属性字段值比如 `request`, `type`, `name`, `preLaunchTask`, `miDebuggerPath`, `setupCommands` 等等: ```json { "version": "0.2.0", "configurations": [ { "name": "Cortex Debug", "type": "cortex-debug", "request": "launch", "servertype": "openocd", "executable": "./Output_Directory_Name/Project_Name.elf", "device": "STM32Fxxx", "interface": "swd", "configFiles": [ "board/st_nucleo_f4.cfg" ], "runToMain": true, "postRestartCommands": [ "break main" ] } ] } ``` 6. **上传固件至MCU** 当一切就绪后,在VSCode顶部菜单栏选择对应刚才建立好的configuration名称运行即可自动触发一系列动作直至成功把生成的目标代码灌入单片机内部flash存储区域当中去。 #### 注意事项 确保所有的驱动程序均已正确安装完毕并且物理连线无误(如SWDIO, SWCLK,GND,VCC),另外还需留意不同系列芯片可能存在的特殊要求或者差异之处。 ```bash st-flash write Build/Project_Name.elf 0x8000000 ``` 上述命令可以单独利用开源工具 st-link 实现快速刷写功能而不必每次都经历完整的gdb session握手协商环节。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术狂潮AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值