下面介绍一下如何构建一个使用python编写的翻译服务器软件
开源地址: gpt-translator: 构建pdftranslator server
访问方式 http://servername or serverip:8888/translate
其中Authorization 的值为.env 中的配置,可以配置多个
如果directly 为true会直接提交content作为promp,而不会添加翻译前置。(用于自定义翻译前置)
事实上这个from是不需要的,因为gpt会自己判断源语言是什么。
为什么使用python
因为这个项目需要用到openai,相对于其他语言来说,使用python可以利用官方的包,并且可以很简单地调用。
需要用到的软件包
import openai import tornado from tornado_server import make_app
也就是openai 和 tornado.
架构策略
main.py
import openai
import tornado
from tornado_server import make_app
from auth import all_keys
if __name__ == "__main__":
file_path = "./.env" # 替换为你的env文件路径
key = all_keys
# 打开文件
with open(file_path, "r") as file:
# 读取文件内容并去除每行末尾的换行符
lines = [line.strip() for line in file.readlines()]
for line in lines:
key.append(line.strip())
openai.api_key = "sk-transla4teds3gsd3fsdfsdf34232ppngi4"
openai.api_base = "https://api.atpgroup.work/v1"
app = make_app()
port = 8888
app.listen(port)
print(f"server is serve at http://localhost:{port}")
tornado.ioloop.IOLoop.current().start()
上面是main文件,我们根据main文件,进行介绍。这是一个简单的翻译服务器软件。
但是也包含了验证策略,不过是 基于配置文件读取内存型验证。
首先读取.env 文件的内容,.env文件的每一行是一个访问该软件接口的密钥。
其中all_keys是一个全局变量。
载入key之后,首先设置api_key 和api_base.
注意要添加v1或者自定义path。
然后构建软件,启动软件。
服务接口
tornado_server.py
import json
import openai
import tornado.ioloop
import tornado.web
from Translate import translate_object_hook
from auth import all_keys
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, Tornado!")
def post(self):
self.write("Hello, Tornado!")
class TranslateHandler(tornado.web.RequestHandler):
def post(self):
authorization_header = self.request.headers.get("Authorization")
if authorization_header not in all_keys:
self.send_error(401)
# 获取请求体内容
json_str = self.request.body.decode('utf-8')
# 将JSON字符串转换为Translate对象
translate = json.loads(json_str, object_hook=translate_object_hook)
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": translate.getRequestPrompt()}
],
stream=True
)
# 按流读取数据
for message in response:
# 处理响应消息
# 这里可以根据需要进行自定义逻辑
if "content" in message["choices"][0]["delta"]:
self.write(message["choices"][0]["delta"]["content"])
except:
self.send_error()
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
(r"/translate", TranslateHandler),
])
主要的处理在
TranslateHandler这个处理器。
处理内容是:
先读取请求头中的密钥,如果和配置文件/载入到all_keys中的密钥不符,直接返回错误。
然后结构请求体,并构建流式请求,最后流式地返回信息。
模型
Translate.py
class Translate:
def __init__(self, directly: bool, from_lang: str, to_lang: str, content: str):
self.directly = directly
self.from_lang = from_lang
self.to_lang = to_lang
self.content = content
def getRequestPrompt(self):
if self.directly:
return f"{self.content}"
else:
return f"translate the following text into {self.to_lang}\n{self.content}"
def translate_object_hook(d):
return Translate(bool(d['directly']), d['from'], d['to'], d['content'])
剩余的文件
该服务器软件仅包含四个文件
除了上述三个文件
还有下面的文件
auth.py
all_keys = []
其他
可能出现的错误
端口被占用,你需要使用一个没有被占用的端口
你需要替换自己的api源和密钥
如果想要加密通信,你需要自己配置https