逐行解析tornado原理

这段代码定义了一个基于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数据。
    • 检查必填参数questionshistory是否存在,如果缺少则返回错误响应。
    • 调用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助手服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值