post ollama返回是很多段的
时间: 2025-06-08 17:16:25 浏览: 16
### 使用 Ollama Post 请求返回多段数据的处理方法
当使用 `ollama` 进行 POST 请求并期望接收多段数据时,可以通过流式接口来逐步获取每一段响应。以下是详细的解决方案:
#### 1. 发送带有流式参数的 POST 请求
为了支持多段数据的返回,在发起 POST 请求时需要设置特定的参数以启用流式模式。例如,可以在请求体中加入 `"stream": true` 参数。
```python
import requests
import json
url = "http://localhost:11434/api/generate"
headers = {"Content-Type": "application/json"}
data = {
"model": "your_model_name",
"prompt": "Your input prompt here.",
"stream": True # 启用流式传输
}
response = requests.post(url, headers=headers, data=json.dumps(data), stream=True)
```
此处启用了 `stream=True` 参数[^1],以便逐段读取服务器返回的数据。
---
#### 2. 实现流式数据解析逻辑
由于流式传输会分多次返回数据片段,因此需要逐一读取这些片段并对它们进行拼接或单独处理。
```python
if response.status_code == 200:
partial_responses = []
for line in response.iter_lines(decode_unicode=True):
if line.strip(): # 排除空白行
try:
chunk_data = json.loads(line) # 尝试解析 JSON 数据
if 'response' in chunk_data:
partial_responses.append(chunk_data['response']) # 提取并存储每一部分响应
except json.JSONDecodeError as e:
print(f"JSON 解析错误: {e}")
final_response = ''.join(partial_responses) # 如果需要完整的最终结果,则在此处拼接所有片段
print(final_response)
else:
print("error:", response.status_code, response.text)
```
上述代码实现了对每次返回的小块数据的捕获,并将其存入列表 `partial_responses` 中。如果应用需求仅需展示实时更新的内容,可以直接在循环内部即时输出;而如果需要整个完整的结果,则可将各片段连接起来形成最终字符串。
---
#### 3. 结合 Django 返回流式数据给前端
如果是在基于 Django 的项目中实现这一功能,推荐使用 `StreamingHttpResponse` 来向客户端推送连续的数据流。
```python
from django.http import StreamingHttpResponse
def generate_stream(request):
url = "http://localhost:11434/api/generate"
headers = {"Content-Type": "application/json"}
data = {
"model": "your_model_name",
"prompt": request.GET.get('prompt', ''),
"stream": True
}
def event_stream():
with requests.post(url, headers=headers, data=json.dumps(data), stream=True) as resp:
if resp.status_code != 200:
yield f"data: error {resp.status_code} {resp.reason}\n\n"
return
for line in resp.iter_lines(decode_unicode=True):
if line.strip():
try:
chunk_data = json.loads(line)
if 'response' in chunk_data:
yield f"data: {chunk_data['response']}\n\n"
except Exception as e:
yield f"data: Error parsing server response.\n\n"
return StreamingHttpResponse(event_stream(), content_type="text/event-stream")
```
这段代码定义了一个视图函数 `generate_stream()` ,它通过 SSE (Server-Sent Events) 协议持续向浏览器端发送来自 Ollama API 的流式数据[^2]。
---
#### 4. 示例:Gradio 界面中的流式显示
对于更直观的应用场景,比如构建 Gradio 用户界面,也可以采用类似的思路实现实时反馈效果。
```python
import gradio as gr
def chatbot(prompt):
history = [[prompt, ""]]
for res in bot(history): # 假设已存在 bot 函数用于生成流式回复
if 'response' in res:
yield res['response']
with gr.Blocks() as demo:
chatbot_input = gr.Textbox(label="Input Prompt")
chatbot_output = gr.Textbox(label="Response")
chatbot_input.submit(chatbot, inputs=chatbot_input, outputs=chatbot_output, api_name="chatbot")
demo.launch()
```
这里借助了之前提到过的 `bot()` 方法[^3],从而能够动态呈现对话历史记录以及模型产生的新内容。
---
#### 总结
以上介绍了三种不同方式下针对 Ollama POST 请求返回多段数据的具体处理流程——无论是纯 Python 脚本环境还是集成到 Web 应用框架之中都具备较高的灵活性与扩展性。
阅读全文
相关推荐

















