流式传输#

要在流式传输模式下使用 guardrails 配置,必须满足以下条件

  1. 主 LLM 必须支持流式传输。

  2. 没有输出 rails。

配置#

要在 guardrails 配置上激活流式传输,请将以下内容添加到您的 config.yml

streaming: True

用法#

聊天 CLI#

您可以在启动 NeMo Guardrails 聊天 CLI 时使用 --streaming 选项启用流式传输

nemoguardrails chat --config=examples/configs/streaming --streaming

Python API#

您可以通过两种方式直接从 python API 使用流式传输

  1. 简单:仅接收块(tokens)。

  2. 完整:接收生成的块以及结尾的完整响应。

对于简单用法,您需要在 LLMRails 实例上调用 stream_async 方法

from nemoguardrails import LLMRails

app = LLMRails(config)

history = [{"role": "user", "content": "What is the capital of France?"}]

async for chunk in app.stream_async(messages=history):
    print(f"CHUNK: {chunk}")
    # Or do something else with the token

对于完整用法,您需要为 LLMRails 实例上的 generate_async 方法提供一个 StreamingHandler 实例

from nemoguardrails import LLMRails
from nemoguardrails.streaming import StreamingHandler

app = LLMRails(config)

history = [{"role": "user", "content": "What is the capital of France?"}]

streaming_handler = StreamingHandler()

async def process_tokens():
    async for chunk in streaming_handler:
        print(f"CHUNK: {chunk}")
        # Or do something else with the token

asyncio.create_task(process_tokens())

result = await app.generate_async(
    messages=history, streaming_handler=streaming_handler
)
print(result)

有关完整的有效示例,请查看此演示脚本

服务器 API#

要在流式传输模式下调用 NeMo Guardrails 服务器,您必须将 stream 参数设置为 JSON 主体内的 True。例如,要使用 /v1/chat/completions 端点获取聊天会话的完成

POST /v1/chat/completions
{
    "config_id": "some_config_id",
    "messages": [{
      "role":"user",
      "content":"Hello! What can you do for me?"
    }],
    "stream": true
}

为使用 HuggingFacePipeline 部署的 LLM 进行流式传输#

我们也支持为使用 HuggingFacePipeline 部署的 LLM 进行流式传输。HF Pipeline Dolly 配置中提供了一个示例。

要为 HF Pipeline LLM 使用流式传输,您首先需要在 config.yml 中设置 streaming 标志。

streaming: True

然后,您需要创建一个 nemoguardrails.llm.providers.huggingface.AsyncTextIteratorStreamer streamer 对象,将其添加到管道的 kwargsHuggingFacePipelineCompatible 对象的 model_kwargs 中。

from nemoguardrails.llm.providers.huggingface import AsyncTextIteratorStreamer

# instantiate tokenizer object required by LLM
streamer = AsyncTextIteratorStreamer(tokenizer, skip_prompt=True)
params = {"temperature": 0.01, "max_new_tokens": 100, "streamer": streamer}

pipe = pipeline(
    # all other parameters
    **params,
)

llm = HuggingFacePipelineCompatible(pipeline=pipe, model_kwargs=params)