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
- 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. - Suy luận: Các mô hình có khả năng suy luận sẽ phát ra trường
thinkingcù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ề. - 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)
```