当前位置:   article > 正文

试验构建一个与OpenAI兼容的API_fastapi和openai

fastapi和openai

  每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/

早在2024年初,OpenAI就开始主导通用人工智能(Gen AI)市场。这有充分的理由——他们凭借先发优势成为第一个为大型语言模型(LLM)提供易用API的公司,并且他们提供的GPT-4可以说是迄今为止最强大的LLM。

鉴于这一情况,各种工具的开发者(如代理、个人助手、编码扩展)都转向OpenAI来满足他们的LLM需求。

尽管有很多理由使用OpenAI的GPT来驱动你的Gen AI创造,但选择替代品也有很多理由。有时,使用它可能成本效益较低,有时你的数据隐私政策可能禁止你使用OpenAI,或者你可能正在托管一个开源的LLM(或你自己的)。

OpenAI的市场主导地位意味着你可能想要使用的许多工具只支持OpenAI API。像OpenAI、Anthropic和Google这样的Gen AI和LLM提供商似乎都在创建不同的API架构(可能是有意为之),这为想要支持所有这些的开发者增加了很多额外的工作。

因此,作为一个周末项目,我决定实现一个与OpenAI API规范兼容的Python FastAPI服务器,这样你就可以包装几乎任何你喜欢的LLM(无论是像Anthropic的Claude这样的托管服务,还是自托管的),来模仿OpenAI API。值得庆幸的是,OpenAI API规范有一个可以设置的base_url参数,你可以有效地将客户端指向你的服务器,而不是OpenAI的服务器,而且上述工具的大多数开发者允许你根据自己的喜好设置这个参数。

为此,我参考了OpenAI公开可用的Chat API参考文档,并借助vLLM的代码,vLLM是一个遵循Apache-2.0许可的LLM推理服务器,也提供OpenAI API兼容性。

游戏计划:
我们将构建一个模仿OpenAI的Chat Completion API(/v1/chat/completions)工作方式的模拟API。虽然这个实现使用的是Python和FastAPI,但我尽量保持简单,以便可以轻松转移到另一种现代编程语言,如TypeScript或Go。我们将使用Python官方的OpenAI客户端库来测试它——如果我们能让库认为我们的服务器是OpenAI,我们就可以让任何使用它的程序也这样认为。

第一步——聊天完成API,无流式传输
我们将从实现非流式部分开始。让我们从建模我们的请求开始:
 

  1. from typing import List, Optional
  2. from pydantic import BaseModel
  3. class ChatMessage(BaseModel):
  4.     role: str
  5.     content: str
  6. class ChatCompletionRequest(BaseModel):
  7.     model: str = "mock-gpt-model"
  8.     messages: List[ChatMessage]
  9.     max_tokens: Optional[int] = 512
  10.     temperature: Optional[float] = 0.1
  11.     stream: Optional[bool] = False


Pydantic模型代表客户端的请求,旨在复制API参考。为了简洁起见,这个模型没有实现完整的规范,而是仅实现了使其工作所需的基本骨架。如果你缺少API规范中的某个参数(如top_p),你可以简单地将其添加到模型中。

接下来,我们将编写我们的FastAPI聊天完成端点:

  1. import time
  2. from fastapi import FastAPI, HTTPException
  3. from pydantic import BaseModel
  4. from typing import List, Optional
  5. class ChatMessage(BaseModel):
  6.     role: str
  7.     content: str
  8. class ChatCompletionRequest(BaseModel):
  9.     model: str
  10.     messages: List[ChatMessage]
  11.     max_tokens: Optional[int] = None
  12.     temperature: Optional[float] = None
  13.     top_p: Optional[float] = None
  14.     frequency_penalty: Optional[float] = None
  15.     presence_penalty: Optional[float] = None
  16. app = FastAPI()
  17. @app.post("/v1/chat/completions")
  18. async def chat_completions(request: ChatCompletionRequest):
  19.     # 这里模拟处理请求的逻辑
  20.     return {"responses": "这里是你的模拟响应"}



测试我们的实现假设两个代码块都在名为main.py的文件中,我们将在我们选择的环境中安装两个Python库(最好创建一个新环境):`pip install fastapi uvicorn`,然后从终端启动服务器:

uvicorn main:app --reload



使用另一个终端(或将服务器放在后台运行),我们将打开Python控制台并复制粘贴以下代码,直接取自OpenAI的Python客户端参考:

  1. import openai
  2. # 初始化客户端并连接到本地主机服务器
  3. openai.api_key = "fake-api-key"
  4. response = openai.Completion.create(
  5.   engine="text-davinci-003",
  6.   prompt="这是一个测试",
  7.   max_tokens=50
  8. )
  9. print(response.choices[0].text)



如果一切正确,服务器的响应应该会正确打印出来。检查响应对象以确保所有相关属性都是从我们的服务器发送的。你应该看到类似这样的输出:

这里是你的模拟响应


这就是全部。通过这个基本的框架,你可以扩展你的API来支持更多的OpenAI功能,如流式传输、自定义参数等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/921661
推荐阅读
相关标签
  

闽ICP备14008679号