devinyf / dashscopego

Tongyi Qwen Aliyun Dashscope API Golang implementation, non-official
MIT License
18 stars 5 forks source link

能否添加qwen文生文流式输出是否是最后一句话的标识 #2

Closed eswulei closed 7 months ago

eswulei commented 7 months ago

现在的流式输出的输出内容是string,能否改为一个结构体,里面包含是否stop,这个在官方的python示例有这个功能的。

devinyf commented 7 months ago

流式输出的 最终停止原因 可以通过函数的返回值 resp 来获取, resp 的数据类型就是完全按照 qwen 官方文档来实现的

    // 回调函数获取 llm 流式文本输出
    streamCallbackFn := func(ctx context.Context, chunk []byte) error {
        fmt.Print(string(chunk))
        return nil
    }
    req := &dashscopego.TextRequest{
        Input:       input,
        StreamingFn: streamCallbackFn,
    }

    ctx := context.TODO()
    resp, err := cli.CreateCompletion(ctx, req)
    if err != nil {
        panic(err)
    }

        // 获取最终结果: stop
    log.Println("stop reason: ",resp.Output.Choices[0].FinishReason)

看这样是否符合你的需求呢??


补充: stream-output 目前是仅提取了以下这个数据结构 中的message content 文本 , 当需要 finish_reason / token_usage / request_id 时 都是在最终返回的 resp 中获取的

{
    "output":{
        "choices": [
            {
                "finish_reason":"stop",
                "message": {
                    "role": "system",
                    "content": "如果你在中国,我推荐你去北京的颐和园 ... ... 适合散步和欣赏景色。",
                }
        }
        ]
        "finish_reason":"stop"    
    },
    "usage":{
        "output_tokens":380,
        "input_tokens":633
    },
    "request_id":"d89c06fb-46a1-47b6-acb9-bfb17f814969"
}
devinyf commented 7 months ago

补充2: 这个库内部已经做了 finish_reason 的检查, 流式输出时碰到 finish_reason 不为空的情况会终止, 并在 resp 中返回了终止的原因。

if choice.FinishReason != "" && choice.FinishReason != "null" {
    break
}
eswulei commented 7 months ago

感谢!