asp.net 4.5在医院自助系统中使用DeepSeek帮助医生分析患者报告

news2025/3/22 21:59:06

环境:

  1. asp.net 4.5
  2. Visual Studio 2015
  3. 本地已经部署deepseek-r1:1.5b

涉及技术

  1. ASP.NET MVC框架用于构建Web应用程序。
  2. 使用HttpWebRequest和HttpWebResponse进行HTTP请求和响应处理。
  3. JSON序列化和反序列化用于构造和解析数据。
  4. SSE(服务器发送事件)用于向客户端推送实时更新。

完成显示效果如下 (患者信息是AI生成的,非真实信息)

在这里插入图片描述

1、在前端界面(cshtml)使用SSE技术向后端传送患者报告的路径。

<!-- 根据系统环境获取PDF文件路径 -->
@{string pdffilepath = datas.ReportFile;}
<div class="deepseek-title">      <!-- DeepSeek输入框 -->
	<h4 class="title3">DeepSeek分析</h4>
</div>
<div class="deepseek-textarea">
	<textarea class="text-box" id="outputTextarea" readonly></textarea> <!-- 第二行文本框 -->
	<button class="text-button" id="reparseButton">重新解析报告</button> <!-- 新增按钮 -->
</div>
<script>
     var textarea = document.getElementById('outputTextarea');
     var reparseButton = document.getElementById('reparseButton');
     var source;

     // 初始化SSE连接的函数
     function startEventSource() {
         // 如果已有连接,先关闭
         if (source) {
             source.close();
         }
         // 创建新的SSE连接
         source = new EventSource('@Url.Action("StreamAI", "DeepSeek", new { pdfPath = pdffilepath })');

         // 接收数据并更新textarea
         source.onmessage = function(event) {
             if (event.data.includes("换1行")) {
                 textarea.value += event.data.replace("换1行", "\n"); // 替换为一个换行符
             } else if (event.data.includes("换2行")) {
                 textarea.value += event.data.replace("换2行", "\n\n"); // 替换为两个换行符
             } else {
                 textarea.value += event.data; // 无特殊标记,按原数据添加
             }
             // 自动滚动到最新内容
             //textarea.scrollTop = textarea.scrollHeight; // 恢复滚动功能
         };

         // 错误处理
         source.onerror = function() {
             console.log('SSE 连接错误');
             source.close();
         };
     }

     // 页面加载时初次启动SSE
     startEventSource();

     // 按钮点击事件:清空文本框并重新解析
     reparseButton.addEventListener('click', function() {
         textarea.value = ''; // 清空文本框
         startEventSource(); // 重新建立SSE连接
     });
</script>
<style>
   .title3{
       margin: 30px 20px 0px 20px;
       margin-top:10px;
   }
   .text-box {
       margin: 10px 20px;
       width: 540px;
       height: 260px;
       font-size: 15px;
       outline:0px;
       border: 2px solid rgba(228,228,228,1);   
       border-radius: 4px;
       line-height: 25px; /* 设置行距像素 */
   }
   .text-button{
       margin: 20px 20px 0px 20px;
       width: 140px;
       height: 30px;
       background-color: #FFC107;
       font-size: 18px;
       color: white;
       font-family:SourceHanSansCN-Regular;
       border: 0px;
       border-radius: 4px;
       outline: 0;
       cursor: pointer; /* 到达按钮旁边时显示手 */
   }
</style>

2、后端接收到传递过来的患者报告路径,进行解析,然后发送给DeepSeek分析,DeepSeek分析的内容实时使用Response.Write()推送至前端。

DeepSeekController.cs

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Mvc;
using Newtonsoft.Json;

namespace *********
{
    public class DeepSeekController : Controller
    {
        public ActionResult StreamAI(string pdfPath)
        {
            // 提取 PDF 文本
            string pdfText = DeepSeekHelper.ExtractTextFromPdf(pdfPath);
            if (string.IsNullOrEmpty(pdfText))
            {
                return Content("PDF文件不存在或无法读取", "text/event-stream");
            }

            // 设置 SSE 响应头
            Response.ContentType = "text/event-stream";
            Response.Headers.Add("Cache-Control", "no-cache");
            Response.Headers.Add("Connection", "keep-alive");

            // 构造 AI 请求数据
            var requestData = new
            {
                model = "deepseek-r1:1.5b",
                prompt = $"请以专业医生的身份,对以下患者报告进行详细分析,并提供医学建议:{pdfText}请按照以下结构输出:影像/检查结果分析:详细解读报告中的影像表现或检查结果,结合医学知识说明异常情况及其可能的临床意义。诊断建议:根据分析结果,提出初步诊断方向(如疾病名称或疑似病因)。请确保内容准确、专业,并符合临床实践规范",
                stream = true
            };

            string jsonContent = JsonConvert.SerializeObject(requestData);
            byte[] byteArray = Encoding.UTF8.GetBytes(jsonContent);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:11434/api/generate");
            request.Method = "POST";
            request.ContentType = "application/json";
            request.ContentLength = byteArray.Length;
            try
            {
                using (Stream dataStream = request.GetRequestStream())
                {
                    dataStream.Write(byteArray, 0, byteArray.Length);
                }
                //string linestrs = "";
                try
                {
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    using (Stream responseStream = response.GetResponseStream())
                    using (StreamReader reader = new StreamReader(responseStream))
                    {
                        string line;
                        while ((line = reader.ReadLine()) != null)
                        {
                            if (!string.IsNullOrEmpty(line))
                            {
                                dynamic result = JsonConvert.DeserializeObject(line);
                                if (result != null && result.response != null)
                                {
                                    string responseText = result.response.ToString();
                                    string processedText = DeepSeekHelper.RegexLine(responseText);
                                    if (processedText.Contains("\n\n"))
                                    {
                                        processedText = processedText.Replace("\n\n", "换2行");
                                    }
                                    else if (processedText.Contains("\n"))
                                    {
                                        processedText = processedText.Replace("\n\n", "换1行");
                                    }
                                    //linestrs += processedText;
                                    //推送数据到客户端
                                    Response.Write($"data: {processedText}\n\n");
                                    Response.Flush();
                                }
                            }
                        }
                    }
                }
                catch (WebException ex)
                {
                    Response.Write($"data: 错误:{ex.Message}\n\n");
                    Response.Flush();
                }
            }
            catch
            {
                try
                {
                    // 返回自定义错误信息
                    Response.Write($"data: 错误:请配置本地DeepSeek,或者启动相关服务。\n\n");
                    Response.Flush();
                }
                catch
                {

                }
            }
            return new EmptyResult();
        }
    }
}

DeepSeekHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading;
using Newtonsoft.Json;

namespace *******
{
    public static class DeepSeekHelper
    {
        /// <summary>
        /// 读取PDF文件获取PDF中的文字
        /// </summary>
        /// <param name="pdfPath"></param>
        /// <returns></returns>
        public static string ExtractTextFromPdf(string pdfPath)
        {
            string pdfPath2 = pdfPath.Replace("_1.png", ".pdf");
            if (!File.Exists(pdfPath2))
            {
                Console.WriteLine("PDF文件不存在!");
                return "";
            }
            PdfReader reader = new PdfReader(pdfPath2); // 直接创建PdfReader对象
            string strs = "";
            for (int page = 1; page <= reader.NumberOfPages; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string currentText = PdfTextExtractor.GetTextFromPage(reader, page, strategy);
                strs += currentText;
            }
            reader.Close(); // 手动关闭PdfReader对象
            return strs;
        }
        
        /// <summary>
        /// 处理DeepSeek返回的字符串
        /// </summary>
        /// <param name="responseText"></param>
        /// <returns></returns>
        public static string RegexLine(string responseText)
        {
            // 使用正则表达式去掉 <think> 和 </think> 标签
            responseText = Regex.Replace(responseText, @"<\/?think>", "\n");
            // 去掉开头的换行符
            responseText = responseText.TrimStart('\r', '\n');
            return responseText;
        }
    }
}

总结

  1. 前端技术:HTML、JavaScript(使用EventSource实现SSE)。
  2. 后端技术:C# ASP.NET MVC、HTTP请求/响应处理、JSON处理。
  3. 通信技术:SSE用于服务器向客户端推送实时数据。
  4. 功能:实现了一个可以解析PDF文件内容,通过AI服务进行医学报告分析,并将结果实时推送给前端显示的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HeyGem.ai 全离线数字人生成引擎加入 GitCode:开启本地化 AIGC 创作新时代

在人工智能技术飞速演进的时代&#xff0c;数据隐私与创作自由正成为全球开发者关注的焦点。硅基智能旗下开源项目 HeyGem.ai 近日正式加入 GitCode&#xff0c;以全球首个全离线数字人生成引擎的颠覆性技术&#xff0c;重新定义人工智能生成内容&#xff08;AIGC&#xff09;的…

密码协议与网络安全——引言

三个基本概念 计算机安全&#xff08;Computer Security&#xff09;&#xff1a;对于一个自动化的信息系统&#xff0c;采取保护措施确保信息系统资源&#xff08;包括硬件、软件、固件、信息、数据和通信&#xff09;的保密性、完整性和可用性。 网络安全&#xff08;Netwo…

springboot实现调用百度ocr实现身份识别+二要素校验

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …

MATLAB 控制系统设计与仿真 - 28

MATLAB状态空间控制系统分析 - 极点配置 就受控系统的控制律的设计而言,由状态反馈极点配置和输出反馈极点配置。 状态反馈极点配置问题就是:通过状态反馈矩阵K的选取,使闭环系统的极点,即(A-BK)的特征值恰好处于所希望的一组给定闭环极点的位置。 另外,线性定常系统可…

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南&#xff0c;你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…

【深度学习新浪潮】AI ISP技术与手机厂商演进历史

本文是关于AI ISP(人工智能图像信号处理器)的技术解析、与传统ISP(图像信号处理器)的区别、近三年研究进展,以及各大手机厂商在该领域演进历史的详细报告。本报告综合多个权威来源的信息,力求全面、深入地呈现相关技术发展脉络与行业动态。 第一部分:AI ISP的定义及与传…

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法 已经弃用的版本&#xff08;Version 10.3-2021.10&#xff09;&#xff1a;gcc-arm-none-eabi&#xff1a;https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain当前版本&#xff1a;https://developer.a…

音频进阶学习二十——DFT离散傅里叶变换

文章目录 前言一、FT、FS、DTFT、DFS1.FT和FS2.DTFT和DFS 二、DFT定义1.对于DFT的理解1&#xff09;DTFT和DFT2&#xff09;DFS和DFT3&#xff09;有限长序列和周期序列 2.圆周卷积1&#xff09;线性卷积2&#xff09;圆周卷积 三、频率采样和插值恢复1.频率采样的影响2.频率采…

centos 7 部署ftp 基于匿名用户

在 CentOS 7 上搭建基于匿名用户的 FTP 服务&#xff0c;可按以下步骤进行&#xff1a; 1. 安装 vsftpd 服务 vsftpd 是一款常用的 FTP 服务器软件&#xff0c;可使用以下命令进行安装&#xff1a; bash sudo yum install -y vsftpd2. 启动并设置开机自启 vsftpd 服务 bash …

Apache SeaTunnel脚本升级及参数调优实战

最近作者针对实时数仓的Apache SeaTunnel同步链路&#xff0c;完成了双引擎架构升级与全链路参数深度调优&#xff0c;希望本文能够给大家有所启发&#xff0c;欢迎批评指正&#xff01; Apache SeaTunnel 版本 &#xff1a;2.3.9 Doris版本&#xff1a;2.0.6 MySQL JDBC Conne…

学习记录-cssjs-综合复习案例(二)

目录 商城复合案例功能实现&#xff08;二&#xff09;商城首页实现步骤1.准备工作2. 搭建html框架3. 编写js代码 完整实例代码完整项目心得 商城复合案例功能实现&#xff08;二&#xff09; 使用html&#xff0c;css&#xff0c;基于bootstrap框架以及媒体查询搭建响应式布局…

图解AUTOSAR_CP_EEPROM_Abstraction

AUTOSAR EEPROM抽象模块详细说明 基于AUTOSAR标准的EEPROM抽象层技术解析 目录 1. 概述 1.1 核心功能1.2 模块地位2. 架构概览 2.1 架构层次2.2 模块交互3. 配置结构 3.1 主要配置容器3.2 关键配置参数4. 状态管理 4.1 基本状态4.2 状态转换5. 接口设计 5.1 主要接口分类5.2 接…

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,不需要任何操作,但是有一些需要知道的东西。具体如下: 1、汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站…

QT 图表(拆线图,栏状图,饼状图 ,动态图表)

效果 折线图 // 创建折线数据系列// 创建折线系列QLineSeries *series new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 创建图表并添加系列QChart *chart new QChart;chart->addSeries(series);chart->setTit…

基于vue框架的在线影院系统a079l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,电影,电影类别,电影库 开题报告内容 基于Vue框架的在线影院系统开题报告 一、研究背景与意义 随着文化娱乐产业的蓬勃发展&#xff0c;电影院作为人们休闲消遣的重要场所&#xff0c;其管理效率和服务质量直接影响着顾客的观影体…

OpenCV图像拼接(1)概述

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此图说明了在Stitcher类中实现的拼接模块流程。使用该类&#xff0c;可以配置/移除某些步骤&#xff0c;即根据特定需求调整拼接流程。流程中的所…

基于ssm学科竞赛小程序的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息时代的来临&#xff0c;过去的学科竞赛管理方式的缺点逐渐暴露&#xff0c;本次对过去的学科竞赛管理方式的缺点进行分析&#xff0c;采取计算机方式构建学科竞赛小程序。本文通过阅读相关文献&#xff0c;研究国内外相关技术&#xff0c;提出了一种关于竞赛信息…

[特殊字符][特殊字符][特殊字符][特殊字符][特殊字符][特殊字符]壁紙 流光染墨,碎影入梦

#Cosplay #&#x1f9da;‍♀️Bangni邦尼&#x1f430;. #&#x1f4f7; 穹妹 Set.01 #后期圈小程序 琼枝低垂&#xff0c;霜花浸透夜色&#xff0c;风起时&#xff0c;微光轻拂檐角&#xff0c;洒落一地星辉。远山隐于烟岚&#xff0c;唯余一抹青黛&#xff0c;勾勒出天光水…

虚拟机的三种 Linux 网络配置原理图解读

前言 虚拟机的网络连接方式主要有 三种模式&#xff1a;桥接模式&#xff08;Bridged&#xff09;、NAT 模式&#xff08;Network Address Translation&#xff09;、仅主机模式&#xff08;Host-Only&#xff09;。每种模式都有不同的使用场景和网络适应性&#xff0c;具体解释…

AI Agent系列(七) -思维链(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技术详解1.1 CoT组成1.2 CoT的特点 二、CoT的作用三、CoT的好处四、CoT适用场景五、CoT的推理结构 前言 思维链(Chain of Thought,CoT)&#xff0c;思维链就是一系列中间的推理步骤(a series of intermediate reasoning steps)&#xff0c;通过…