Skip to content

Luồng dữ liệu cho phép bạn hiển thị văn bản ngay khi mô hình tạo ra nó.

Luồng dữ liệu được bật theo mặc định thông qua API REST, nhưng bị tắt theo mặc định trong các SDK.

Để bật luồng dữ liệu trong các SDK, đặt tham số stream thành True.

Các khái niệm chính về luồng dữ liệu

  1. Trò chuyện: Truyền các tin nhắn trợ lý một phần. Mỗi chunk bao gồm trường content để bạn có thể hiển thị tin nhắn ngay khi chúng đến.
  2. Suy luận: Các mô hình có khả năng suy luận sẽ phát ra trường thinking cùng với nội dung thông thường trong mỗi chunk. Phát hiện trường này trong các chunk luồng dữ liệu để hiển thị hoặc ẩn các dấu vết suy luận trước khi câu trả lời cuối cùng được trả về.
  3. Gọi công cụ: Theo dõi các tool_calls được truyền luồng trong mỗi chunk, thực thi công cụ được yêu cầu và nối kết quả thực thi công cụ trở lại vào cuộc trò chuyện.

Xử lý các chunk dữ liệu luồng

Lưu ý

Bạn cần tích lũy các trường một phần để duy trì lịch sử cuộc trò chuyện. Điều này đặc biệt quan trọng đối với việc gọi công cụ, nơi phần suy luận, lệnh gọi công cụ từ mô hình và kết quả thực thi công cụ phải được gửi trở lại cho mô hình trong yêu cầu tiếp theo.

Python

```python
from ollama import chat

stream = chat(
  model='qwen3',
  messages=[{'role': 'user', 'content': 'What is 17 × 23?'}],
  stream=True,
)

in_thinking = False
content = ''
thinking = ''
for chunk in stream:
  if chunk.message.thinking:
    if not in_thinking:
      in_thinking = True
      print('Thinking:\n', end='', flush=True)
    print(chunk.message.thinking, end='', flush=True)
    # tích lũy phần suy luận một phần
    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)
    # tích lũy nội dung một phần
    content += chunk.message.content

  # nối các trường đã tích lũy vào tin nhắn cho yêu cầu tiếp theo
  new_messages = [{ role: 'assistant', thinking: thinking, content: content }]
```

JavaScript

```javascript
import ollama from 'ollama'

async function main() {
  const stream = await ollama.chat({
    model: 'qwen3',
    messages: [{ role: 'user', content: 'What is 17 × 23?' }],
    stream: true,
  })

  let inThinking = false
  let content = ''
  let thinking = ''

  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)
      // tích lũy phần suy luận một phần
      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)
      // tích lũy nội dung một phần
      content += chunk.message.content
    }
  }

  // nối các trường đã tích lũy vào tin nhắn cho yêu cầu tiếp theo
  new_messages = [{ role: 'assistant', thinking: thinking, content: content }]
}

main().catch(console.error)
```