自定义实现 Spring AI 的 ChatModel 接口:轻松封装百炼 DashScope API
自定义实现 Spring AI 的 ChatModel 接口:轻松封装百炼 DashScope API 引言: 在实际开发中,我们经常需要调用不同的大模型 API,而 Spring AI 提供了统一接口来简化这一过程。然而,Spring AI 并未直接支持所有模型提供方(如百炼 DashScope)。本文通过实现 ChatModel 接口,演示如何将任意大模型 API(以百炼为例)封装为 Spring AI 可用的模型,从而实现灵活切换和功能扩展。 最近项目开发中经常用到 Spring AI,作为 Spring 全家桶的一员,它为 AI 生态封装了一套统一、易用的 API 规范,可以很方便地实现工具调用等特性。 同时 Spring AI 适配了一些模型提供方的 API,你可以在 spring application 配置文件中配置 url + api key 做到开箱即用。 但是美中不足的是,Spring AI...
大模型学习笔记
LLM学习笔记Embeddinghttps://www.julyedu.com/question/big/kp_id/30/ques_id/2968 https://projector.tensorflow.org/ 在人工智能领域,Embedding(嵌入)是一种将离散对象(如单词、类别、图像等)转换为连续向量表示的技术。这些向量会在低维空间中,并且能够体现出对象之间的语义关系。Embedding 本质上是一种映射,把高维空间中稀疏、离散的数据点映射到低维的连续向量空间。在这个新的空间里,相似的对象在空间中的距离会更近,不同的对象距离则更远。 文本中的每个单词会用独热编码(One-Hot Encoding)表示。不过,这种编码方式会导致向量维度非常高且稀疏。而词嵌入会把每个单词映射到一个低维的连续向量,例如 100 维或者 300 维。这些向量是通过神经网络训练得到的,训练目标是让在语义上相近的单词在向量空间中的距离也相近。
MCP深度解析
MCP深度解析前言MCP
虚拟线程(有栈协程)对于Java的意义
虚拟线程(有栈协程)对于Java的意义1.传统同步线程模型在传统的 servlet 生态中,线程模型一般是 thread per request,即每个请求分配一个线程,这个线程负责整个请求的生命周期。 有个很直观的理解:ThreadLocal–在一次请求过程中,可以在请求上游往 ThreadLocal set 一些数据,比如可以存 userId、trace 等;在请求下游时直接调用 threadLocal.get() 即可获取。 在这种线程模型中,想要承载更多请求,就需要添加更多线程。更多的线程意味着带来更多的资源占用: 一个 Java 线程的线程栈大小通常为 1MB,这意味着如果需要同时处理 1000 个并发连接,光线程栈的内存占用就有 1000 MB。 Java 平台线程本质上是由 JVM 映射到操作系统的内核线程,如果并发请求数量增多,内核线程就需要同样增加。 每个内核线程需要由操作系统分配线程控制块, 过多的内核线程会导致频繁的线程上下文切换,如果存在阻塞的 IO...
OSPP参与记录
前言今年毕业前申请参与了2024年的开源之夏(OSPP),是一次很宝贵的开源项目经验,最终成功结项。写这篇博客以此记录留存。 本博客记录的内容截至日期为 2024:09:30,最终方案相比本文有变动,例如放弃 jprotobuf 方案、重构 Grpc 调用模块等。具体详见:https://github.com/alibaba/arthas/pull/2914 项目申请书项目名称:探索 Java 低资源消耗的 gRPC 实现 项目主导师:断岭 申请人:风业 日期:2024.06.03 邮箱:1129126684@qq.com 项目背景Arthas 是一个 Java 诊断工具,它允许开发人员在无需修改应用程序代码的情况下,动态地监视和解决生产环境中 Java 应用程序的问题。目前 Arthas 主要是通过交互式的命令行提供服务,此外也提供了 http api。但是 http api 比较简陋,预期通过grpc server提供服务。但是官方的 grpc 实现依赖多、运行时内存占用高,本项目旨在提供一种低资源消耗的 grpc 实现,需要支持 stream...
部署Grafana+Prometheus+Exporter
Grafana1docker run -d --name=grafana --network host grafana/grafana-enterprise Prometheus下载并解压 123wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gztar xvfz prometheus-*.tar.gz 给 prometheus 配置 systemd 启动,默认运行端口为 9090 12345678910111213141516171819202122vim /usr/lib/systemd/system/prometheus.service[Unit]Description=prometheus[Service]WorkingDirectory=/home/fengye/prometheus/prometheus-2.42.0.linux-amd64#...
类加载机制
前言Java为了做到“一次编写,到处运行”,发布了运行在不同平台上的JVM,所有平台上的JVM都支持统一的程序存储格式————字节码(ByteCode),而存储字节码的二进制文件被称为Class文件。 对于JVM来说,不管是什么语言,只要能编译成Class文件,就可以在JVM中运行。换句话说,JVM不与任何语言绑定,而是与Class文件绑定。 任何一个Class文件都对应一个唯一的类或者接口,但是类或接口不一定定义在文件中(例如可以动态生成)。 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 类文件结构在学习类加载之前,需要先了解Class文件的结构。 首先给出一个简单的代码样例: 12345678public class TestClass{ private int m; public int inc(){ return m + 1; }} 使用 javac...
Redis笔记
前言学习后端开发这么久,Redis 是我常用的一个中间件,以往主要是用于做缓存处理和暂存一些值。但用了这么多,却并没有深入地了解过 Redis 底层,并且平时的使用也大多都是通过 SpringData 封装的 RedisTemplate,连 Redis 本身的命令也几乎要忘掉了。因此打算写一篇总结性的博客,包括Redis的基础 + Redis底层 + Redis进阶使用。 Redis基础基础指令操作数据库相关指令 启动 Redis 客户端: redis-cli -h host -p port -a password 切换当前数据库: select 数据库index(0-15) 清空当前的库: FLUSHDB ;清空所有库: FLUSHALL 动态调整 Redis 的配置而不用重启(重启失效):CONFIG SET ... 操作数据类型相关指令StringString 是 Redis 中最简单的存储类型,一个 key 对应一个 value。其 value 是字符串(可以细分为字符串、整数、浮点数)。value 最大值不能超过512mb。 命令 说明 SET key...
配置HTTPS
前置由于 HTTP 本身是使用明文通信的,不加密、无法验证通信方的身份、无法证明报文的完整性,因此 HTTPS 出现了。HTTPS 本质上就是 HTTP 与 SSL/TLS...
浅析网络IO模型
前言I/O 泛指的是 CPU 向 I/O设备(硬盘、网卡)中读取/写入数据。而本文主要介绍的是网络 I/O,也就是借助于 Socket Api ,从网卡中读取数据。 Unix网络编程中的五种IO模型 参考:聊聊Linux 五种IO模型 - 简书 (jianshu.com) 一个I/O操作通常分为两个阶段: 等待数据准备(从磁盘/网卡中读取数据到内核空间中的缓冲区)。 从内核空间中的缓冲区向用户空间复制数据。 阻塞式I/O 假设在服务器上有一个应用需要接收客户端通过socket传递的数据。 1234567891011121314151617181920//服务端应用程序伪代码:listen_fd = socket(domain,type,protocol);bind(listen_fd,server_addr,server_addrlen);listen(listen_fd,backlog);while(1){ ...