我正在使用 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":"" }]}
为什么会发生这种情况以及最佳实践是什么?
我当前的解决方案是使用尝试解析,如果失败,则字符串用“}{”分割。但我正在寻找更清洁的解决方案。
我假设您正在谈论在流模式下对流进行 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