用国产应用开发框架(及生态),对接国产 ai。构建全国产 ai 智能体应用。

1、先要申请个 apiKey

打开 https://www.deepseek.com 官网,申请个 apiKey 。(一万字略过)

2、试试:Hello deepseek

用 solon-initializr (https://solon.noear.org/start/),生成一个 solon-web 模板项目。之后:

  • 在应用属性里添加配置(app.yml)
solon.ai.chat:
deepseek:
apiUrl: "https://api.deepseek.com/v1/chat/completions" # 使用完整地址(而不是 api_base)
apiKey: "sk-9f4415ddc57049658189************" # 填写自己申请的 apiKey
model: "deepseek-chat"
  • 用配置器类构建通用聊天模型
@Configuration
public class DeepseekConfig {
@Bean
public ChatModel chatModel(@Inject("${solon.ai.chat.deepseek}") ChatConfig config) {
return ChatModel.of(config).build();
}
}
  • 添加测试用的控制器
@Controller
public class DemoController {
@Inject
ChatModel chatModel; @Mapping("hello")
public String hello(String message) throws IOException {
return chatModel.prompt(message).call().getMessage().getContent();
}
}
  • 测试一下

启动项目。打开浏览器地址:http://localhost:8080/hello?message=hello。效果良好:

3、尝试把输出改成 sse,方便打字效果的聊天窗口开发

这里需要添加两个插件依赖,协助流式输出 sse 数据。

插件 作用
org.noear:solon-web-rx 提供响应式输出(就是流式输出)
org.noear:solon-web-sse 提供sse渲染支持

加好依赖后,只需要改进下控制器的几行代码:

@Controller
public class DemoController {
@Inject
ChatModel chatModel; @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE) //这个很重要,申明用 sse 格式渲染
@Mapping("hello")
public Flux<String> hello(String message) throws IOException {
return Flux.from(chatModel.prompt(message).stream())
.filter(resp -> resp.hasChoices())
.map(resp -> resp.getMessage().getContent());
}
}
  • 测试一下

启动项目。再次打开浏览器地址:http://localhost:8080/hello?message=hello。效果良好:

4、现在开始 RAG,以 “联网搜索” 作为知识库

这里把“联网搜索”,做为一个知识库使用(内部是动态搜索的)。用它作为 RAG 的外部检索支持。

  • 应用属性加一块配置
solon.ai.chat:
deepseek:
apiUrl: "https://api.deepseek.com/v1/chat/completions" # 使用完整地址(而不是 api_base)
apiKey: "sk-9f4415ddc57049658189************" # 填写自己申明的 apiKey
model: "deepseek-chat" solon.ai.repo:
websearch:
apiUrl: "https://api.bochaai.com/v1/web-search" # 使用完整地址(而不是 api_base)
apiKey: "sk-demo..."
  • 配置器类也调整下
@Configuration
public class DeepseekConfig {
@Bean
public ChatModel chatModel(@Inject("${solon.ai.chat.deepseek}") ChatConfig config) {
return ChatModel.of(config).build();
} @Bean
public Repository repository(@Inject("${solon.ai.repo.websearch}") AiConfig config,) {
return new WebSearchRepository(config);
}
}
  • 再改改控制器(输出重新写回简单的方式,不然不好截图)
@Controller
public class DemoController {
@Inject
ChatModel chatModel; @Inject
Repository repository; @Mapping("hello")
public String hello(String message) throws IOException {
//检索
List<Document> context = repository.search(new QueryCondition(message).limit(4)); //消息增强
ChatMessage chatMessage = UserMessage.augment(message, context); //提交大模型并简单返回(不然,截图不好截)
return chatModel.prompt(chatMessage).call().getMessage().getContent();
}
}
  • 测试一下

启动项目。打开浏览器地址:http://localhost:8080/hello?message=solon%20%E6%98%AF%E8%B0%81%E5%BC%80%E5%8F%91%E7%9A%84%EF%BC%9F。效果良好:

用 solon-ai 写个简单的 deepseek 程序(构建全国产 ai 智能体应用)的更多相关文章

  1. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  2. 用python写个简单的小程序,编译成exe跑在win10上

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  3. (原创)如何使用boost.asio写一个简单的通信程序(二)

    先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...

  4. 释放至强平台 AI 加速潜能 汇医慧影打造全周期 AI 医学影像解决方案

    基于英特尔架构实现软硬协同加速,显著提升新冠肺炎.乳腺癌等疾病的检测和筛查效率,并帮助医疗科研平台预防"维度灾难"问题 <PAGE 1 LEFT COLUMN: CUSTOM ...

  5. Python3的tkinter写一个简单的小程序

    一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...

  6. ASP.NET 使用application和session对象写的简单聊天室程序

    ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览 ...

  7. [pixhawk笔记]4-如何写一个简单的应用程序

    本文主要内容来自于:https://dev.px4.io/en/tutorials/tutorial_hello_sky.html,并对文档中的部分问题进行更正. 本文假设已经建立好开发环境并能正确编 ...

  8. 用Qt写的简单屏保程序

    近日老大提别人家产品都有屏保程序,貌似我们也该有,简单在qtcn.org请教了一下,写了个小程序! 晕倒,半天没找到上传功能!我已经上传到qtcn上了,地址如下: http://www.qtcn.or ...

  9. 用c++写一个简单的计算器程序

    // 050305.cpp : 定义控制台应用程序的入口点.// // 050304.cpp : 定义控制台应用程序的入口点.////四则运算#include "stdafx.h" ...

  10. python3 写一个简单的websocket程序(转)

    原贴:https://segmentfault.com/q/1010000009284816?_ea=1883181 也是找了好久 #! /usr/bin/env python # -*- codin ...

随机推荐

  1. openEuler欧拉部署Redis

    一.系统优化 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭selinux sed -ri 's/SELINUX=enfor ...

  2. Dapr-6: Dapr 状态管理构建块

    第 6 章 Dapr 状态管理构建块 The Dapr state management building block | Microsoft Docs 分布式应用程序由一组独立的服务构成.尽管每个服 ...

  3. 【电脑问题】开机自动进入BIOS,按下Ctrl+ALt+Del键可以正常进入系统

    问题描述:开机自动进入BIOS,按下Ctrl+ALt+Del键可以正常进入系统 Ctrl+Alt+Del 作用:立即终结电脑的异常状态,包括宕机 按法①:三个键一起按 按法 ②:先按住Ctrl和Alt ...

  4. Argocd基于网络的终端

    https://argo-cd.readthedocs.io/en/stable/operator-manual/web_based_terminal/ 官网参考:​ ​https://argo-cd ...

  5. Qt编写安防视频监控系统57-子模块1设备列表

    一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...

  6. 即时通讯技术文集(第24期):音视频WebRTC好文合集 [共20篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 24 期. [- 1 -] 开源实时音视频技术WebRTC的现状 [链接] http://w ...

  7. IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计

    本文由徐宁发表于腾讯大讲堂,原题"程序员如何把你关注的内容推送到你眼前?揭秘信息流推荐背后的系统设计",有改动和修订. 1.引言 信息推流(以下简称"Feed流" ...

  8. 得物从0到1自研客服IM系统的技术实践之路

    本文由得物技术王卫强分享,为了更好的阅读体验,有较多的内容修订和排版优化. 一.引言 客服IM的核心业务其实就是在线沟通,客服IM的好处是使得客服与用户通过实时沟通的方式可以在最短的时间内帮助用户解决 ...

  9. 不为人知的网络编程(十四):拔掉网线再插上,TCP连接还在吗?一文即懂!

    本文由作者小林coding分享,来自公号"小林coding",有修订和改动. 1.引言 说到TCP协议,对于从事即时通讯/IM这方面应用的开发者们来说,再熟悉不过了.随着对TCP理 ...

  10. 配置Ubuntu上的NFS

    $sudo apt-get install nfs-kernel-server nfs-common 配置 $sudo vim /etc/exports#添加#/home/pi/project/roo ...