Ollama 流式传输教程:Python 与 JavaScript 启用 stream 参数完整代码示例

AI
本文详解 Ollama 流式传输功能,对比 REST API 与 SDK 默认设置差异。提供 Python 和 JavaScript 调用示例,演示如何设置 stream 参数启用流式渲染,并处理模型思考过程与回答内容的实时输出,助您实现打字机效果。

流式传输允许你在模型生成文本时就对其进行渲染,就是我们常与 AI 聊天时的打字机效果,每当大模型生成几个字节,马上渲染到前端,看上去就像打字机正在逐个打字。

当你通过 REST API 调用 Ollama 时,默认开启流式传输。但是,通过软件开发工具包(SDKs)调用,则默认是禁用的,如 Python Ollama 库、JavaScript Ollama 库。

如果要在软件开发工具包(SDKs)中启用流式传输,请手动将 stream 参数设置为 True。

示例

准备环境

在本地安装 Ollama 软件,然后运行 ollama pull qwen3:4b-thinking 命令下载 qwen3:4b-thinking 模型,然后通过 ollama run qwen3:4b-thinking 命令运行模型,如下:

C:\Users\Administrator> ollama pull qwen3:4b-thinking
pulling manifest
pulling 3e4cb1417446: 100% ▕██████████████████████████████████████████████████████████▏ 2.5 GB
pulling 2d54db2b9bb2: 100% ▕██████████████████████████████████████████████████████████▏ 1.5 KB
pulling d18a5cc71b84: 100% ▕██████████████████████████████████████████████████████████▏  11 KB
pulling cff3f395ef37: 100% ▕██████████████████████████████████████████████████████████▏  120 B
pulling e18a783aae55: 100% ▕██████████████████████████████████████████████████████████▏  487 B
verifying sha256 digest
writing manifest
success

C:\Users\Administrator> ollama run qwen3:4b-thinking
>>> Send a message (/? for help)

模型运行成功后,你就可以直接发送消息给大模型,进行会话,如下图:

Python

下面演示如何通过 Python 调用 Ollama 运行的大模型,如下:

(1)使用 pip intall ollama 命令安装依赖库

(2)导入 ollama 库的 chat 工具,然后使用 chat 进行聊天,代码如下:

# 导入 ollama 库的 chat 函数
# 用于与本地 Ollama 服务进行流式对话交互
from ollama import chat

# 调用 ollama 的流式聊天接口
stream = chat(
  # 使用支持思考过程的 qwen3:4b 模型
  model='qwen3:4b-thinking',
  # 对话消息列表
  messages=[{'role': 'user', 'content': '1+1等于多少?'}],
  # 开启流式传输,模型会边思考边返回数据块
  stream=True,
)

# 当前是否处于模型【思考阶段】
# True = 正在输出思考过程;False = 已结束思考,开始输出答案
in_thinking = False

# 存储模型最终输出的【完整答案内容】
content = ''

# 存储模型完整的【思考过程文本】
thinking = ''

# stream 是生成器,每次循环拿到一个 chunk(数据片段)
for chunk in stream:
    # 当前片段是否是【模型的思考内容】
    if chunk.message.thinking:
        # 如果之前没标记思考开始,现在开始输出 Thinking 标题
        if not in_thinking:
            in_thinking = True  # 标记进入思考状态
            print('Thinking:\n', end='', flush=True)
        
        print(chunk.message.thinking, end='', flush=True)
        thinking += chunk.message.thinking

    # 当前片段是否是【模型的回答内容】
    elif chunk.message.content:
        # 如果之前正在思考,说明思考结束了,准备输出答案
        if in_thinking:
            in_thinking = False  # 标记退出思考状态
            print('\n\nAnswer:\n', end='', flush=True)
        
        print(chunk.message.content, end='', flush=True)
        content += chunk.message.content


# 打印完整的思考过程和答案
print('\n\nThinking:\n', thinking)
print('\n\nAnswer:\n', content)

运行结果:

$ python .\ollama_example1.py
Thinking:
嗯,用户问“1+1等于多少?”,这看起来是个基础的数学问题,但可能有不同的意图。首先,我需要确定用户是想问数学中的加法,还是有其他隐含的意思。比如,在某些上下文中,1+1可能有其他含义,比如二进 制中1+1等于10,或者在集合论中,但用户可能只是想问普通的算术。

先从最基础的数学开始。在十进制加法中,1加1等于2。这是小学数学的内容,应该没错。不过用户可能是个小朋友,或者想测试我的基础知识。也有可能用户是在开玩笑,或者用这个问题来测试AI的反应,比如是否能处理简单的问题。

另外,考虑不同进制的情况。比如二进制中,1+1=10(也就是2),但用户可能没有说明进制,所以通常默认是十进和。如果是其他进制,比如十六进制,结果也不同,但一般情况下,1+1在十进制是2。

再想,有没有可能用户有其他意图?比如在编程中,1+1可能有其他含义,但问题里没有上下文。或者在语言学中,比如中文里“一加一”可能有双关,但这里用户用的是数字“1+1”,所以应该还是数学问题。       

可能的错误点:用户是否在问某种特定的领域,比如物理中的某个概念,但通常1+1在物理学中也是简单的加法。或者用户可能想问的是“1+1”在某种哲学问题中,比如“1+1=1”这样的悖论,但这里用户明确写的是“1+1等于多少”,所以应该按常规处理。

所以,最直接的回答是2,十进制下。需要确认用户是否需要进制说明,但通常默认十进制。可能需要简要说明一下,避免混淆。

另外,检查是否有其他可能的误解。比如,用户可能打错了,但问题看起来是正确的。或者在某些方言中,但中文里“1+1”就是“一加一”,结果还是2。

总结:用户的问题是基础的算术题,答案是2。需要明确说明是十进制,避免歧义。


Answer:
在常规的十进制数学中,**1 + 1 = 2**。这是最基础的加法运算,适用于所有标准数学场景(如小学数学、日常计算等)。

如果问题涉及其他进制(例如二进制),结果会不同:
- **二进制**:1 + 1 = 10(即十进制的 2)。
- 其他进制(如十六进制)的结果也需根据具体规则计算。

但根据问题的上下文和默认规则,**1 + 1 的答案是 2**。

JavaScript

下面演示通过 JavaScript 访问 Ollama 运行的大模型服务,步骤如下:

(1)运行 npm install ollama 命令,安装 ollama 库

(2)使用 ollama 库发起模型访问,代码如下:

// 导入 ollama 官方 SDK
// 用于 Node.js 环境中调用本地 Ollama 服务
import ollama from "ollama";

// 定义主函数,异步方式,因为要处理流式数据
async function main() {
    // 发起流式聊天请求
    const stream = await ollama.chat({
        model: "qwen3:4b-thinking", // 使用的模型名称
        messages: [{
            role: "user",
            content: "1+1等于多少?"  // 用户提问内容
        }],
        stream: true, // 开启流式传输(关键)
    });

    let inThinking = false; // 当前是否处于【模型思考阶段】
    let content = ""; // 模型最终输出的【完整答案】
    let thinking = ""; // 模型完整的【思考过程】

    // 循环遍历流式返回的每一个数据块(for await:异步迭代器)
    for await (const chunk of stream) {
        // 当前片段是【模型的思考内容】
        if (chunk.message.thinking) {
            // 如果是第一次收到思考内容,先打印标题
            if (!inThinking) {
                inThinking = true;
                process.stdout.write("Thinking:\n");
            }
            process.stdout.write(chunk.message.thinking);
            thinking += chunk.message.thinking;
        }

        // 当前片段是【模型的正式回答内容】
        else if (chunk.message.content) {
            // 如果之前正在思考,说明思考结束,准备输出答案
            if (inThinking) {
                inThinking = false;
                process.stdout.write("\n\nAnswer:\n");
            }
            process.stdout.write(chunk.message.content);
            content += chunk.message.content;
        }
    }
}

// 执行主函数,并使用 catch 捕获并打印错误信息
main().catch(console.error);

运行结果:

$ node .\ollama_example1.js
Thinking:
嗯,用户问“1+1等于多少?”。这个问题看起来很简单,但可能用户有不同意图。首先,我需要确定用户是在什么上下文中问的。比如,数学中的基本加法,还是其他领域?

首先,数学中1加1等于2,这是基本的算术知识。但可能用户有其他考虑,比如二进制中1+1等于10,或者用户可能在测试我的基础,或者有其他隐藏的问题。

不过,用户用中文问的,可能是在中文环境下。中文里“1+1”通常指数字的加法。所以最直接的答案应该是2。

但需要确认是否有其他可能性。比如,用户可能想问在某种特定的数学体系下,或者有语言上的双关?比如中文里“一加一”有时候可能有其他含义,但这里应该是字面意思。

另外,可能用户是小孩在学数学,或者想确认基础概念。这时候回答2是最直接的。

首先,数学中1加1等于2,这是基本的算术知识。但可能用户有其他考虑,比如二进制中1+1等于10,或者用户可能在测试我的基础,或者有其他隐藏的问题。

不过,用户用中文问的,可能是在中文环境下。中文里“1+1”通常指数字的加法。所以最直接的答案应该是2。

但需要确认是否有其他可能性。比如,用户可能想问在某种特定的数学体系下,或者有语言上的双关?比如中文里“一加一”有时候可能有其他含义,但这里应该是字面意思。

另外,可能用户是小孩在学数学,或者想确认基础概念。这时候回答2是最直接的。


不过,为了确保,我可以先回答数学中的结果,然后简要说明其他可能的解释,比如二进制,但用户可能不需要。不过问题很直接,可能不需要扩展。

所以,最合适的回答是:在标准的算术中,1加1等于2。


Answer:
在标准的算术中,1 + 1 等于 **2**。
(这是基础数学的定义,适用于日常计算和大多数数学场景。)

如果是在其他上下文中(例如二进制),1 + 1 的结果会是 **10**(二进制表示),但通常这类问题默认指十进制算术。
因此,最直接且通用的答案是 **2**。 😊

原文:https://docs.ollama.com/capabilities/streaming#javascript

  

自知之明是最难得的知识。——西班牙
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号