调用本地部署好的ollama的API—stream:True流式返回

继续前面提到的“调用本地部署好的ollama的API—stream:False 非流式返回https://blog.csdn.net/laironggui/article/details/145731526

本文将其改为流式返回,参考代码如下:

import requests
import json

# API的URL,注意端口号
url = 'http://127.0.0.1:8687/api/chat'

# 发送的请求数据体
data = {
    "model": "deepseek-r1:1.5b",
    "messages": [
        {"role": "system", "content": "你是一个著名的诗人"},
        {"role": "user", "content": "南方数码一家测绘地理信息行业的公司,集数据、软件、服务于一体&
<think>好的,我需要帮助用户编写C#代码来调用本地部署ollama deepseek-r1:1.5b模型,并实现流式响应输出。首先,我得确认ollamaAPI接口是什么样的。根据之前的知识,ollama通常通过HTTP接口提供服务,默认端口可能是11434。接下来,用户需要使用C#进行调用,所以需要用到HttpClient类来处理HTTP请求。 然后,流式响应的实现需要处理分块传输的数据。HttpClient应该以流的方式读取响应内容,而不是一次性获取全部响应。这需要设置HttpCompletionOption.ResponseHeadersRead,这样可以在接收到响应头后就开始读取数据,而不是等待整个响应体完成。 接下来,构造POST请求的URL,应该是http://localhost:11434/api/generate。请求体需要包含model名称、prompt和stream参数。这里需要将stream设置true以启用流式传输。请求体需要以JSON格式发送,所以要将参数序列化成JSON,并设置ContentType为application/json。 然后,处理响应流。使用ReadLineAsync逐行读取,因为ollama的响应可能是以换行符分隔的JSON对象。每一行需要反序列化,提取出response字段,并累加到结果中,同时实时输出到控制台。需要注意的是,流式响应可能会包含多个JSON对象,每个对象包含部分响应数据,所以需要循环读取直到流结束。 此外,异常处理也是必要的,比如捕获HttpRequestException和其他可能的异常,确保程序健壮性。最后,测试代码,确保能够正确连接到ollama服务,并且流式输出正常工作。 现在,把这些步骤转化为具体的代码。首先创建HttpClient实例,构造请求内容,发送POST请求,然后处理响应流。在循环中读取每一行,解析JSON,输出并累加响应内容。同时,处理可能的错误情况,比如无法连接到服务或者模型不存在等情况。 需要确保用户已经正确安装并运行ollama服务,并且deepseek-r1:1.5b模型已经下载到本地。代码中的模型名称需要与ollama中的模型名称完全一致,否则会报错。另外,可能需要处理网络连接问题,比如重试机制或者超时设置,但为了简化示例,这里可能暂时不涉及,但可以提醒用户注意这些方面。 最后,提供一个完整的示例代码,用户可以直接复制并修改必要的部分,比如模型名称和提示内容。同时,说明如何运行和测试代码,确保用户能够顺利使用。</think>以下是如何使用C#调用本地部署ollama deepseek-r1:1.5b模型并实现流式输出的解决方案: ### 一、环境准备 1. 确保已安装ollama并运行服务(默认端口11434) 2. 已通过命令`ollama pull deepseek-r1:1.5b`下载模型[^1] ### 二、实现步骤 ```csharp using System; using System.Net.Http; using System.Text; using System.Text.Json; using System.Threading.Tasks; class OllamaStreamClient { static async Task Main(string[] args) { const string apiUrl = "http://localhost:11434/api/generate"; var client = new HttpClient(); var requestData = new { model = "deepseek-r1:1.5b", prompt = "请用中文解释量子计算", stream = true }; try { var content = new StringContent( JsonSerializer.Serialize(requestData), Encoding.UTF8, "application/json"); using var response = await client.PostAsync( apiUrl, content, HttpCompletionOption.ResponseHeadersRead); response.EnsureSuccessStatusCode(); using var stream = await response.Content.ReadAsStreamAsync(); using var reader = new System.IO.StreamReader(stream); StringBuilder fullResponse = new StringBuilder(); while (!reader.EndOfStream) { var line = await reader.ReadLineAsync(); if (!string.IsNullOrEmpty(line)) { var json = JsonDocument.Parse(line); if (json.RootElement.TryGetProperty("response", out var token)) { var output = token.GetString(); Console.Write(output); fullResponse.Append(output); } } } Console.WriteLine("\n\n完整响应:"); Console.WriteLine(fullResponse.ToString()); } catch (HttpRequestException ex) { Console.WriteLine($"请求失败: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"发生错误: {ex.Message}"); } } } ``` ### 三、关键点说明 1. **流式处理**:通过`HttpCompletionOption.ResponseHeadersRead`实现实时响应处理[^2] 2. **JSON解析**:使用System.Text.Json逐行解析响应数据 3. **错误处理**:包含网络请求和数据处理的多层异常捕获 4. **性能优化**:StringBuilder累积完整响应避免内存碎片 ### 四、测试验证 1. 启动ollama服务:`ollama serve` 2. 新建控制台项目,添加System.Text.Json包引用 3. 运行代码观察流式输出效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值