为什么 Firebase genkit 将数据作为 json 字符串流回(除了最后 2 个块之外)?

问题描述 投票:0回答:1

我正在使用 firebase genkit w/gemini pro 1.5 并将响应流式传输回客户端。流回的每个块都是一个有效的 json 字符串,如下我可以解析的字符串。然而,最后 2 个块被捆绑在一起作为一个流,导致解析失败。

示例块: {"index":0,"content":[{"text":"this is a test"}]} // 有效的 json 字符串

最后 2 个块:{"index":0,"content":[{"text":"这是一个测试"}]} {"index":0,"content":[{"text":"" }]}

为什么会发生这种情况以及最佳实践是什么?

我当前的解决方案是使用尝试解析,如果失败,则字符串用“}{”分割。但我正在寻找更清洁的解决方案。

firebase google-gemini firebase-genkit genkit
1个回答
0
投票

我假设您正在谈论在流模式下对流进行 HTTP 调用时看到的输出(使用

?stream=true
)。

以 JSONL 格式传输流数据 (https://jsonlines.org/examples/),因此您应该看到类似这样的内容:

{"index":0,"content":[{"text":"this is a test"}]}
{"index":0,"content":[{"text":""}]}

根据您使用的法学硕士(例如尝试

ollama/gemma
),您可能会看到类似这样的内容:

{"index":0,"content":[{"text":"this"}]}
{"index":0,"content":[{"text":" is"}]}
{"index":0,"content":[{"text":" a"}]}
{"index":0,"content":[{"text":" test"}]}

不同的LLM块输出不同。

每个块后面应该有一个

\n
(最终结果之后没有尾随
\n
),并且流的使用者应该处理流的解码。如果您使用来自 HTTP 响应的流,则每个块都应该可以单独解析,但如果您正在缓冲响应,那么您将需要将其分割为
\n

© www.soinside.com 2019 - 2024. All rights reserved.