老铁们,今天我们来聊聊如何从大型语言模型(LLM)中流式传输响应。流式传输在实时应用中非常有用,特别是在需要逐步接收和处理数据的时候。接下来我会详细解释这些原理,并给出一些实战代码示例。
技术背景介绍
在现代AI应用中,LLM的运行效率和响应速度是非常重要的。所有的LLM实现都遵循Runnable
接口,这个接口提供了一些标准的方法,比如invoke
、batch
、stream
等。在流式传输中,我们特别关注stream
和astream
这两个方法。默认情况下,流式传输的实现提供了一个Iterator
(或异步场景下的AsyncIterator
),它会返回底层模型生成的最终输出。
需要注意的是,默认实现并不支持逐步令牌流式传输。如果你需要令牌逐个传输的支持,那么需要确保底层的模型提供商具备这样的能力。具体哪些集成支持这种特性,可以访问这里查看。
原理深度解析
说白了,流式传输就是通过迭代器一块块地获取数据。这种方式不仅可以用于同步操作,也可以用于异步操作。在同步流式传输中,我们直接使用stream
方法;对于异步流式传输,我们则使用astream
方法。
同步流式传输
我们来看个简单的同步流示例,这里我们用|
表示令牌之间的分隔符:
from langchain_openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-instruct"