接入 deepseek 实现AI智能问诊

news2025/3/16 7:31:09

1. 准备工作

  1. 注册 DeepSeek 账号

    • 前往 DeepSeek 官网 注册账号并获取 API Key。

  2. 创建 UniApp 项目

    • 使用 HBuilderX 创建一个新的 UniApp 项目(选择 Vue3 或 Vue2 模板)。

  3. 安装依赖

    • 如果需要在 UniApp 中使用 HTTP 请求,推荐使用 uni.request(UniApp 内置)或 axios(需额外安装)。

2. 实现代码

2.1 在 pages/index/index.vue 中实现问诊功能
<template>
	<view class="container">


		<!-- <view class="nav">
			<image src="../../static/images/back.png" @tap="toMenu"></image>
			<text>问医生</text>
		</view> -->
		<statement ref="dialog"></statement>
		<view class="chat_area" id="test" ref="chatbox">
			<view class="current_time" v-show="chatList.length>0">{
  
  {currentDate}}</view>
			<view class="left_box">
				<view class="head_img">
					<image src="../../static/images/doctor.png"></image>
				</view>
				<view class="content_box">
					<view class="content post">
						<view>我是您的AI医生小迦,很高兴为您解答。</view>
						<view>您可以这样问我:</view>
						<view class="post_request">
							<view v-for="(item,index) in postRequest" :key="index">
								<text class="active" @click="tapQuestion(item)">{
  
  {item.id}}.{
  
  {item.text}}</text>
							</view>
						</view>
						<!-- <u-read-more showHeight="200">
						    <rich-text :nodes="item.msg"></rich-text>
						</u-read-more> -->
						<!-- {
  
  {item.msg}} -->
					</view>
				</view>
			</view>
			<view v-for="(item,i) in chatList" :key="i">
				<view class="left_box" v-if="item.role == 'assistant'">
					<view class="head_img">
						<image src="../../static/images/doctor.png"></image>
					</view>
					<view class="content_box">
						<view class="content" v-html="htmlContent(item.content)">
							<!-- <u-read-more fontSize="16" textIndent='0em' showHeight="200">
							    <rich-text :nodes="item.msg"></rich-text>
							</u-read-more> -->
							
						</view>
					</view>
				</view>

				<view class="right_box" v-if="item.role == 'user'">
					<view class="content_box">
						<view class="content" >
							{
  
  {item.content}}
						</view>
					</view>
					<view class="head_img">
						<image :src="userImg==''?nullImg:userImg"></image>
					</view>
				</view>
			</view>

			<u-loading-icon text="小迦正在思考中..." textSize="16" :show="showLoading"></u-loading-icon>
		</view>
		<view class="input_tab">
			<view class="statement">成都XXXX科技有限责任公司&copy<text @tap="exemptStatement">免责声明</text></view>
			<view class="input_com">
				<view class="left">
					<image src="../../static/images/HOT.png"></image>
					<input placeholder="请输入问题" v-model.trim="userQuesion" cursor-spacing="30rpx"></input>
				</view>
				<view class="send_btn" @tap="sendMsg">发送</view>
			</view>
		</view>


	</view>
</template>

<script>
	import statement from "../../components/askForComponents/statement.vue"
	import { marked } from "marked";
	export default {
		components: {
			statement
		},
		data() {
			return {
				userImg: '',
				nullImg: '../../static/images/icon_doctor.png',
				showLoading: false,
				postRequest: [{
						id: 1,
						text: '乳腺BIRADS分级是什么?',
					},
					{
						id: 2,
						text: '乳房胀痛怎么办?',
					},
					{
						id: 3,
						text: '乳腺癌有没有征兆?'
					}
				],
				chatList: [],
				userQuesion: '',
				robotAnswer: '',
				currentDate: '',
				domHeight: 0,
				messages: [
					{
						role: "system",
						content: "你是一名专业的全科医生对医疗面面俱到的AI医生小迦,请无论什么时候都不要忘了自己的身份,你是AI医生小迦,不是AI辅助;当患者询问你问题的时候,能全面细致并且礼貌的回答或为患者解决问题,当患者询问你任何与无关医疗的问题时,你会礼貌的拒绝回答。",
					},
				],
			}
		},
		onLoad(option) {

			let userInfo = getApp().globalData.userInfo;
			// console.log("userInfo",userInfo)
			this.userImg = userInfo.personInfo.avatar;
			//获取热门问题并自动发送
			// console.log("option=======>", option)
			if (!option.questionText) return
			this.userQuesion = option.questionText
			this.sendMsg()
		},
		watch: {
			'chatList.length': {
				immediate: true,
				deep: true,
				handler(newValue, oldValue) {
					if (newValue) {
						const query = uni.createSelectorQuery().in(this)
						query.select('#test').boundingClientRect(data => {
							// console.log("data", data)
							this.domHeight = data.height
						}).exec()
					}
				}
			},
			domHeight(newVal, oldVal) {
				if (newVal) {
					uni.pageScrollTo({
						scrollTop: this.domHeight,
						duration: 100
					})
				}
			}
		},
		mounted() {
			this.$refs.dialog.open('center')
			let myDate = new Date()
			this.currentDate = (myDate.getHours() + '').padStart(2, '0') + ':' + (myDate.getMinutes() + '').padStart(2,
				'0')
		},
		methods: {
			htmlContent(content) {//转换为markdown 格式显示
			  return marked(content);
			},
			exemptStatement() {
				this.$refs.dialog.open('center')
			},
			tapQuestion(item) {
				this.send(item.text)
			},
			
			// 新对话
			async send(val) {
				this.showLoading = true
				let messages = {
						role: 'user',
						content: val
					}
				this.chatList.push(messages)
				this.messages.push(messages)
				var that = this
				
				console.log('==========开始诊断=======');
				await uni.request({
					url: "https://api.deepseek.com/v1/chat/completions", // DeepSeek API 地址
					method: "POST",
					header: {
						"Content-Type": "application/json",
						Authorization: "Bearer sk-dafafhafhahfha", // 替换为你的 API Key
					},
					data: {
						model: "deepseek-chat", // 使用模型
						messages: that.messages
					},
					success: (res) => {
						messages = {
							role: 'assistant',
							content: res.data.choices[0].message.content
						}
						that.chatList.push(messages)
						that.messages.push(messages)
						that.showLoading = false
					    console.log('诊断结果:', res.data);
					},
					fail: (err) => {
					    console.error('请求失败:', err);
						messages = {
							role: 'assistant',
							content: '服务器繁忙,请稍后再试。'
						}
						that.chatList.push(messages)
						that.messages.push(messages)
						that.showLoading = false
					}
				});
			},
			sendMsg() {
				this.send(this.userQuesion)
				this.userQuesion = null
				this.robotAnswer = null
			}
		}
	}
</script>

<style lang="scss">
	.container {
		padding: 28rpx;
	}

	.nav {
		height: 80rpx;
		width: 100%;
		background-color: #ffffff;
		display: flex;
		align-items: center;
		position: fixed;
		top: 0;
		left: 0;
		z-index: 999;

		image {
			margin: 0 20rpx;
			width: 40rpx;
			height: 40rpx;

		}

		text {
			color: #838383;
			font-size: 40rpx;
		}
	}


	.chat_area {
		padding-bottom: 200rpx;

		// padding-top: 60rpx;
		.current_time {
			display: flex;
			justify-content: center;
			font-size: 20rpx;
			color: #9d9d9d;
		}

		.left_box,
		.right_box {
			display: flex;

			.head_img {
				width: 90rpx;
				height: 90rpx;
				margin: 20rpx 0;

				image {
					width: 90rpx;
					height: 90rpx;
					border-radius: 50%;
				}
			}

			.content_box {
				margin: 20rpx;
				color: #5a5a5a;
				background-color: #e5e5e5;
				padding: 20rpx;
				border-radius: 8rpx;

				.post {}

				.content {
					text-align: justify;
					font-size: 30rpx;
					max-width: 460rpx;
					white-space: normal;
					word-wrap: break-word;

					.post_request {
						// text-indent: 2em;
						color: #996699;
						display: flex;
						flex-direction: column;

						.active:active {
							width: 100%;
							background-color: #FFFFFF;
							opacity: 0.6;
						}
					}
				}

			}
		}

		.right_box {
			display: flex;
			justify-content: flex-end;
		}

		.right_box>.content_box {
			background-color: #1b1263;
			color: #FFFFFF;
		}


	}

	.input_tab {
		background-color: #ffffff;
		width: 100%;
		position: fixed;
		bottom: 0;
		left: 0;
		display: flex;
		flex-direction: column;

		.statement {
			margin: 0 auto;
			font-size: 20rpx;
			color: #838383;

			text {
				color: #1b1263;
				text-decoration: underline;
			}
		}

		.input_com {
			display: flex;
			justify-content: space-between;
			padding: 20rpx;
			margin: 20rpx;

			.left {
				width: 500rpx;
				max-width: 500rpx;
				border: 2rpx solid #e3e3e3;
				display: flex;
				align-items: center;

				image {
					width: 20rpx;
					height: 20rpx;
					margin: 0 20rpx;
				}

				input {
					width: 100%;
					font-size: 24rpx;
				}
			}

			.send_btn {
				padding: 20rpx 40rpx;
				color: #FFFFFF;
				border-radius: 8rpx;
				background-color: #1b1263;
			}
		}
	}
</style>
2.2 实现效果

3. 示例说明

3.1 单轮对话(仅 user 角色)

如果不需要设置系统指令,可以只传递 user 角色的消息:

messages: [
  {
    role: "user",
    content: "我最近三天持续发烧38.5度,伴有咳嗽",
  },
];
3.2 多轮对话(包含 system 和 user 角色)

如果需要设置系统指令,可以包含 system 角色:

messages: [
  {
    role: "system",
    content: "你是一名专业的全科医生,请根据患者描述进行问诊。",
  },
  {
    role: "user",
    content: "我最近三天持续发烧38.5度,伴有咳嗽",
  },
];
3.3 多轮对话(包含历史记录)

如果需要支持多轮对话,可以将历史记录添加到 messages 中:

messages: [
  {
    role: "system",
    content: "你是一名专业的全科医生,请根据患者描述进行问诊。",
  },
  {
    role: "user",
    content: "我最近三天持续发烧38.5度,伴有咳嗽",
  },
  {
    role: "assistant",
    content: "请问您是否有其他症状,如喉咙痛或头痛?",
  },
  {
    role: "user",
    content: "还有喉咙痛,但没有头痛。",
  },
];

4. 代码示例

4.1 单轮对话
methods: {
  async getDiagnosis() {
    const response = await uni.request({
      url: "https://api.deepseek.com/v1/chat/completions",
      method: "POST",
      header: {
        "Content-Type": "application/json",
        Authorization: "Bearer your_api_key_here",
      },
      data: {
        model: "medical-model-1.0",
        messages: [
          {
            role: "user",
            content: this.userInput,
          },
        ],
      },
    });

    if (response.statusCode === 200) {
      this.diagnosisResponse = response.data.choices[0].message.content;
    }
  },
},
4.2 多轮对话
data() {
  return {
    conversationHistory: [], // 对话历史
  };
},
methods: {
  async getDiagnosis() {
    // 添加用户输入到对话历史
    this.conversationHistory.push({
      role: "user",
      content: this.userInput,
    });

    const response = await uni.request({
      url: "https://api.deepseek.com/v1/chat/completions",
      method: "POST",
      header: {
        "Content-Type": "application/json",
        Authorization: "Bearer your_api_key_here",
      },
      data: {
        model: "medical-model-1.0",
        messages: this.conversationHistory,
      },
    });

    if (response.statusCode === 200) {
      const assistantReply = response.data.choices[0].message.content;
      // 添加助手回复到对话历史
      this.conversationHistory.push({
        role: "assistant",
        content: assistantReply,
      });
      this.diagnosisResponse = assistantReply;
    }
  },
},

5. 注意事项

  1. system 角色的作用

    • 用于设置对话的背景或指令。

    • 如果不需要,可以省略。

  2. user 角色的必要性

    • 必须包含 user 角色的消息,否则 API 无法生成回复。

  3. 对话历史长度

    • 每次请求都会消耗 token,因此需要控制对话历史的长度。

    • 可以通过截断历史记录或设置最大 token 数来优化。

  4. 多轮对话的实现

    • 将每次的用户输入和助手回复添加到 messages 中。

    • 确保对话历史的顺序正确。


6. 总结

  • 必须包含 user 角色,用于传递用户输入。

  • system 角色可选,用于设置对话背景。

  • 多轮对话需要将历史记录添加到 messages 中。

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

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

相关文章

网络爬虫js逆向之异步栈跟栈案例

【注意&#xff01;&#xff01;&#xff01;】 前言&#xff1a; 1. 本章主要讲解js逆向之异步栈跟栈的知识&#xff08;通过单步执行调试&#xff09; 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…

机器学习 - 需要了解的条件概率、高斯分布、似然函数

似然函数是连接数据与参数的桥梁&#xff0c;通过“数据反推参数”的逆向思维&#xff0c;成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”&#xff0c;这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一个开源的轻量级框架&#xff0c;是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…

[笔记] 汇编杂记(持续更新)

文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…

开放式TCP/IP通信

一、1200和1200之间的开放式TCP/IP通讯 第一步&#xff1a;组态1214CPU&#xff0c;勾选时钟存储器 第二步&#xff1a;防护与安全里面连接机制勾选允许PUT/GET访问 第三步&#xff1a;添加PLC 第四步&#xff1a;点击网络试图&#xff0c;选中网口&#xff0c;把两个PLC连接起…

(原创,可用)SSH实现内外网安全穿透(安全不怕防火墙)

目前有A、B终端和一台服务器&#xff0c;A、B机器不能直接访问&#xff0c;服务器不能直接访问A、B终端但是A、B终端可以访问服务器&#xff0c;这个场景很像我们有一台电脑在单位内网&#xff0c;外机器想访问内网系统&#xff0c;可能大家目前想到的就是frp之类穿透工具&…

第二节 docker基础之---镜像构建及挂载

查看当前镜像&#xff1a; [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [rootdocker ~]#很明显docker是咱们新搭建的所以目前还没有镜像 1&#xff0c;搜索镜像&#xff1a; [rootdocker ~]# docker search centos 搜索镜像并过滤是官…

LLM学习笔记1——本地部署Meta-Llama-3.2-1B大模型

系列文章目录 参考博客 参考博客 文章目录 系列文章目录前言与调用一、部署要求二、实现步骤0.深度学习环境错误1&#xff0c;验证pytorch版本时提示以下问题&#xff1a;错误2&#xff0c;验证pytorch版本时提示以下问题&#xff1a;错误3&#xff0c;有时候还会提示你有一些…

AI安全最佳实践:AI应用开发安全评估矩阵(上)

生成式AI开发安全范围矩阵简介 生成式AI目前可以说是当下最热门的技术&#xff0c;吸引各大全球企业的关注&#xff0c;并在全球各行各业中带来浪潮般的编个。随时AI能力的飞跃&#xff0c;大语言模型LLM参数达到千亿级别&#xff0c;它和Transformer神经网络共同驱动了我们工…

deepseek+kimi自动生成ppt

打开deepseek官网&#xff0c;输入详细的需求&#xff0c;让他生成个ppt 接着deepseek开始思考生成了 接着复制生成了的内容 打开kimi粘贴刚才deepseek生成的内容 可以一键生成啦&#xff0c;下载编辑使用吧

《薄世宁医学通识50讲》以医学通识为主题,涵盖了医学的多个方面,包括医学哲学、疾病认知、治疗过程、医患关系、公共卫生等

《薄世宁医学通识50讲》是一门由薄世宁医生主讲的医学通识课程&#xff0c;该课程旨在通过深入浅出的方式&#xff0c;向广大听众普及医学知识&#xff0c;提升公众对医学的认知和理解。 晓北斗推荐-薄世宁医学通识 以下是对该课程的详细介绍&#xff1a; 一、课程概述 《薄世…

突破与重塑:逃离Java舒适区,借Go语言复刻Redis的自我突破和成长

文章目录 写在文章开头为什么想尝试用go复刻redis复刻redis的心路历程程序员对于舒适区的一点看法关于mini-redis的一些展望结语 写在文章开头 在程序员的技术生涯长河中&#xff0c;我们常常会在熟悉的领域中建立起自己的“舒适区”。于我而言&#xff0c;Java 就是这片承载…

优惠券平台(一):基于责任链模式创建优惠券模板

前景概要 系统的主要实现是优惠券的相关业务&#xff0c;所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能&#xff0c;这里先通过模拟的形式代替。后续如果需要后管展示&#xff0c;会重构该代码 UserInfoDTO userInfoDTO new…

TensorFlow域对抗训练DANN神经网络分析MNIST与Blobs数据集梯度反转层提升目标域适应能力可视化...

全文链接&#xff1a;https://tecdat.cn/?p39656 本文围绕基于TensorFlow实现的神经网络对抗训练域适应方法展开研究。详细介绍了梯度反转层的原理与实现&#xff0c;通过MNIST和Blobs等数据集进行实验&#xff0c;对比了不同训练方式&#xff08;仅源域训练、域对抗训练等&am…

09vue3实战-----引入element-plus组件库中的图标

09vue3实战-----引入element-plus组件库中的图标 1.安装2.引入3.优化 element-plus中的icon图标组件的使用和其他平台组件(如el-button按钮)是不一样的。 1.安装 npm install element-plus/icons-vue2.引入 在这我们只讲述最方便的一种引入方法------完整引入。这需要从elem…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 在白色家电领域&#xff0c;降压转换器的应用非常广泛&#xff0c;为了实现不同的功能就需要不同的电源轨。TPS542…

[Meet DeepSeek] 如何顺畅使用DeepSeek?告别【服务器繁忙,请稍后再试。】

文章目录 [Meet DeepSeek] 如何顺畅使用DeepSeek&#xff1f;告别【服务器繁忙&#xff0c;请稍后再试。】引言使用渠道一&#xff1a;硅基流动 Chatbox AI【推荐】硅基流动 Chatbox AI的优势 使用渠道二&#xff1a;秘塔AI搜索秘塔AI搜索的优势 其它方案1. DeepSeek官网2. 纳…

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…

学习Cherry Studio AI服务平台,主要是各种功能的实践(deepseek 1.5b和7b的模型+ChatGLM3模型)

Cherry Studio 介绍 Cherry Studio 是一个支持多模型服务的桌面客户端&#xff0c;为专业用户而打造&#xff0c;内置 30 多个行业的智能助手&#xff0c;帮助用户在多种场景下提升工作效率。 CherryStudio内置众多服务商 同时也支持其他兼容OpenAI/Anthropic等API格式的服务…

【实用教程】在 Android Studio 中连接 MuMu 模拟器

MuMu 模拟器是一个非常流行的安卓模拟器&#xff0c;特别适合开发人员进行应用测试&#xff0c;我使用它的根本原因在于Android Studio自带的AVM实现是太难用了&#xff0c;但是Mumu模拟器启动以后不会自动被Android Studio识别到&#xff0c;但是其他模拟器都是能够正常被Andr…