这段代码定义了一个基于Tornado框架的简单Web服务,主要功能是通过OpenAI的API实现一个AI助手来回答用户的问题。接下来,我将详细解释代码的各个部分。
1. Import Statements and Class Definition
from tornado.concurrent import run_on_executor
from tornado.web import RequestHandler
import tornado.gen
from openai import OpenAI
import json
tornado.concurrent.run_on_executor:Tornado装饰器,用于在executor线程池中运行指定的函数。tornado.web.RequestHandler:Tornado的一个基本请求处理类,所有处理器类都应继承它。tornado.gen:Tornado提供的协程支持模块。openai.OpenAI:导入OpenAI客户端用于与OpenAI服务进行交互。json:Python内置的json模块,用于处理JSON数据。
2. Class Definition: Assistant
class Assistant(RequestHandler):
model = "deepseek/deepseek-chat"
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="api_key",
)
default_prompt = "You are an AI assistant that helps people find information."
model:定义使用的AI模型名称。client:初始化OpenAI客户端,设置API基础URL和API密钥。default_prompt:定义默认的系统提示,用于引导AI助手的回答风格和内容。
3. Prepare Method
def prepare(self):
self.executor = self.application.pool
prepare方法:在请求处理前执行,主要用于设置异步执行的线程池executor。
4. Setting Default Headers
def set_default_headers(self):
self.set_header('Access-Control-Allow-Origin', "*")
self.set_header('Access-Control-Allow-Headers', "Origin, X-Requested-With, Content-Type, Accept")
self.set_header('Access-Control-Allow-Methods', "GET, POST, PUT, DELETE, OPTIONS")
set_default_headers方法:设置默认的HTTP响应头,允许跨域请求(CORS),以便前端应用能访问这个服务。
5. Handling POST Request
@tornado.gen.coroutine
def post(self):
json_data = json.loads(self.request.body)
if 'questions' not in json_data or 'history' not in json_data:
self.write({
"code": 400,
"message": "缺少必填参数"
})
return
questions = json_data['questions']
history = json_data['history']
result = yield self.do_handler(questions, history)
self.write(result)
post方法:处理POST请求。它是一个协程。- 从请求体中解析JSON数据。
- 检查必填参数
questions和history是否存在,如果缺少则返回错误响应。 - 调用
do_handler方法处理问题和历史记录,并等待结果。 - 返回处理结果作为响应。
6. Handling the Questions and History Asynchronously
@run_on_executor
def do_handler(self, questions, history):
try:
answer, history = self.llm(questions, history)
return {
"code": 200,
"message": "success",
"answer": answer,
"history": history
}
except Exception as e:
return {
"code": 400,
"message": str(e)
}
do_handler方法:在异步线程池中执行。- 调用
llm方法处理来自用户的问题和消息历史记录。 - 捕获异常并返回错误信息。
- 调用
7. Language Model Method
def llm(self, user_prompt, messages, system_prompt=default_prompt):
if not messages:
messages = []
messages.append({"role": "user", "content": user_prompt})
completion = self.client.chat.completions.create(
extra_headers={
"HTTP-Referer": "http://localhost:8088",
"X-Title": "test",
},
model=self.model,
messages=messages,
max_tokens=2048
)
answer = completion.choices[0].message.content
messages.append({"role": "assistant", "content": answer})
return answer, messages
llm方法:处理与AI模型的交互。- 如果
messages为空,初始化为空列表。 - 将用户的问题添加到
messages中。 - 调用OpenAI API生成对话补全(completion)。
- 将AI助手的回答添加到
messages中。 - 返回回答和更新后的消息历史记录。
- 如果
整体而言,这段代码定义了一个Tornado Web服务,通过处理POST请求,与OpenAI的聊天模型交互,为用户提供AI助手服务。
84

被折叠的 条评论
为什么被折叠?



