背景介绍

最近在写文章的时候,一直在思考一个问题,那就是如何让自己的文章写的更好,刚好最近听了线上腾讯技术创作特训营S12的视频,于是就萌发了想要借助AI 来助力创作的想法。但是DeepSeek 官方地址在遇到访问量大的时候,总是会遇到【服务器繁忙,请稍后再试】的情况,
在这里插入图片描述

这时,我就想着,那为什么不自己搭建一个 DeepSeek-R1 服务呢?刚好最近腾讯云HAI上线了 CPU版1元限时体验活动,预装了DeepSeekR1 1.5B、7B、8B、14B、32B等五个尺寸的蒸馏模型,可以帮助你快速搭建属于自己的 专属 DeepSeek 工具,特别方便。

1元购买

这个腾讯云HAI CPU版1元显示体验活动,可谓是腾讯云官方为了大家准备的一个小福利,平时的腾讯云HAI GPU版的收费往往都比较贵,不太适合个人爱好者,并且往往都是按小时计费的,就像这样
在这里插入图片描述
但是对于个人开发者来说的话,GPU版的话往往有点浪费资源了,个人使用的话CPU版就完全够用。这不,腾讯云考虑到个人开发者的学习成本,贴心推出了腾讯云HAI CPU版1元限时体验活动 ,想要体验的小伙伴快快下手吧。这里需要说明一下, 由于资源有限,先到先得,需要抢的哦,当你选择【立即购买】遇到这个弹框的时候,那么你就需要换一个了
在这里插入图片描述

换一个别的 1元体验的立即购买,本次腾讯云的 1元限时体验活动一共有四款可供选择,价格都是1元,根据不同的算力体验的市场有所不同,这里我们也不用挑选了,有什么选什么了。点击【立即购买】
在这里插入图片描述

在订单确认页面确认订单信息,勾选协议,点击【下一步】
在这里插入图片描述

完成支付后即可开通腾讯云HAI CPU 体验版服务。

上手DeepSeek-R1 模型

基于腾讯云HAI 服务器搭建好 DeepSeek-R1 模型之后,我们就可以上手体验了。你可以通过多种方式来连接你搭建的DeepSeek-R1 模型,下面我们来说一下几种常用的吧。

OpenWebUI

通过 OpenWebUI 可视化界面使用,这种方式比较直接,使用也比较方便。首先登录 高性能应用服务控制台 ,选择【算力管理】菜单,找到我们创建的 HAI 应用服务器,点击【算力连接】,选择 OpenWebUI
在这里插入图片描述

在打开的新窗口中,点击【开始使用】
在这里插入图片描述

初次使用 OpenWebUI ,需要 自定义名称、电子邮箱、密码,创建管理员账号
在这里插入图片描述

管理员账号创建成功之后跳转到 DeepSeek-R1 可视化界面,输入我们的问题:【想写一篇好的文章,需要从哪些方面注意呢】,当然你也可以通过点击输入框前面的【+】号来通过上传截图或者文件来获取你想要的结果。同时你还可以通过左上角的模型切换
在这里插入图片描述

ChatbotUI

如果你想要通过参数控制你输入问题的生成内容,那么你也可以通过 ChatbotUI来访问 DeepSeek-R1,在腾讯云HAI控制台,点击【算力连接】,选择【ChatbotUI】,
在这里插入图片描述

我们可以通过【生成温度】来控制生成内容:较高的数值(例如0.8)会使输出更随机,而较低的数值(例如0.2)会使输出更加聚焦和确定性更强。同样的,在ChatbotUI 页面,我们同样可以切换不同的模型体验
在这里插入图片描述

终端连接SSH

除了通过可视化页面连接DeepSeek-R1 大模型外,还可以通过终端连接 SSH的方式,同样的点击【算力连接】,选择【终端连接SSH(SSH)】,
在这里插入图片描述

在打开的终端连接页面,用户名默认,输入服务器密码登录
在这里插入图片描述

登录成功之后,在终端连接页面需要先执行命令加载 deepseek-r1 模型

ollama run deepseek-r1

等待模型加载完成之后,就可以输入具体的文本内容体验效果了
在这里插入图片描述

JupyterLab 命令行

终端连接SSH 方式和 JupyterLab 命令行使用方式其实差不多,都是需要先加载默认模型,然后通过在命令行界面输入文本内容来获取想要的内容,不同于上面两种有UI界面的方式,UI界面方式相对来说更容易操作,并且可视化也比较好。这里同样是点击【算力连接】,选择【JupyterLab】
在这里插入图片描述

在打开的 JupyterLab 界面,新建一个 Terminal,输入加载默认模型命令

ollama run deepseek-r1

这里需要说明的是,如果你上面已经通过终端连接SSH的方式为服务器加载过默认模型,那么这里你在输入加载默认模型的命令后,实际上是不会再次加载模型的,而是可以直接展示对话输入表示,输入你的文本内容就可以获取想要的内容了
在这里插入图片描述

当然,除了官方提供的连接DeepSeek-R1 模型的方法,还可以通过第三方工具进行连接,这里我就有一个比较好的工具推荐:Chatbox客户端调用

Chatbox客户端调用

在使用Chatbox 客户端调用之前,首先需要下载安装 Chatbox, 访问 Chatbox 下载地址下载并安装客户端,我的电脑是Windows 系统,这里我选择下载 Windows 版本的
在这里插入图片描述

下载完成后双击安装,整个安装过程比较简单,按照默认的操作点击【下一步】即可,如果需要更换安装路径的,在选择安装路径操作页面更换自己想要安装的路径,安装完成后双击打开 Chatbox 客户端,选择【使用自己的API Key 或本地模型】
在这里插入图片描述

继续在【选择并配置 AI 模型提供方】的弹框页面下拉选择【Ollama API】,这里需要说明一下,为什么选择Ollama API,这是因为我们当前操作的DeepSeek-R1 模型 是通过Ollama安装的,这一点 我们在上面通过命令行加载默认模型的时候,使用的命令 ollama run deepseek-r1 也可以看出来
在这里插入图片描述

由于通过Ollama API 连接的方式,需要配置API域名地址,就是你的 HAI 实例的公网 IP:6399。因此这里需要保证你的腾讯云HAI 服务器已经开通了 6399端口,如果没有开通的话,你可以点击实例名称,进入实例详情,选择【端口配置】-【编辑规则】
在这里插入图片描述

在跳转的编辑规则页面,点击【添加规则】输入需要放开的端口 6399,这里我选择来源为【安全组】并且选择现有的安全组,添加协议端口【TCP:6399】
在这里插入图片描述

端口配置完成之后,再次回到Chatbox 的配置页面,在API 域名输入我们的访问地址 http://公网ip:6399,选择使用的模型【deepseek-r1:latest】,其他参数默认即可,点击【保存】
在这里插入图片描述

保存完成后,在对话框中输入我们需要想要的内容后,就可以获取我们想要的内容啦。在文字内容结束之后,Chatbox 会自动展示本次对话内容消耗的 tokens 以及使用的model ,如果我们想要切换对话模型,可以通过右侧对话框的选择按钮来切换模型
在这里插入图片描述

同样的,如果你需要使用DeepSeek-R1 解析文件内容或者是图片内容的话,你也可以通过下面对话框的配置项来操作,比如这里我上传一张滴滴电子发票,让 DeepSeek-R1 解析一下文件内容
在这里插入图片描述

调用对话API

到这里,大家是不是有这样一个想法,既然我们可以通过可视化界面、命令行、第三方客户端的方式访问我们自己搭建的DeepSeek ,那么是否可以通过API 接口的方式来访问呢?答案是肯定的,下面我来继续交大家如何通过API接口的方式访问。作为Java 开发者,个人比较喜欢用的一款接口调试工具是 Apipost,具体的下载地址这里就不再贴了,大家需要的话可以浏览器直接搜索,或者你也可以根据自己的喜欢使用postman 调用,都是可以的。接口调用需要接口地址,那么这里的接口地址就是: http://公网IP:6399/v1/chat/completions 请求参数

{
    "model": "deepseek-r1",
    "messages": [
        {
            "role": "user", 
            "content": "介绍一下你自己"
        }
    ]
}

在这里插入图片描述

根据官方调用对话API接口文档的话,还需要 API-KEY,但是我们这里部署的 DeepSeek-R1 服务是没有设置API-KEY的,因此这里可以直接输入调用地址,请求参数,即可发起调用。参考官方文档配置的适合自己搭建的DeepSeek 的 curl 调用示例如下

curl http://公网IP:6399/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
        "model": "deepseek-r1",
        "messages": [
          {"role": "user", "content": "介绍一下你自己"}
        ]
      }'

AI代码助手配置

当然,除了上面提到的几种调用方法,我们还可以为我们自己的 腾讯云AI 代码助手配置我们自己部署的DeepSeek 服务,配置方法也很简单,在 IDEA 开发工具中,点击 ollama 后面的去设置按钮
在这里插入图片描述

在打开的页面中输入我们自己部署的DeepSeek 的公网地址以及端口号,也就是 Base Url 地址:http://43.133.187.146:6399/api/chat,Model ID 选择 deepseek-r1 ,点击保存完成配置
在这里插入图片描述

配置完成后,在切换模型的下拉选项中切换我们刚才配置的模型,输入对话内容
在这里插入图片描述

到这里,关于1分钟,1元成本带你快速搭建你的专属DeepSeek,还有多场景体验操作指导的所有操作就算结束了。

场景落地

其实,到上面为止,关于1分钟,1元成本搭建专属DeepSeek的操作算完成了,但是上面的操作并不算完全完成。确实,通过OpenWebUI 或者 ChatbotUI 你可以实现页面可视化的使用自己的 DeepSeek,并且再也不用担心会出现【服务器繁忙,请稍后重试。】的情况了。通过终端连接SSH或者是 JupyterLab 命令行的方式可以实现命令行使用DeepSeek 的对话操作,以及后面的通过第三方Chatbox 客户端调用,API调用等方式来实现调用自己搭建的 DeepSeek。

场景背景

但是上面的操作,对于你目前的项目,或者说你的实际业务场景中间似乎少了一个联系。有这样一个场景,你现在维护着一款CMS内容管理系统版本的迭代升级,过去我们需要在CMS系统中发布公告,往往都是通过人工的录入的方式来新建公告,比如录入公告标题,公告内容等。那么是否可以将录入公告内容的操作通过自己搭建的DeepSeek 来生成内容进行操作呢?答案是:可以的。

页面改造

现在的CMS内容管理系统中的公告管理的新增页面是这样的,包含以下字段:公告标题、公告类型、公告内容、公告状态
在这里插入图片描述

那么,现在我们想给当前的新增和修改页面增加一个可以调用基于腾讯云HAI 搭建的个人专属 DeepSeek 大模型服务来生成公告内容,并将生成的公告内容放在编辑器中的操作,最后可以正常的保存到数据库。那么这里我首先在页面新增 add 一个字段,作为关键词的输入框,并且增加一个按钮,点击则调用个人专属 DeepSeek 大模型来获取返回的内容放入公告中。

这里我们可以借助腾讯云AI 代码工具,输入我的需求:【参考选中部分 帮我重新生成一个字段输入框 用 多行文本的 字段名称叫 公告prompt 文本框下面增加一个按钮 按钮名称为 生成 同时给按钮添加点击事件】
在这里插入图片描述

以下内容是腾讯云AI 代码助手帮助我们生成的内容,这里生成的 js 方法其实并不能使用,因为我们在描述中并没有告知我们需要什么样的js 方法,

<div class="form-group">
    <label class="col-sm-2 control-label">公告prompt:</label>
    <div class="col-sm-10">
        <textarea id="noticePrompt" name="noticePrompt" class="form-control" rows="4"></textarea>
        <button type="button" class="btn btn-primary" style="margin-top: 10px;" onclick="generatePrompt()">生成</button>

    </div>

</div>

<!-- 原有代码保持不变 -->
<div class="form-group">    
    <label class="col-sm-2 control-label is-required">公告标题:</label>
    <div class="col-sm-10">
        <input id="noticeTitle" name="noticeTitle" class="form-control" type="text" required>
    </div>
</div>

<script>
function generatePrompt() {
    // 这里添加生成逻辑,示例演示自动填充内容
    const promptField = document.getElementById('noticePrompt');
    promptField.value = "请在这里编写您的公告模板...\n1. 公告主题:\n2. 主要内容:\n3. 生效日期:";
    
    // 实际使用时可以替换为:
    // 1. AJAX请求获取服务器生成的提示
    // 2. 使用模板引擎生成内容
    // 3. 其他业务逻辑处理
}
</script>

这里我们只需要取我们需要的内容就好,在页面添加多行文本框及按钮,同样的办法,选中系统中现有的 ajax 方法,然后输入我们的需求【参考选中代码,生成一个 ajax方法,获取页面公告prompt 的内容,调用后端服务生成公告内容,并将返回的数据放在公告内容中】
在这里插入图片描述

这是腾讯云AI 代码助手会基于我们选中的代码格式帮助我们生成相似的 Ajax 异步请求方法,并且格式和结构也符合现有系统代码的结构,将生成的js 调用方法直接放在页面现有的 标签内

<script>

function generateContent() {
    // 获取公告prompt内容
    var promptContent = $("#noticePrompt").val();
    
    $.ajax({
        type: "POST",
        url: ctx + "system/notice/generate",
        data: { 
            prompt: promptContent 
        },
        dataType: 'json',
        beforeSend: function() {
            $.modal.loading("正在生成公告内容...");
        },
        success: function(result) {
            if (result.code == web_status.SUCCESS) {

                // 将生成内容插入公告内容编辑器
                $("#noticeContent").val(result.data.content);
                // 如果使用富文本编辑器(如Summernote):
                // $('#noticeContent').summernote('code', result.data.content);
            } else {
                $.modal.alertError(result.msg);
            }
        },

        error: function(error) {
            $.modal.alertWarning("公告生成失败,请稍后重试。");
        },
        complete: function() {
            $.modal.closeLoading();
        }
    });
}
</script>

这里需要说明一点,就是腾讯云AI 代码助手在帮我们生成 前端js 方法的时候,同时也为我们生成了后端对应的调用方法,这个就很智能了,还没到这一步呢,直接就生成了。虽然只是一个后端方法的 架子,但是已经为我们节省一步操作了。
在这里插入图片描述

下面就是基于上面生成的后端调用方法的架子,在里面补充通过API接口调用我们自己搭建的专属 DeepSeek 服务的代码,同时将 DeepSeek 接口返回的数据内容解析并返回给前端js 方法,用于赋值。

后端方法

将上面一步生成的后端方法的架子先复制到后端 公告管理 controller 中,选中代码生成的位置,同时将我们在调用对话API 接口时参考官方文档组建的 curl 调用的请求内容复制到AI 代码助手的对话框中 并输入我们想要的内容

curl http://公网IP:6399/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
        "model": "deepseek-r1",
        "messages": [
          {"role": "user", "content": "介绍一下你自己"}
        ]
      }' 在选中位置生成 java 调用代码

在这里插入图片描述

找到生成的代码内容,并将代码插入到当前选中的位置,然后再引入代码中用到的 jar 包,同时对生成的代码进行微调,调整后,在前端页面发起调用。此时可以看到,我们通过输入 文本内容,调用后端 API接口的方法已经成功的返回了 DeepSeek-R1 生成的内容,但是并没有成功赋值到文本框中,
在这里插入图片描述

这时我们就需要处理一下如何往富文本框中 赋值,参考提交方法中对于富文本框的取值方式,在ajax 获取到自主搭建的专属 DeepSeek-R1 服务返回的数据后,成功赋值到富文本框中
在这里插入图片描述

到这里,通过前端搭建 ajax 异步调用方法获取后端服务返回的 DeepSeek生成内容并赋值到公共内容中的操作就完成了,整个过程中涉及到的前端html 代码以及 js 代码,如下

<div class="form-group">
	<label class="col-sm-2 control-label">公告prompt:</label>

	<div class="col-sm-10">

		<textarea id="noticePrompt" name="noticePrompt" class="form-control" rows="4"></textarea>

		<button type="button" class="btn btn-primary" style="margin-top: 10px;" onclick="generateContent()">生成</button>
	</div>

</div>
function generateContent() {
	// 获取公告prompt内容

	var promptContent = $("#noticePrompt").val();


	$.ajax({
		type: "POST",

		url: ctx + "system/notice/generate",

		data: {
			prompt: promptContent
		},
		dataType: 'json',
		beforeSend: function() {

			$.modal.loading("正在生成公告内容...");
		},
		success: function(result) {

			if (result.code == web_status.SUCCESS) {

				console.log(result.data);
				// 如果使用富文本编辑器(如Summernote):
				$('.summernote').summernote('code', result.data);
			} else {
				$.modal.alertError(result.msg);
			}
		},
		error: function(error) {

			$.modal.alertWarning("公告生成失败,请稍后重试。");
		},
		complete: function() {
			$.modal.closeLoading();
		}
	});
}

后端调用 DeepSeek 接口并返回数据的代码实现如下

@PostMapping("/generate")

@ResponseBody
public AjaxResult generateContent(@RequestParam String prompt) {
	// 1. 处理prompt内容
	String generatedContent = "";
	// 2. 调用AI服务或模板引擎生成内容
	try {
		// 构建请求URL(根据实际服务地址配置)
		String apiUrl = "http://43.133.187.146:6399/v1/chat/completions";

		// 创建请求头
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON);

		// 构建请求体(使用LinkedHashMap保持字段顺序)
		java.util.Map<String, Object> requestBody = new LinkedHashMap<>();
		requestBody.put("model", "deepseek-r1");

		List<Map<String, String>> messages = new ArrayList<>();

		messages.add(new HashMap<String, String>(){{
			put("role", "user");
			put("content", prompt);
		}});
		requestBody.put("messages", messages);

		// 发送POST请求
		RestTemplate restTemplate = new RestTemplate();
		ResponseEntity<Map> response = restTemplate.postForEntity(
			apiUrl,
			new HttpEntity<>(requestBody, headers),
			Map.class
		);

		// 解析响应
		if (response.getStatusCode() == HttpStatus.OK) {
			Map<String, Object> responseBody = response.getBody();
			if (responseBody != null && responseBody.containsKey("choices")) {
				List<Map<String, Object>> choices = (List<Map<String, Object>>) responseBody.get("choices");
				if (!choices.isEmpty()) {
					Map<String, Object> firstChoice = choices.get(0);
					Map<String, String> message = (Map<String, String>) firstChoice.get("message");
					generatedContent = message.get("content");
				}
			}
		}
	} catch (Exception e) {
		generatedContent = "根据[" + prompt + "]生成的公告内容(生成服务异常)...";
	}
	System.out.println(generatedContent);

	// 3. 返回格式示例:
	return AjaxResult.success("生成成功",  generatedContent);
}

这里我再演示一下,用一个小视频来看一下效果吧
【DeepSeek接入公告管理】 https://www.bilibili.com/video/BV1p3QhYtEnG/?share_source=copy_web&vd_source=bc8f8a81487b74186021d383c25648ad

最后总结

可以说,本次腾讯云推出的腾讯云HAICPU版1元限时体验活动 还是很不错的,整个部署过程也比较简单,目前的 1元版限时体验活动,购买后DeepSeek-R1 就直接部署成功了,后面你只需要根据你具体的场景来调用就可以,比如通过当前可视化界面或者是通过命令行,通过第三方客户端调用等,操作都比较简单。成本方面也比较适合个人开发者,另外自己搭建的专属DeepSeek 对于个人来说,也足够使用了,肯定不会出现服务器繁忙的情况。在使用DeepSeek主流语言模型的一些场景上,比如做常规的问答,或者是做内容编辑者,都是可以通过自己搭建的DeepSeek 模型轻松实现。另外在文中也提供了java 接入项目中的接口调用操作,其他语言的接口调用操作同样的原理,可以基于 我整理的 curl 的调用方法

curl http://公网IP:6399/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
        "model": "deepseek-r1",
        "messages": [
          {"role": "user", "content": "介绍一下你自己"}
        ]
      }'

通过腾讯云AI 代码助手来快速生成你具体语言场景的代码,接入了DeepSeek-R1 的AI代码助手,生成的代码整体上基本不用变化,只需要少量的优化,整个功能就可以完成,采纳率,准确率可以达到95%以上,相对于过去的代码生成来说,真的是可以很大的提高开发效率。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐