如何从 LLM 流式传输响应
所有 LLM
实现 Runnable 接口,该接口带有标准可运行方法 (即 ainvoke
、batch
、abatch
、stream
、astream
、astream_events
) 的 **默认** 实现。
**默认** 流式传输实现提供一个 AsyncGenerator
,它生成单个值:来自底层聊天模型提供程序的最终输出。
是否能够逐个令牌流式传输输出取决于提供程序是否实现了适当的流式传输支持。
查看哪些 集成支持逐个令牌流式传输。
:::{.callout-note}
**默认** 实现 **不** 提供逐个令牌流式传输的支持,但它确保可以将模型替换为任何其他模型,因为它支持相同的标准接口。
:::
使用 .stream()
最简单的流式传输方法是使用 .stream()
方法。这将返回一个可读流,您也可以对其进行迭代。
提示
- npm
- Yarn
- pnpm
npm install @langchain/openai @langchain/core
yarn add @langchain/openai @langchain/core
pnpm add @langchain/openai @langchain/core
import { OpenAI } from "@langchain/openai";
const model = new OpenAI({
maxTokens: 25,
});
const stream = await model.stream("Tell me a joke.");
for await (const chunk of stream) {
console.log(chunk);
}
/*
Q
:
What
did
the
fish
say
when
it
hit
the
wall
?
A
:
Dam
!
*/
API 参考
- OpenAI 来自
@langchain/openai
对于不支持流式传输的模型,整个响应将作为单个块返回。
使用回调处理程序
您也可以使用 CallbackHandler
,如下所示
import { OpenAI } from "@langchain/openai";
// To enable streaming, we pass in `streaming: true` to the LLM constructor.
// Additionally, we pass in a handler for the `handleLLMNewToken` event.
const model = new OpenAI({
maxTokens: 25,
streaming: true,
});
const response = await model.invoke("Tell me a joke.", {
callbacks: [
{
handleLLMNewToken(token: string) {
console.log({ token });
},
},
],
});
console.log(response);
/*
{ token: '\n' }
{ token: '\n' }
{ token: 'Q' }
{ token: ':' }
{ token: ' Why' }
{ token: ' did' }
{ token: ' the' }
{ token: ' chicken' }
{ token: ' cross' }
{ token: ' the' }
{ token: ' playground' }
{ token: '?' }
{ token: '\n' }
{ token: 'A' }
{ token: ':' }
{ token: ' To' }
{ token: ' get' }
{ token: ' to' }
{ token: ' the' }
{ token: ' other' }
{ token: ' slide' }
{ token: '.' }
Q: Why did the chicken cross the playground?
A: To get to the other slide.
*/
API 参考
- OpenAI 来自
@langchain/openai
如果使用 generate
,我们仍然可以访问最终的 LLMResult
。但是,tokenUsage
当前可能不支持所有模型提供程序在流式传输时的使用。