当前位置: 首页 > article >正文

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客

【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客

前两章节我们讲解了使用AI Navigator软件搭建本机大模型,并使用python对大模型api进行调用,使其流式返回数据。这一章节我们使用C#实现python同样的流式返回数据并流式输出。

结果

代码

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading.Tasks;
using Flurl;
using Flurl.Http;
using System.Diagnostics;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
namespace ConsoleApp49
{
    internal class Program
    {
        public static string base_url = "http://localhost:8070";
        static void Main(string[] args)
        {
            Run();
            Console.ReadLine();
        }
        static async void Run()
        {
            string context = "你是一个友好的人工智能助手,旨在提供有用、简洁和准确的信息。";
            //获取服务器状态
            string getHealth = get_server_health();
            JObject jsonHealth = JObject.Parse(getHealth);
            string HealthStatus = jsonHealth["status"].ToString();
            if (HealthStatus == "ok")
            {
                while (true)
                {
                    Console.WriteLine("用户(输入对话或键入“exit”退出):");
                    string user_input = Console.ReadLine();
                    if (user_input.ToLower() == "exit")
                    {
                        return;
                    }
                    Console.WriteLine("AI助理:");
                    //人工智能回复信息
                    string assistant_response = await post_completion(context, user_input);
                    //组合我们之前的聊天内容
                    context = update_context(context, user_input, assistant_response);
                }
            }
            else
            {
                Console.WriteLine("服务器尚未准备好接受请求。");
            }
        }
        public static string update_context(string context, string user_input, string assistant_response)
        {
            return $"{context}\nUser: {user_input}\nAssistant: {assistant_response}";
        }

        public static string Get(string url)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "GET";
            req.Timeout = 3000;

            if (req == null || req.GetResponse() == null)
                return string.Empty;

            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            if (resp == null)
                return string.Empty;

            using (Stream stream = resp.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(stream))
                {
                    return reader.ReadToEnd();
                }
            }
        }
        public static string get_server_health() {
            string getResult = Get($"{base_url}/health");
            return getResult;
        }
        static async Task<string> post_completion(string context, string user_input)
        {
            string allStr = "";
            HttpClient httpClient = new HttpClient();
            string url = "http://localhost:8070/completion";
            string prompt = $"{context}\nUser: {user_input}\nAssistant:";
            StringContent jsonContent = new StringContent(
                JsonConvert.SerializeObject(new
                {
                    prompt = prompt,
                    temperature = 0.8,
                    top_k = 35,
                    top_p = 0.95,
                    n_predict = 400,
                    stop = new string[] { "</s>", "Assistant:", "User:" },
                    stream = true
                }), Encoding.UTF8,"application/json");
            var httpreq = new HttpRequestMessage(HttpMethod.Post, url) { Content = jsonContent };
            var response = await httpClient.SendAsync(httpreq, HttpCompletionOption.ResponseHeadersRead);
            // 确保请求成功
            response.EnsureSuccessStatusCode();
            // 读取响应内容的异步流
            using (var responseStream = await response.Content.ReadAsStreamAsync())
            {
                // 逐块读取并处理响应内容
                var buffer = new byte[5000];
                int bytesRead;
                while ((bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
                {
                    // 处理响应内容
                    string content = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead).Trim();
                    if (content != null)
                    {
                        JObject jsonObject = JObject.Parse(content.Replace("data:", ""));
                        if (jsonObject["content"].ToString().Trim() != "")
                        {
                            allStr = allStr + jsonObject["content"].ToString().Trim();
                            Console.Write(jsonObject["content"].ToString().Trim(), "");
                        }
                    }
                }
            }
            Console.Write("\n");
            return allStr;
        }
    }
}


http://www.kler.cn/news/364956.html

相关文章:

  • 【NPM】工程化依赖包/库开发 之 常见开发结构/模式及特点
  • linux入门之必掌握知识点
  • qt QSaveFile详解
  • JAVA Maven 的安装与配置
  • 雷池社区版有多个防护站点监听在同一个端口上,匹配顺序是怎么样的
  • 《近似线性可分支持向量机的原理推导》 约束条件 公式解析
  • 十八、行为型(状态模式)
  • Notepad++通过自定义语言实现日志按照不同级别高亮
  • AI写PPT工具:四款人工智能软件全面解析!!
  • 5G超级上行,到底有多行?
  • Spring Boot在线考试系统:JavaWeb技术的最佳实践
  • vue文件报Cannot find module ‘webpack/lib/RuleSet‘错误处理
  • 3.cpp基本数据类型
  • 设计模式(二)工厂模式详解
  • 数据结构_day3
  • 在Spring中,什么是配置类
  • 【C语言】自定义类型:结构体(下)
  • 《首尔破笑组:在欢笑中触摸生活的温度》
  • 给已经写好的裸机程序移植freeRTOS操作系统(二)
  • 6.Three.js贴图与uv映射(uv坐标)理解和实践
  • 鸿蒙应用示例:仿钉钉日历新建日程
  • C语言中的分支与循环(中 1)
  • Java中的基本数据类型和引用类型存储在JVM中那个区域?
  • 缓存池(对象池)使用
  • 现代山东比较出名的人物颜廷利:以塑造智慧为荣,以失去素质为耻
  • MATLAB Simulink (一)直接序列扩频通信系统