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

技术

picture.image

picture.image

picture.image

点击上方蓝字关注我们

picture.image

前言

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

picture.image

一、搭建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 万次的请求额度,所以轻度使用基本是零成本的。

picture.image

二、本地开发环境配置

2.1、基于 LangChain 开发

picture.image

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 模型实例里定义了 validate_environment 函数用于从字典或者环境变量中加载 OPENAI_API_BASE 的值。

picture.image

picture.image

picture.image

我们只需要在 .env 配置 OPENAI_API_BASE 即可正常调用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)>
    


picture.image

2.1.4、方式二:在初始化 ChatOpenAI 模型时指定 openai\_api\_base 参数

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

picture.image

我们只需要在实例化 ChatOpenAI 的时候传入 openai_api_base 参数即可正常调用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开发

picture.image

2.2.1、基于Python SDK开发

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

picture.image

下面的代码演示了直接通过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)
    

picture.image

2.2.2、基于HTTP请求转发

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


        
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!"}]  
 }'
    

输出结果:

picture.image

也可以不走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}")
    

输出结果:

picture.image

Jupyter Notebook 的完整代码

https://github.com/Crossme0809/langchain-tutorials/blob/main/LangChain\_With\_OpenAI\_Proxy\_Invoke.ipynb

picture.image

三、总结

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

picture.image

四、资源推荐

picture.image

1、 OpenAI中文文档https://openai.xiniushu.com/ 2、 OpenAI中文文档https://www.openaidoc.com.cn/ 3、 LangChain中文文档教程https://www.langchain.asia/ 4、 OpenAI在线接口调试平台https://openai.apifox.cn/ 5、 Pinecone向量库中文文档https://www.pinecone-io.com/ 6、 Milvus向量库中文文档: https://www.milvus-io.com/overview

picture.image

picture.image

如果你对这篇文章感兴趣,而且你想要学习更多关于AI 领域的实战技巧,可以

关注「技术狂潮AI」公众号

。在这里,你可以看到最新最热的AIGC 领域的干货文章和案例实战教程。

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论