赞
踩
每周跟踪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,无流式传输
我们将从实现非流式部分开始。让我们从建模我们的请求开始:
- from typing import List, Optional
- from pydantic import BaseModel
-
- class ChatMessage(BaseModel):
- role: str
- content: str
-
- class ChatCompletionRequest(BaseModel):
- model: str = "mock-gpt-model"
- messages: List[ChatMessage]
- max_tokens: Optional[int] = 512
- temperature: Optional[float] = 0.1
- stream: Optional[bool] = False
Pydantic模型代表客户端的请求,旨在复制API参考。为了简洁起见,这个模型没有实现完整的规范,而是仅实现了使其工作所需的基本骨架。如果你缺少API规范中的某个参数(如top_p),你可以简单地将其添加到模型中。
接下来,我们将编写我们的FastAPI聊天完成端点:
- import time
- from fastapi import FastAPI, HTTPException
- from pydantic import BaseModel
- from typing import List, Optional
-
- class ChatMessage(BaseModel):
- role: str
- content: str
-
- class ChatCompletionRequest(BaseModel):
- model: str
- messages: List[ChatMessage]
- max_tokens: Optional[int] = None
- temperature: Optional[float] = None
- top_p: Optional[float] = None
- frequency_penalty: Optional[float] = None
- presence_penalty: Optional[float] = None
-
- app = FastAPI()
-
- @app.post("/v1/chat/completions")
- async def chat_completions(request: ChatCompletionRequest):
- # 这里模拟处理请求的逻辑
- return {"responses": "这里是你的模拟响应"}
测试我们的实现假设两个代码块都在名为main.py的文件中,我们将在我们选择的环境中安装两个Python库(最好创建一个新环境):`pip install fastapi uvicorn`,然后从终端启动服务器:
uvicorn main:app --reload
使用另一个终端(或将服务器放在后台运行),我们将打开Python控制台并复制粘贴以下代码,直接取自OpenAI的Python客户端参考:
- import openai
-
- # 初始化客户端并连接到本地主机服务器
- openai.api_key = "fake-api-key"
- response = openai.Completion.create(
- engine="text-davinci-003",
- prompt="这是一个测试",
- max_tokens=50
- )
-
- print(response.choices[0].text)
如果一切正确,服务器的响应应该会正确打印出来。检查响应对象以确保所有相关属性都是从我们的服务器发送的。你应该看到类似这样的输出:
这里是你的模拟响应
这就是全部。通过这个基本的框架,你可以扩展你的API来支持更多的OpenAI功能,如流式传输、自定义参数等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。