流式响应#

在大语言模型推理场景中,流式返回能够在模型生成文本的同时逐步将结果发送给客户端,从而实现实时的交互体验。

函数服务支持响应流式数据,openYuanrong 提供了两种流式响应 REST API:订阅流服务调用服务时流式返回。

订阅流服务#

使用单机程序分布式并行化接口中的数据流 API 生产的流,可以通过调用订阅流服务 REST API 消费。使用该接口需要注意以下几点:

  • 流生产者和订阅者保持一样的流名称。

  • 业务逻辑上确保先订阅流再生产数据,避免生产的数据无法被全部消费。

  • 建议流生产者和订阅者协商特定的结束符表达流数据传递结束,便于订阅者消费完数据后主动关闭。

通过在函数服务中使用流查看完整使用示例。

调用服务时流式返回#

调用 openYuanrong 服务时流式返回基于 SSE(Server-Send Events) 协议实现。在函数服务中通过上下文接口中的 context.get_stream() 关联流,发送流数据。一个流式返回的函数服务示例如下。

import json

def handler(event, context):
    data = {"event":"this is a stream"}
    context.get_stream().write(json.dumps(data))
    return 'ok'
package org.yuanrong.demo;

import org.yuanrong.services.runtime.Context;
import org.yuanrong.services.runtime.action.Stream;
import com.google.gson.JsonObject;

public class Demo {
    public String handler(JsonObject jsonObject, Context context) throws Exception {
        try {
            Stream stream = context.getStream();
            JsonObject obj = new JsonObject();
            obj.addProperty("event","this is a stream");
            stream.write(obj);
        } catch (Exception e) {
            System.out.println("executor exception occurred");
        }
        return "ok";
    }
}

调用函数服务时,需要在请求头中添加 Accept: text/event-stream 字段。

备注

使用流式返回需要在部署 openYuanrong 时支持函数服务并配置 frontend.args.enableEvent=true