Tio Boot DocsTio Boot Docs
Home
文档导航
  • java-db
  • api-table
  • jooq
  • mysql
  • postgresql
  • oceanbase
  • Enjoy
  • Tio Boot Admin
  • java-openai
  • ai_agent
  • knowlege_base
  • voice-agent
  • ai-search
  • ai-coding
  • ai-browser
  • 案例
Abount
AI 检索
  • Github
  • Gitee
Home
文档导航
  • java-db
  • api-table
  • jooq
  • mysql
  • postgresql
  • oceanbase
  • Enjoy
  • Tio Boot Admin
  • java-openai
  • ai_agent
  • knowlege_base
  • voice-agent
  • ai-search
  • ai-coding
  • ai-browser
  • 案例
Abount
AI 检索
  • Github
  • Gitee
  • 入门

    • 01 · 入门

      • 01_introduction
      • tio-boot:新一代高性能 Java Web 开发框架
      • tio-boot 入门示例
      • Tio-Boot 配置 : 现代化的配置方案
      • tio-boot 整合 hotswap-classloader 实现热加载
      • 自行编译 tio-boot
      • 最新版本
      • 开发规范
  • 部署与日志

    • 02 · 部署

      • 02_deployment
      • 使用 Maven Profile 实现分环境打包 tio-boot 项目
      • Maven 项目配置详解:依赖与 Profiles 配置
      • tio-boot 打包成 FatJar
      • 使用 GraalVM 构建 tio-boot Native 程序
      • 使用 Docker 部署 tio-boot
      • 部署到 Fly.io
      • 部署到 AWS Lambda
      • 到阿里云云函数
      • 使用 Deploy 工具部署
      • 使用Systemctl启动项目
      • 使用 Jenkins 部署 Tio-Boot 项目
      • 使用 Nginx 反向代理 Tio-Boot
      • 使用 Supervisor 管理 Java 应用
      • 历史部署页与替代方案
      • 胖包与瘦包的打包与部署
    • 03 · 日志

      • 日志
      • tio-boot 整合 Logback
  • 核心开发

    • 04 · 配置

      • 04_configuration
      • 配置参数
      • 服务器监听器
      • 内置缓存系统 AbsCache
      • 使用 Redis 作为内部 Cache
      • 静态文件处理器
      • 基于域名的静态资源隔离
      • DecodeExceptionHandler
      • 开启虚拟线程(Virtual Thread)
      • 框架级错误通知
    • 05 · JSON

      • 05_json
      • Json
      • 接受 JSON 和响应 JSON
      • 响应实体类
    • 06 · Web 开发

      • Web 开发
      • 路由与参数

        • 概述
        • 添加 Controller
        • handler入门
        • Handler 的请求方法与错误响应
        • 接收请求参数
        • 接收日期参数
        • 接收数组参数
        • HttpRequest
      • 响应与文件

        • 返回字符串
        • 返回文本数据
        • 返回网页
        • 请求和响应字节
        • 文件上传
        • 文件下载
        • 返回视频文件并支持断点续传
        • HttpResponse
        • Resps
        • RespBodyVo
        • 动态 返回 CSS 实现
        • 返回图片
        • 返回 multipart
        • 使用零拷贝发送大文件
        • 分片上传
        • WebJars
      • 会话与请求控制

        • http Session
        • Cookie
        • 重定向和转发
        • Controller拦截器
        • 请求拦截器
        • LoggingInterceptor
        • 全局异常处理器
        • 跨域
        • 自定义 Handler 转发请求
        • 使用 HttpForwardHandler 转发所有请求
        • HTTP Basic 认证
        • Http响应加密
      • 异步与流式输出

        • 异步处理
        • Transfer-Encoding: chunked 实时音频播放
        • Server-Sent Events (SSE)
      • 工具与监控

        • 常用工具类
        • 接口访问统计
        • 接口请求和响应数据记录
        • JProtobuf
        • 测速
        • Gzip Bomb:使用压缩炸弹防御恶意爬虫
    • 07 · 参数校验

      • 07_validation
      • 数据紧校验规范
      • 参数校验
    • 08 · WebSocket 应用开发

      • 08_websocket
      • 使用 tio-boot 搭建 WebSocket 服务
      • WebSocket 聊天室项目示例
    • 09 · AOP

      • 09_aop
      • JFinal-aop
      • Aop 工具类
      • 配置
      • 独立使用 JFinal Aop
      • @AImport
      • 自定义注解拦截器
      • 原理解析
    • 10 · 国际化

      • 10_i18n
      • i18n
    • 11 · Enjoy 模板

      • 11_enjoy
      • tio-boot 整合 Enjoy 模版引擎文档
      • Tio-Boot 整合 Java-DB 与 Enjoy 模板引擎示例
      • 引擎配置
      • 表达式
      • 指令
      • 注释
      • 原样输出
      • Shared Method 扩展
      • Shared Object 扩展
      • Extension Method 扩展
      • Spring boot 整合
      • 独立使用 Enjoy
      • tio-boot enjoy 自定义指令 localeDate
      • PromptEngine
      • Enjoy 入门示例-擎渲染大模型请求体
      • Tio Boot + Enjoy:分页与 SEO 实战指南
      • TioBoot + Enjoy 生成 robots.txt 与 sitemap.xml:实战与SEO指南
      • Enjoy 使用示例
    • 12 · 定时任务

      • 12_scheduling
      • Quartz 定时任务集成指南
      • 分布式定时任务 xxl-jb
      • cron4j 使用指南
    • 13 · 测试

      • 13_testing
      • TioBootTest:环境与 AOP 初始化
      • 真实 HTTP 集成测试
      • 数据库集成测试与隔离
    • 14 · tio-utils

      • 14_tio-utils
      • tio-utils
      • EnvUtils 配置工具
      • Notification
      • Email
      • JSON
      • File
      • Base64
      • 上传和下载
      • Http
      • Telegram
      • RsaUtils
      • HttpUtils
      • ByteBufferUtils
      • 系统监控
      • 线程
      • 虚拟线程
      • 毫秒并发 ID (MCID) 生成方案
  • 数据库与数据访问

    • 15 · java-db

      • 15_java-db
      • Db 工具类
      • java‑db
      • 操作数据库入门示例
      • SQL 模板 (SqlTemplates)
      • 数据源配置与使用
      • ActiveRecord
      • Db 工具类
      • 批量操作
      • Model
      • Model生成器
      • 注解
      • 异常处理
      • 数据库事务处理
      • Cache 缓存
      • Dialect 多数据库支持
      • 表关联操作
      • 复合主键
      • Oracle 支持
      • Enjoy SQL 模板
      • 整合 Enjoy 模板最佳实践
      • 多数据源支持
      • 独立使用 ActiveRecord
      • 调用存储过程
      • java-db 整合 Guava 的 Striped 锁优化
      • 生成 SQL
      • 通过实体类操作数据库
      • java-db 读写分离
      • Spring Boot 整合 Java-DB
      • like 查询
      • 常用操作示例
      • Druid 监控集成指南
      • SQL 统计
      • Db 与 PostgreSQL 业务实践
    • 16 · api-table

      • 16_api-table
      • ApiTable 概述
      • 使用 ApiTable 连接 SQLite
      • 使用 ApiTable 连接 Mysql
      • 使用 ApiTable 连接 Postgres
      • 使用 ApiTable 连接 TDEngine
      • 使用 api-table 连接 oracle
      • 使用 api-table 连接 mysql and tdengine 多数据源
      • EasyExcel 导出
      • EasyExcel 导入
      • ApiTable 的权限与业务边界
      • ApiTable 联调与故障定位
      • ApiTable 实现增删改查
      • 数组类型
      • 单独使用 ApiTable
      • TQL(Table SQL)前端输入规范
    • 17 · MyBatis

      • 17_mybatis
      • Tio-Boot 整合 MyBatis
      • 使用配置类方式整合 MyBatis
      • 整合数据源
      • 使用 mybatis-plus 整合 tdengine
      • 整合 mybatis-plus
    • 18 · jOOQ

      • 18_jooq
      • 使用配置类方式整合 jOOQ
      • tio-boot + jOOQ 事务管理
      • 批量操作与性能优化
      • 整合agroal
      • 代码生成与类型安全
      • 基于 Record / POJO 增删改查
      • UPSERT、批量更新、返回主键与高级 SQL
      • 的多表关联查询、DTO 投影、聚合统计与视图封装
      • 的窗口函数、CTE、JSON 查询与 PostgreSQL 高级 SQL 实战
      • tio-boot + jOOQ 的审计字段、乐观锁、数据权限与企业级 Repository 设计
      • 测试策略、SQL 日志、性能诊断与生产排障
      • 多租户、读写分离与多数据源设计
      • 代码生成治理、数据库迁移与团队协作规范实战
    • 19 · PostgreSQL

      • 19_postgresql
      • PostgreSQL 安装
      • PostgreSQL 主键自增
      • PostgreSQL 日期类型
      • Postgresql 金融类型
      • PostgreSQL 数组类型
      • 索引
      • PostgreSQL 查询优化
      • 获取字段类型
      • PostgreSQL 全文检索
      • PostgreSQL 向量
      • PostgreSQL 优化向量查询
      • PostgreSQL 其他
    • 20 · MySQL

      • 20_mysql
      • 使用 Docker 运行 MySQL
      • 常见问题
    • 21 · OceanBase

      • 21_oceanbase
      • 快速体验 OceanBase 社区版
      • 快速上手 OceanBase 数据库单机部署与管理
      • 诊断集群性能
      • 优化 SQL 性能指南
      • 待定
    • 22 · Oracle

      • 22_oracle
      • Oracle
    • 23 · SQL Server

      • 23_sqlserver
      • SQL Server
    • 24 · SQLite

      • 24_sqlite
      • SQLite
    • 25 · MongoDB

      • 25_mongodb
      • tio-boot 使用 mongo-java-driver 操作 mongodb
    • 26 · Elasticsearch

      • 26_elasticsearch
      • Elasticsearch
      • JavaDB 整合 ElasticSearch
      • Elastic 工具类使用指南
      • Elastic-search 注意事项
      • ES 课程示例文档
  • 缓存与消息队列

    • 27 · Cache

      • 27_cache
      • Caffeine
      • CacheUtils 工具类
      • 使用 java-db 整合 ehcache
    • 28 · Redis

      • 28_redis
      • 使用 Docker 安装 Redis
      • 使用 java-db 整合 Redis
      • Java DB Redis 相关 Api
      • redis 使用示例
      • 和 RedisTemplate 协作
      • 使用 Jedis 连接池接入 Redis
      • hutool RedisDS
      • Redisson
      • Caffeine 与 Redis 两级缓存
      • 使用 CacheUtils 整合 caffeine 和 redis 实现的两级缓存
    • 29 · 消息队列

      • 29_mq
      • Mica-mqtt
      • EMQX
      • Disruptor
    • 30 · Kafka

      • 30_kafka
      • Kafka
      • AWS MSK
  • 认证与账号体系

    • 31 · 认证与权限

      • 31_authentication
      • FixedTokenInterceptor
      • TokenManager
      • 数据表
      • 匿名登录
      • 个人中心
      • 权限校验注解
      • Sa-Token
      • sa-token 登录注册
      • StpUtil.isLogin() 源码解析
    • 32 · 第三方登录注册

      • 32_third-party-auth
      • 邮箱登录和注册
      • 邮箱重置密码
      • 腾讯云短信登录注册
      • 腾讯云短信重置密码
      • 阿里云短信登录和注册
      • 阿里云短信重置密码
      • 微信登录与绑定手机号
      • 支付宝登录与绑定手机号
      • 微信小程序手机号快捷登录
      • Google登录
      • 阿里云邮件推送验证邮箱
  • 网络通信

    • 33 · AIO

      • 33_aio
      • ByteBuffer
      • AIO HTTP 服务器
      • 自定义和线程池和池化 ByteBuffer
      • AioHttpServer 应用示例 IP 属地查询
      • 手写 AIO Http 服务器
      • Java 21 中的虚拟线程与 AIO
    • 34 · t-io

      • 34_tio
      • 认识 t-io

        • t-io 核心优势与应用价值
        • t-io 消息处理流程
      • 快速上手

        • TioBootServer
        • 独立端口启动 TCP 服务器
        • 内置 TCP 处理器
        • 独立启动 UDPServer
        • 使用内置 UDPServer
      • 核心概念

        • TioConfig
        • ChannelContext
        • Packet
        • Tio 工具类
      • 消息与文件传输

        • 发送数据
        • HTTP 长连接与高效文件传输
        • 使用 AsynchronousSocketChannel 响应数据
      • 连接管理

        • 业务数据绑定
        • 业务数据解绑
        • 关闭连接
        • 资源共享
        • 成员排序
        • 拉黑 IP
      • 加密通信

        • SSL
        • Https建立连接过程
      • 心跳与监控

        • 监控: 心跳
        • 监控: 客户端的流量数据
        • 监控: 单条 TCP 连接的流量数据
        • 监控: 端口的流量数据
        • 单条通道统计: ChannelStat
        • 所有通道统计: GroupStat
      • 深入原理

        • tio-运行原理详解
        • DecodeRunnable
        • t-io 稳定性设计与资源管理
        • 深入解析 Tio 源码:构建高性能 Java 网络应用
        • HTTP、WebSocket 与 TCP 的缓冲区复用
    • 35 · tio-http-server

      • 35_tio-http-server
      • 使用 Tio-Http-Server 搭建简单的 HTTP 服务
      • tio-boot 添加 HttpRequestHandler
      • 在 Android 上使用 tio-boot 运行 HTTP 服务
      • tio-http-server-native
      • handler 常用操作
      • tio-http-server 与 tio-boot 的使用边界
    • 36 · tio-websocket

      • 36_tio-websocket
      • WebSocket 服务器
      • WebSocket Client
      • TCP数据转发
    • 37 · Netty

      • 37_netty
      • Netty TCP Server
      • Netty Web Socket Server
      • 使用 protoc 生成 Java 包文件
      • Netty WebSocket Server 二进制数据传输
      • Netty 组件详解
    • 38 · netty-boot

      • 38_netty-boot
      • Netty-Boot
      • 原理解析
      • 整合 Hot Reload
      • 整合 数据库
      • 整合 Redis
      • 整合 Elasticsearch
      • 整合 Dubbo
      • Listener
      • 文件上传
      • 拦截器
      • Spring Boot 整合 Netty-Boot
      • SSL 配置指南
      • ChannelInitializer
      • Reserve
  • 集成与扩展

    • 39 · 第三方集成

      • 39_integrations
      • 整合 okhttp
      • 整合 GrpahQL
      • 集成 Mailjet
      • 整合 ip2region
      • 整合 GeoLite 离线库
      • 整合 Lark 机器人指南
      • 集成 Lark Mail 实现邮件发送
      • Thymeleaf
      • Swagger
      • Clerk 验证
      • 集成datadog
    • 40 · Magic Script

      • 40_magic-script
      • tio-boot 与 magic-script 集成指南
    • 41 · Groovy

      • 41_groovy
      • tio-boot 整合 Groovy
      • 调试常用脚本
    • 42 · 爬虫

      • 42_crawling
      • jsoup
      • 爬取 z-lib.io 数据
      • 整合 WebMagic
      • WebMagic 示例:爬取学校课程数据
      • Playwright
      • Flexmark (Markdown 处理器)
      • tio-boot 整合 Playwright
      • 缓存网页数据
    • 43 · Dubbo

      • 43_dubbo
      • 概述
      • dubbo 2.6.0
      • dubbo 2.6.0 调用过程
      • dubbo 3.2.0
    • 44 · Spring

      • 44_spring
      • Spring Boot Web 整合 Tio Boot
      • spring-boot-starter-webflux 整合 tio-boot
      • tio-boot 整合 spring-boot-starter
      • Tio Boot 整合 Spring Boot Starter db
      • Tio Boot 整合 Spring Boot Starter Data Redis 指南
    • 45 · Spring Cloud

      • 45_spring-cloud
      • tio-boot spring-cloud
    • 46 · Quarkus

      • 46_quarkus
      • Quarkus(无 HTTP)整合 tio-boot(有 HTTP)
      • tio-boot + Quarkus + Hibernate ORM Panache
      • tio-boot + Quarkus + Hibernate ORM Panache + jOOQ 整合方案
    • 47 · Telegram4J

      • 47_telegram4j
      • 数据库设计
      • 基于 HTTP 协议开发 Telegram 翻译机器人
      • 基于 MTProto 协议开发 Telegram 翻译机器人
      • 过滤旧消息
      • 保存机器人消息
      • 定时推送
      • 增加命令菜单
      • 使用 telegram-Client
      • 使用自定义 StoreLayout
      • 延迟测试
      • Reactor 错误处理
      • Telegram4J 常见错误处理指南
      • 处理回调查询
      • Reactor
      • 文档翻译
      • 使用 Tio-Boot 整合 tdlight
      • tio-boot 整合 TelegramBots
      • tio-boot 整合 Telegram-Bot-Utils
      • Telegram-Bot-Utils 使用指南
    • 48 · Telegram Bots

      • 48_telegram-bots
      • TelegramBots 入门指南
      • 使用工具库 telegram-bot-base 开发翻译机器人
    • 49 · 文件存储

      • 49_file-storage
      • 文件上传数据表
      • 本地存储
      • 存储到 亚马逊 S3
      • 存储到 Cloudflare R2
      • 存储到 腾讯 COS
      • 上传文件到阿里云 OSS
    • 50 · 支付

      • 支付集成
      • 微信小程序支付:普通支付
      • 微信支付:Native 扫码支付(PC 网页扫码)
      • 支付宝:电脑网站支付接入指南
  • Firebase 与 Clerk

    • 51 · Firebase

      • 51_firebase
      • 整合 google firebase
      • Firebase Storage
      • Firebase Authentication
      • 使用 Firebase Admin SDK 进行匿名用户管理与自定义状态标记
      • 导出用户
      • 登录注册
      • 注册回调
    • 52 · Clerk

      • 52_clerk
      • Clerk
  • 多媒体

    • 53 · 音视频处理

      • 53_media
      • JAVE 提取视频中的声音
      • Jave 提取视频中的图片
      • 待定
    • 54 · 语音识别

      • 54_asr
      • Whisper-JNI
    • 55 · 语音合成

      • 55_tts
    • 56 · 文字识别

      • 56_ocr
    • 57 · Native Media

      • 57_native-media
      • java-native-media
      • JNI 入门示例
      • mp3 拆分
      • mp4 转 mp3
      • 使用 libmp3lame 实现高质量 MP3 编码
      • Linux 编译
      • macOS 编译
      • 从 JAR 包中加载本地库文件
      • 支持的音频和视频格式
      • 任意格式转为 mp3
      • 通用格式转换
      • 通用格式拆分
      • 视频合并
      • VideoToHLS
      • split_video_to_hls 支持其他语言
      • 持久化 HLS 会话
      • 获取视频长度
      • 保存视频的最后一帧
      • 添加水印
      • linux版本
    • 58 · 计算机视觉

      • 58_computer-vision
      • 使用 Java 运行 YOLOv8 ONNX 模型进行目标检测
      • tio-boot整合yolo
      • ONNX Runtime 推理说明
      • Paddle Structure
      • tio-boot 整合 Paddle Structure
      • tio-boot整合Paddle Structure 提取图片
      • U2Net 图片去背景原理
      • tio-boot 整合 U2Net 实现图片去背景
  • AI 开发

    • 59 · java-openai

      • 59_java-openai
      • 简介
      • 流式生成
      • 图片多模态输入
      • Google Gemini接入
      • google Vertex AI 接入
      • Perplexity API
      • WhisperClient 语音识别
      • SupadataClient 获取视频字幕
      • GiteeClient 文档解析与图片 OCR
      • DeepSeekClient 官方模型查询
      • BailianTTSClient 语音合成
    • 60 · AI Agent

      • 60_ai-agent
      • 数据库设计
      • 示例问题管理
      • 会话管理
      • 历史记录
      • 意图识别
      • 智能问答
      • 文件上传与解析文档
      • 翻译
      • 名人搜索功能实现
      • Ai studio gemini youbue 问答使用说明
      • 自建 YouTube 字幕问答系统
      • 自建 获取 youtube 字幕服务
      • 使用 OpenAI ASR 实现语音识别接口(Java 后端示例)
      • 定向搜索
      • 16
      • 17
      • 18
      • 在 tio-boot 应用中整合 ai-agent
      • 接口文档
      • 自定义 ChatAskService
      • 请求记录
      • 限流和错误处理
      • 增强检索(RAG)
      • 结构化数据检索
      • AI 问答
      • 连接代码执行器
      • 待定
      • 模型编程能力评测
      • 音频会话 SDP 示例
    • 61 · 知识库

      • 61_knowledge-base
      • 学术论文
      • 数据库设计
      • 用户登录实现
      • 模型管理
      • 知识库管理
      • 文档拆分
      • 片段向量
      • 命中测试
      • 文档管理
      • 片段管理
      • 问题管理
      • 应用管理
      • 向量检索
      • 推理问答
      • 问答模块
      • 统计分析
      • 用户管理
      • api 管理
      • 存储文件到 S3
      • 文档解析优化
      • 片段汇总
      • 段落分块与检索
      • 多文档解析
      • 对话日志
      • 检索性能优化
      • Milvus
      • 文档解析方案和费用对比
      • 豫自然资办发〔2021〕18号文档解析实测
      • 离线运行向量模型
      • 爬取网页数据
    • 62 · AI 搜索

      • 62_ai-search
      • ai-search 项目简介
      • ai-search 数据库文档
      • ai-search SearxNG 搜索引擎
      • ai-search Jina Reader API
      • ai-search Jina Search API
      • ai-search 搜索、重排与读取内容
      • ai-search PDF 文件处理
      • ai-search 推理问答
      • Google Custom Search JSON API
      • ai-search 意图识别
      • ai-search 问题重写
      • ai-search 系统 API 接口 WebSocket 版本
      • ai-search 搜索代码实现 WebSocket 版本
      • ai-search 生成建议问
      • ai-search 生成问题标题
      • ai-search 历史记录
      • Discover API
      • 翻译
      • Tavily Search API 文档
      • 对接 Tavily Search
      • 火山引擎 DeepSeek
      • 对接 火山引擎 DeepSeek
      • ai-search 搜索代码实现 SSE 版本
      • jar 包部署
      • Docker 部署
      • 爬取一个静态网站的所有数据
      • 网页数据预处理
      • 网页数据检索与问答流程整合
    • 63 · 语音 Agent

      • 63_voice-agent
      • 整合Gemini realtime模型
      • Voice Agent 前端接入接口文档
      • 整合千问realtime模型
      • 打断支持
      • 主动介入
      • eleven labs
      • 基于 tio-boot + ElevenLabs 构建实时语音 Agent(支持打断与主动介入)
    • 64 · AI Coding

      • 64_ai-coding
      • Cline 提示词
      • Cline 提示词-中文版本
    • 65 · AI Browser

      • deepseek-browser-use:从入门到源码
      • deepseek-browser-use:概念与学习路线
      • 安装、启动与健康检查
      • 第一个任务:打开页面、读取结果与关闭
      • 客户端:dsb 命令行、Python 与 PowerShell
      • 统一命令接口与人机协作
      • 浏览器、profile 与登录态
      • 窗口尺寸与页面视口
      • 接入智能体:观察、执行与验证
      • 表单与多层弹窗排障:防止重复提交
      • 调用追踪、页面留档与文件上传
      • 站点配方、技能与异步作业
      • Windows OCR:本地图片与页面文字识别
      • 配置项与运维自省
      • 命令清单
      • 源码教程:从 HTTP 请求到命令执行
      • DOM 原理:前端如何生成可交互快照
      • DOM 原理:Java 模型与跨 Frame 索引
      • 正文提取与上层结构化处理
      • 源码教程:生命周期、导航与页签
      • 源码教程:DOM、页面状态与元素读取
      • 源码教程:点击、输入、键盘与鼠标
      • 源码教程:等待条件与 JavaScript 执行
      • 源码教程:文件上传、截图、PDF 与 OCR
      • 源码教程:Cookie、存储与页面设置
      • 源码教程:网络记录、请求拦截与控制台
      • 源码教程:原生对话框、DOM 弹窗与人机协作
      • 源码教程:批量、配方、后台作业与维护
      • 源码教程:Chrome 走 CDP 与 CDP 客户端
      • 请求响应关联与线程约束
  • 项目实战

    • 66 · java-uni-ai-server

      • 66_java-uni-ai-server
      • 语音合成系统
      • Fish.audio TTS 接口说明文档与 Java 客户端封装
      • 整合 fishaudio 到 java-uni-ai-server 项目
      • 待定
    • 67 · java-llm-proxy

      • 67_java-llm-proxy
      • 使用tio-boot搭建多模型LLM代理服务
    • 68 · java-kit-server

      • 68_java-kit-server
      • Java 执行 python 代码
      • 通过大模型执行 Python 代码
      • 执行 Python (Manim) 代码
      • 待定
      • 待定
      • 待定
      • 视频下载增加水印说明文档
    • 69 · tio-im

      • 69_tio-im
      • 通讯协议文档
      • ChatPacket.proto 文档
      • java protobuf
      • 数据表设计
      • 创建工程
      • 登录
      • 历史消息
      • 发消息
    • 70 · tio-mail-wing

      • 70_tio-mail-wing
      • tio-mail-wing简介
      • 任务1:实现POP3系统
      • 使用 getmail 验证 tio-mail-wing POP3 服务
      • 任务2:实现 SMTP 服务
      • 数据库初始化文档
      • 用户管理
      • 邮件管理
      • 任务3:实现 SMTP 服务 数据库版本
      • 任务4:实现 POP3 服务(数据库版本)
      • IMAP 协议
      • 拉取多封邮件
      • 任务5:实现 IMAP 服务(数据库版本)
      • IMAP实现讲解
      • IMAP 手动测试脚本
      • IMAP 认证机制
      • 主动推送
      • namesapce
      • CONDSTORE and QRESYNC
    • 71 · tio-mcp-server

      • 71_tio-mcp-server
      • 实现 MCP Server 开发指南
      • MCP 协议
      • /zh/71_tio-mcp-server/11.html
    • 72 · tio-log-server

      • 72_tio-log-server
      • 简介
      • 收集 docker 日志
      • 入库
    • 73 · tio-sip

      • 73_tio-sip
      • SIP Server 第一版原理说明
      • SIP Server 第一版实战
      • 一、Windows 平台测试
      • SIP Server 第二版实战
      • SIP Server 第三版实战
      • 性能优化
      • 基于 MediaProcessor 对接 Realtime 模型说明
      • 对接大语言模型
      • 支持 G722 宽带语音
      • G722编码和解码
      • 会话级采样率转换
      • 增加 9196 回声测试分机
      • 语音系统链路说明
      • 一、Gemini Realtime 的打断机制
    • 74 · tio-boot-admin

      • 74_tio-boot-admin
      • 入门指南:使用框架内置配置
      • 手动初始化数据库
      • 配置职责、生效条件与扩展边界
      • 整合数据库
      • 与前端集成
      • 文件上传
      • 网络请求
      • 单图片管理(只读模式)
      • 多图片管理
      • 布尔值管理
      • 字段联动
      • Word 管理
      • PDF 管理
      • 文章管理
      • 富文本编辑器
      • 整合 Enjoy 模版引擎
      • 历史可选方案:Token 存储与 Sa-Token
      • 业务 API 与 H5 / 小程序联调
      • 方法路由与业务鉴权
      • 整合 Redis
      • 整合 Elasticsearch
      • 后端开发规范:tio-boot、java-db 与 Kv
      • 多表实现文件数据存储
    • 75 · 案例

      • 75_examples
      • 封装 IP 查询服务
      • tio-boot 案例 - 全局异常捕获与企业微信群通知
      • tio-boot 案例 - 文件上传和下载
      • tio-boot 案例 - 整合 ant design pro 增删改查
      • tio-boot 案例 - 流失响应
      • tio-boot 案例 - 增强检索
      • tio-boot 案例 - 整合 function call
      • tio-boot 案例 - 定时任务 监控 PostgreSQL、Redis 和 Elasticsearch
      • Tio-Boot 案例:使用 SQLite 整合到登录注册系统
      • tio-boot 案例 - 执行 shell 命令
      • /zh/75_examples/11.html
      • /zh/75_examples/12.html
      • /zh/75_examples/13.html
  • 性能、原理与源码

    • 76 · 性能测试

      • 76_performance
      • 压力测试 - tio-http-serer
      • 压力测试 - tio-boot
      • 压力测试 - tio-boot-native
      • 压力测试 - netty-boot
      • 性能测试对比
      • TechEmpower FrameworkBenchmarks
      • 压力测试 - tio-boot 12 C 32G
      • HTTP/1.1 Pipelining 性能测试报告
      • tio-boot vs Quarkus 性能对比测试报告
    • 77 · 原理

      • 77_internals
      • 生命周期
      • 请求处理流程
      • 重要的类
    • 78 · 源码解析

      • 78_source-code
      • 源码阅读入口
      • Swagger 整合到 Tio-Boot 中的指南
      • 启动与关闭生命周期
      • HTTP 请求分发与路由优先级
      • 高性能网络编程中的 ByteBuffer 分配与回收策略
      • TioBootServerHandler 源码解析

PostgreSQL 向量

  • 余弦相似度与余弦距离
    • 什么是余弦相似度
    • 余弦相似度公式
  • 使用 PostgreSQL 和 pgvector 扩展来计算向量相似度
    • 1. 安装 pgvector 扩展
    • 2. 创建表并存储向量
    • 3. 计算向量距离与相似度
  • professors 向量化和查询示例
    • 1. 修改表结构添加向量字段
    • 2. 数据插入示例
    • 3. 计算相似度的 SQL 查询
    • 4. <#> and <=>
  • 使用代码操作向量数据库
    • 1. 使用代码插入数据
    • 2.查询数据
    • 3. Java 向量查询
    • 4. 使用 Db 工具类进行向量查询
    • 5. 合并查询参数
    • 6. db 工具类存储向量 和 查询向量示例
    • 7.直接查询获取向量对象 PGobject

余弦相似度与余弦距离

什么是余弦相似度

余弦相似度用于衡量两个向量之间的相似程度。具体来说:

  • 余弦相似度为 1:表示两个向量完全相同。
  • 余弦相似度为 0:表示两个向量正交(没有相似性)。
  • 余弦相似度为 -1:表示两个向量完全相反。

注意:在 pgvector 扩展中,运算符 <=> 实际上计算的是余弦距离,定义为
[ \text{cosine_distance} = 1 - \text{cosine_similarity} ] 因此:

  • 当余弦相似度为 1 时,余弦距离为 0;
  • 当余弦相似度为 0 时,余弦距离为 1;
  • 当余弦相似度为 -1 时,余弦距离为 2。

余弦相似度公式

余弦相似度的数学定义为: [ \text{cosine_similarity} = \frac{\vec{A} \cdot \vec{B}}{|\vec{A}| |\vec{B}|} ] 其中:

  • (\vec{A} \cdot \vec{B}) 为向量点积
  • (|\vec{A}|) 和 (|\vec{B}|) 为向量的范数

使用 PostgreSQL 和 pgvector 扩展来计算向量相似度

在 PostgreSQL 中,使用 pgvector 扩展可以方便地存储向量并计算向量之间的相似度或距离。

1. 安装 pgvector 扩展

确保已安装该扩展:

CREATE EXTENSION IF NOT EXISTS vector;
-- 欧氏距离 0, 两个向量完全相同,距离自是 0
SELECT '[1, 2, 3]' <=> '[1, 2, 3]' AS similarity;
-- 两个向量的内积 -14
SELECT '[1, 2, 3]' <#> '[1, 2, 3]' AS similarity;

2. 创建表并存储向量

下面创建一个示例表,假设向量维度为 3:

CREATE TABLE embeddings (
    id serial PRIMARY KEY,
    embedding vector(3)
);

插入示例数据:

INSERT INTO embeddings (embedding) VALUES
    ('[1, 2, 3]'),
    ('[4, 5, 6]');

3. 计算向量距离与相似度

(1)使用 <=> 计算余弦距离

下面查询计算向量 [1, 2, 3] 与表中向量之间的余弦距离(注意:值越小表示越相似):

SELECT
    id,
    embedding,
    (embedding <=> '[1, 2, 3]') AS cosine_distance
FROM
    embeddings
ORDER BY
    cosine_distance ASC;

(2)计算余弦相似度

如果需要得到余弦相似度,则可用公式 cosine_similarity = 1 - cosine_distance:

WITH input_vector AS (
    SELECT '[1, 2, 3]'::vector(3) AS embedding
)
SELECT
    e.id,
    e.embedding,
    (1 - (e.embedding <=> iv.embedding)) AS cosine_similarity
FROM
    embeddings e,
    input_vector iv
ORDER BY
    cosine_similarity DESC;

在这个示例中:

  • e.embedding <=> iv.embedding 得到的是余弦距离;
  • 1 - (e.embedding <=> iv.embedding) 则转换为余弦相似度(值越大越相似)。

professors 向量化和查询示例

假设有一张教授信息表,需要为姓名、描述和备注添加向量字段(维度 1536),并进行相似度查询。

1. 修改表结构添加向量字段

CREATE TABLE rumi_sjsu_professors(
  id BIGINT NOT NULL,
  name VARCHAR(256),
  department VARCHAR(256),
  job_title VARCHAR(256),
  email VARCHAR(256),
  description TEXT,
  files JSON,
  remark VARCHAR(256),
  name_vector VECTOR(1536),
  description_vector VECTOR(1536),
  remark_vector VECTOR(1536),
  vectors_completed BOOLEAN DEFAULT FALSE,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0,
  PRIMARY KEY (id)
);

2. 数据插入示例

下面是插入包含向量数据的示例语句:

-- 示例1
INSERT INTO rumi_sjsu_professors (
  id, name, department, job_title, email, description, files, remark, name_vector, description_vector, remark_vector, vectors_completed
) VALUES (
  1,
  'Dr. John Doe',
  'Computer Science',
  'Professor',
  '[email protected]',
  'Expert in artificial intelligence and machine learning.',
  '{"resume": "link_to_resume.pdf"}',
  'Well-known researcher',
  '[0.1, 0.2, 0.3, ...]',  -- 1536维向量
  '[0.1, 0.2, 0.3, ...]',  -- 1536维向量
  '[0.1, 0.2, 0.3, ...]',  -- 1536维向量
  TRUE
);

-- 示例2
INSERT INTO rumi_sjsu_professors (
  id, name, department, job_title, email, description, files, remark, name_vector, description_vector, remark_vector, vectors_completed
) VALUES (
  2,
  'Dr. Jane Smith',
  'Mathematics',
  'Associate Professor',
  '[email protected]',
  'Specializes in algebraic topology and number theory.',
  '{"cv": "link_to_cv.pdf"}',
  'Renowned academic',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  TRUE
);

-- 示例3
INSERT INTO rumi_sjsu_professors (
  id, name, department, job_title, email, description, files, remark, name_vector, description_vector, remark_vector, vectors_completed
) VALUES (
  3,
  'Dr. Emily Zhang',
  'Physics',
  'Assistant Professor',
  '[email protected]',
  'Researcher in quantum mechanics and particle physics.',
  '{"portfolio": "link_to_portfolio.pdf"}',
  'Emerging scientist',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  TRUE
);

3. 计算相似度的 SQL 查询

假设我们希望计算输入向量与三个向量字段的余弦相似度(需转换为 1 - (<=>))并检索相似度最高的三条记录,可按如下方式查询:

SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1 - (name_vector <=> input_vector)) AS name_similarity,
  (1 - (description_vector <=> input_vector)) AS description_similarity,
  (1 - (remark_vector <=> input_vector)) AS remark_similarity
FROM
  rumi_sjsu_professors,
  LATERAL (
    VALUES (
      ARRAY[0.1, 0.2, 0.3, ...]::VECTOR(1536)  -- 替换为实际输入向量
    )
  ) AS input(input_vector)
ORDER BY
  GREATEST(
    1 - (name_vector <=> input_vector),
    1 - (description_vector <=> input_vector),
    1 - (remark_vector <=> input_vector)
  ) DESC
LIMIT 3;

说明:

  • 在 SELECT 子句中,我们分别计算三个字段的余弦相似度;
  • ORDER BY 中使用了 GREATEST(...) DESC,确保返回的记录中至少有一个字段的相似度最高;
  • 如果需要在 WHERE 子句中过滤出相似度较高的记录,不能直接引用 SELECT 的别名,而需要重新计算。例如:
SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1 - (name_vector <=> input_vector)) AS name_similarity,
  (1 - (description_vector <=> input_vector)) AS description_similarity,
  (1 - (remark_vector <=> input_vector)) AS remark_similarity
FROM
  rumi_sjsu_professors,
  LATERAL (
    VALUES (
      ARRAY[0.1, 0.2, 0.3, ...]::VECTOR(1536)  -- 替换为实际输入向量
    )
  ) AS input(input_vector)
WHERE
  (1 - (name_vector <=> input_vector)) > 0.9
  OR (1 - (description_vector <=> input_vector)) > 0.9
  OR (1 - (remark_vector <=> input_vector)) > 0.9
ORDER BY
  GREATEST(
    1 - (name_vector <=> input_vector),
    1 - (description_vector <=> input_vector),
    1 - (remark_vector <=> input_vector)
  ) DESC
LIMIT 3;

4. <#> and <=>

在 pgvector 扩展中,提供了不同的距离(或相似度)运算符,它们对应不同的度量方式。具体来说:

  1. <#> 运算符(余弦距离)

    • 计算内容: 它计算的是余弦距离,定义为 [ \text{cosine_distance}(v,w)=1-\frac{v\cdot w}{|v||w|} ] 也就是 1 减去余弦相似度。
    • 取值范围: 余弦相似度的取值范围为 ([-1,1]),因此余弦距离的范围为 ([0,2])
      • 当两个向量方向完全一致时,余弦相似度为 1,对应余弦距离 0;
      • 当两个向量方向完全相反时,余弦相似度为 –1,对应余弦距离 2。
    • 读法: 读作“余弦距离”。
  2. <=> 运算符(内积距离)

    • 计算内容: 它计算的是内积距离,通常定义为负的内积: [ \text{inner_product_distance}(v,w) = - (v\cdot w) ] 这样设计的目的是使得相似(内积较大)的向量其“距离”较小。
    • 取值范围: 内积本身没有固定的上下界(除非向量做了归一化处理),因此:
      • 若向量未经归一化,其内积可能为任意实数,所以内积距离理论上取值范围为 ((-\infty,,+\infty));
      • 若向量都做了单位归一化,那么内积的范围就是 ([-1,1]),对应的内积距离范围为 ([-1,1])。
    • 读法: 读作“内积距离”。

总结一下:

  • <#>: 计算余弦距离,范围 [0, 2],读作“余弦距离”。
  • <=>: 计算内积距离(即负内积),范围取决于向量是否归一化,未归一化时理论上无界,读作“内积距离”。

使用代码操作向量数据库

1. 使用代码插入数据

如何使用代码代替上面的 INSERT INTO rumi_sjsu_professors 语句

import java.sql.SQLException;
import java.util.Arrays;

import org.junit.Test;
import org.postgresql.util.PGobject;

import nexus.io.jfinal.plugin.activerecord.Db;
import nexus.io.jfinal.plugin.activerecord.Row;
import nexus.io.open.chat.config.DbConfig;
import nexus.io.openai.client.OpenAiClient;
import nexus.io.openai.consts.OpenAiModels;
import nexus.io.openai.embedding.EmbeddingRequestVo;
import nexus.io.openai.embedding.EmbeddingResponseVo;
import nexus.io.tio.utils.environment.EnvUtils;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SjsuProfessorsTest {

  @Test
  public void testInsertDrEmilyZhang() {
    EnvUtils.load();
    new DbConfig().config();

    int id = 3;
    String name = "Dr. Emily Zhang";
    String description = "Researcher in quantum mechanics and particle physics.";
    String remark = "Emerging scientist";

    Row row = new Row();
    row.set("id", id).set("name", name).set("department", "Physics").set("job_title", "Associate Professor")
        .set("email", "[email protected]").set("description", description).set("remark", remark);

    setNameVector(name, row);
    setDescriptionVector(description, row);
    setRemarkVector(remark, row);

    row.setTableName("rumi_sjsu_professors");
    boolean save = Db.save(row);
    if (save) {
      log.info("success");
    }

  }

  @Test
  public void testInsertDrJaneSmith() {
    EnvUtils.load();
    new DbConfig().config();

    int id = 2;
    String name = "Dr. Jane Smith";
    String description = "Specializes in algebraic topology and number theory.";
    String remark = "Renowned academic";

    Row row = new Row();
    row.set("id", id).set("name", name).set("department", "Mathematics").set("job_title", "Associate Professor")
        .set("email", "[email protected]").set("description", description).set("remark", remark);

    setNameVector(name, row);
    setDescriptionVector(description, row);
    setRemarkVector(remark, row);

    row.setTableName("rumi_sjsu_professors");
    boolean save = Db.save(row);
    if (save) {
      log.info("success");
    }

  }

  @Test
  public void testInsertByRecord() {
    EnvUtils.load();
    new DbConfig().config();

    String name = "Dr. John Doe";
    String description = "Expert in artificial intelligence and machine learning.";
    String remark = "Well-known researcher";

    Row row = new Row();
    row.set("id", 1).set("name", name).set("department", "Computer Science").set("job_title", "Professor")
        .set("email", "[email protected]").set("description", description).set("remark", remark);

    setNameVector(name, row);
    setDescriptionVector(description, row);
    setRemarkVector(remark, row);

    row.setTableName("rumi_sjsu_professors");
    boolean save = Db.save(row);
    if (save) {
      log.info("success");
    }
  }

  private void setRemarkVector(String description, Row row) {
    PGobject nameVector = getPgVector(description);
    row.set("remark_vector", nameVector);
  }

  private void setDescriptionVector(String description, Row row) {
    PGobject nameVector = getPgVector(description);
    row.set("description_vector", nameVector);
  }

  private void setNameVector(String name, Row row) {
    PGobject nameVector = getPgVector(name);
    row.set("name_vector", nameVector);
  }

  private PGobject getPgVector(String description) {
    EmbeddingRequestVo reoVo = new EmbeddingRequestVo(description, OpenAiModels.text_embedding_3_small);
    EmbeddingResponseVo respVo = OpenAiClient.embeddings(reoVo);
    Float[] embedding = respVo.getData().get(0).getEmbedding();
    String vectorString = Arrays.toString(embedding);

    // 使用PGobject来设置vector类型
    PGobject nameVector = new PGobject();
    nameVector.setType("vector");
    try {
      nameVector.setValue(vectorString);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return nameVector;
  }
}

插入其他的数据示例省略

2.查询数据

输出结果如下,为了方便展示,我省略了 vector 的 value 部分

import org.junit.Test;

import nexus.io.jfinal.plugin.activerecord.Db;
import nexus.io.jfinal.plugin.activerecord.Row;
import nexus.io.open.chat.config.DbConfig;
import nexus.io.tio.utils.environment.EnvUtils;
import nexus.io.tio.utils.json.JsonUtils;

public class SjsuProfessorsQueryTest {

  @Test
  public void testQuery() {
    EnvUtils.load();
    new DbConfig().config();
    int id = 3;
    Row row = Db.findById("rumi_sjsu_professors", "id", id);
    String json = JsonUtils.toJson(row.toMap());
    System.out.println(json);
  }

}

{
  "id": 3,
  "name": "Dr. Emily Zhang",
  "department": "Physics",
  "job_title": "Associate Professor",
  "email": "[email protected]",
  "description": "Researcher in quantum mechanics and particle physics.",
  "remark": "Emerging scientist",
  "name_vector": [],
  "description_vector": [],
  "remark_vector": {
    "value": "[]",
    "type": "vector",
    "null": true
  },
  "vectors_completed": false,
  "creator": "",
  "create_time": "2024-07-03 23:29:44",
  "updater": "",
  "update_time": "2024-07-03 23:29:44",
  "deleted": 0,
  "tenant_id": 0
}

3. Java 向量查询

在 Java 中使用余弦相似度进行查询,并将输入向量传递给 SQL 查询.

  1. 确保 PostgreSQL 数据库已配置好 pgvector 扩展:
CREATE EXTENSION IF NOT EXISTS vector;
  1. 创建包含向量的表:
CREATE TABLE vector_test (
   id SERIAL PRIMARY KEY,
   name TEXT,
   embedding VECTOR(1536)
);
  1. 在 Java 中构建查询并传递向量参数:

可以使用 PreparedStatement 来构建和执行查询。以下是一个示例代码,展示如何将向量传递给 SQL 查询并执行查询。

package nexus.io.open.chat.model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

import nexus.io.open.chat.config.DbConfig;
import nexus.io.openai.client.OpenAiClient;
import nexus.io.openai.consts.OpenAiModels;
import nexus.io.openai.embedding.EmbeddingRequestVo;
import nexus.io.openai.embedding.EmbeddingResponseVo;
import nexus.io.tio.utils.dsn.DbDSNParser;
import nexus.io.tio.utils.dsn.JdbcInfo;
import nexus.io.tio.utils.environment.EnvUtils;

public class VectorSearchTest {

  public static void main(String[] args) throws SQLException {
    // 示例输入
    EnvUtils.load();
    new DbConfig().config();
    String question = "Jane Smith";
    EmbeddingRequestVo reoVo = new EmbeddingRequestVo(question, OpenAiModels.text_embedding_3_small);
    EmbeddingResponseVo respVo = OpenAiClient.embeddings(reoVo);
    Float[] embedding = respVo.getData().get(0).getEmbedding();

    // 转换嵌入向量为 SQL 可用的字符串
    String vectorString = Arrays.toString(embedding);

    String dsn = EnvUtils.get("DATABASE_DSN");

    JdbcInfo jdbc = new DbDSNParser().parse(dsn);

    // PostgreSQL 连接配置
    String url = jdbc.getUrl();
    String user = jdbc.getUser();
    String password = jdbc.getPswd();

    // SQL 查询
    String sql = "SELECT * FROM vector_test ORDER BY embedding <=> ? LIMIT 10";

    try (Connection conn = DriverManager.getConnection(url, user, password);
        PreparedStatement pstmt = conn.prepareStatement(sql)) {

      // 设置向量参数
      pstmt.setObject(1, vectorString, java.sql.Types.OTHER);

      // 执行查询
      try (ResultSet rs = pstmt.executeQuery()) {
        while (rs.next()) {
          // 处理查询结果
          int id = rs.getInt("id");
          String name = rs.getString("name");
          // 继续处理其他字段
          System.out.println("ID: " + id + ", Name: " + name);
        }
      }
    }
  }
}

解释:

  1. 获取嵌入向量:

    • 调用 OpenAiClient.embeddings 函数来获取输入问题的嵌入向量。
  2. 转换嵌入向量:

    • 将 Java 中的数组转换为 PostgreSQL 可用的 [] 格式字符串。
  3. 建立数据库连接和执行查询:

    • 使用 DriverManager 来建立数据库连接。
    • 使用 PreparedStatement 来构建和执行查询,并传递向量参数。
    • 处理查询结果。

4. 使用 Db 工具类进行向量查询

package nexus.io.open.chat.model;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

import nexus.io.jfinal.plugin.activerecord.Db;
import nexus.io.jfinal.plugin.activerecord.Row;
import nexus.io.jfinal.plugin.template.SqlTemplates;
import nexus.io.open.chat.config.SqlTplsConfig;
import nexus.io.open.chat.config.DbConfig;
import nexus.io.openai.client.OpenAiClient;
import nexus.io.openai.consts.OpenAiModels;
import nexus.io.openai.embedding.EmbeddingRequestVo;
import nexus.io.openai.embedding.EmbeddingResponseVo;
import nexus.io.tio.utils.environment.EnvUtils;
import nexus.io.tio.utils.json.JsonUtils;

public class SjsuProfessorsSearchTest {

  @Test
  public void searchTest() {
    EnvUtils.load();
    new DbConfig().config();
    new SqlTplsConfig().config();
    String question = "Jane Smith";
    EmbeddingRequestVo reoVo = new EmbeddingRequestVo(question, OpenAiModels.text_embedding_3_small);
    EmbeddingResponseVo respVo = OpenAiClient.embeddings(reoVo);
    Float[] embedding = respVo.getData().get(0).getEmbedding();
    String string = Arrays.toString(embedding);

    String sql = SqlTemplates.get("professor.vector_search");

    List<Row> records = Db.find(sql, string, string, string, string, string, string);
    String json = JsonUtils.toJson(records);
    System.out.println(json);
  }
}

String sql = SqlTemplates.get("professor.vector_search"); 返回的 sql 语句如下

SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1-(name_vector <=> ?)) AS name_similarity,
  (1-(description_vector <=> ?)) AS description_similarity,
  (1-(remark_vector <=> ?)) AS remark_similarity
FROM
  rumi_sjsu_professors
ORDER BY
  GREATEST(
    1-(name_vector <=> ?),
    1-(description_vector <=> ?),
    1-(remark_vector <=> ?)
  ) DESC
LIMIT 3;

5. 合并查询参数

在上面的示例中 6 个查询参数都是相同的,能否合并为一个查询参数

SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1-(name_vector <=> ?)) AS name_similarity,
  (1-(description_vector <=> ?)) AS description_similarity,
  (1-(remark_vector <=> ?)) AS remark_similarity
FROM
  rumi_sjsu_professors,
  LATERAL (
    VALUES (
      ?::VECTOR(1536)
    )
  ) AS input(input_vector)
ORDER BY
  GREATEST(
    1-(name_vector <=> ?),
    1-(description_vector <=> ?),
    1-(remark_vector <=> ?)
  ) DESC
LIMIT 3;

查询时只用传入一个参数

List<Row> records = Db.find(sql, string);

SQL 语句解释: 这个 SQL 语句是在进行向量相似度搜索。它从 rumi_sjsu_professors 表中选择数据,并计算输入向量与表中存储的向量之间的相似度。

  • 选择字段包括 id, name, department, job_title, email, description, remark。
  • 计算输入向量与 name_vector, description_vector, remark_vector 的相似度。
  • 使用 LATERAL 子句创建一个临时的输入向量。
  • 按最大相似度降序排序。
  • 限制返回前 3 条结果。

<==> 运算符:

  • <==> 是 PostgreSQL 中用于计算向量距离的运算符。它返回两个向量之间的余弦距离。值越小表示向量越相似。
  • 1 - 余弦距离,得到的是余弦相似度

6. db 工具类存储向量 和 查询向量示例

CREATE TABLE rumi_embedding (id bigint PRIMARY KEY,t text, v vector(1536));
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.junit.Test;
import org.postgresql.util.PGobject;

import nexus.io.data.utils.SnowflakeIdUtils;
import nexus.io.jfinal.plugin.activerecord.Db;
import nexus.io.jfinal.plugin.activerecord.Row;
import nexus.io.jfinal.plugin.utils.PgVectorUtils;
import nexus.io.open.chat.config.DbConfig;
import nexus.io.openai.client.OpenAiClient;
import nexus.io.tio.utils.environment.EnvUtils;
import nexus.io.tio.utils.json.JsonUtils;

public class VectorTest {

  @Test
  public void testSave() {
    EnvUtils.load();
    new DbConfig().config();
    long id = SnowflakeIdUtils.id();

    String name = "Dr. John Doe";
    Float[] embeddingArray = OpenAiClient.embeddingArray(name);
    PGobject pgVector = PgVectorUtils.getPgVector(Arrays.toString(embeddingArray));
    Row row = new Row().set("t", name).set("v", pgVector).set("id", id).setTableName("rumi_embedding");
    Db.save(row);
  }

  @Test
  public void testQuery() {
    EnvUtils.load();
    new DbConfig().config();
    String sql = "select * from rumi_embedding";
    List<Row> records = Db.find(sql);
    List<Map<String, Object>> collect = records.stream().map((e) -> e.toMap()).collect(Collectors.toList());
    String json = JsonUtils.toJson(collect);
    System.out.println(json);
  }
}

output

[{"id":398392108312608768,"t":"Dr. John Doe","v":"[0.016610185,-0.010182072,-0.0007115674,0.030582452,0.0014376289,-0.042989362,0.0058700917,0.01898721,-0.040525373,-0.06777419,0.040989183,-0.023726765,-0.008565986,0.013827327,0.0125373565,0.024596408,-0.03901799,-0.012877966,-0.017218936,0.04638097,0.009892192,0.020436615,0.051106032,-0.07919551,-0.023915188,-0.010290778,0.044148885,-0.021436704,0.021697598,0.009848709,0.040612336,-0.008551491,0.021436704,0.0265676,-0.0185234,-0.0052613416,0.012117028,0.0107835755,0.025915368,-0.031133227,0.031423107,-0.045830198,-0.019219115,0.0039351354,0.0041380525,-0.025219653,0.011334349,-0.013030154,0.06000538,0.029669328,-0.021567151,0.008913843,0.02210343,0.050207403,-0.028161945,0.03324936,0.011885123,-0.020581556,0.027263314,-0.019711912,0.01805959,-0.015813012,-0.030553464,0.0029875867,-0.010493695,-0.008029706,-0.008326834,0.004572874,0.0045547565,-0.017436346,0.0017900156,0.0714267,-0.038641147,0.025799414,0.0041380525,-0.03264061,-0.010971999,0.027799595,-0.044177875,0.023219474,0.009587816,0.028611261,-8.7403105e-06,-0.012088041,-0.0048156492,-0.006091126,-0.027350279,-0.007957235,-0.005399035,-0.049250793,-0.0044061923,-0.0070114983,-0.053946868,0.013479469,-0.004286616,-0.0018144744,0.020581556,0.0070984624,0.025915368,-0.029205518,-0.006529571,-0.013464975,0.022552747,0.033974063,-0.0045076506,0.01630581,-0.014334619,-0.022480277,-0.02474135,0.020103252,-0.008594974,0.0055874577,-0.0011894183,-0.024929771,-0.06899169,-0.003313703,-0.009971908,0.0056309397,-0.03536549,-0.038351264,-0.032727573,0.014385348,0.026132777,-0.048613057,0.015668072,0.0238862,-0.02810397,-0.008660197,-0.08087682,-0.015842,0.04365609,-0.037539598,-0.00025726945,-0.017045006,-0.033307336,0.03640906,-0.0036615601,-0.0034423377,-0.025582004,-0.011254633,0.008573232,0.032698583,0.01335627,0.0031886918,0.043076325,-0.021567151,0.0022954957,0.02832138,0.029509893,0.040989183,-0.01669715,0.033597216,-0.01716096,0.013921538,-0.047047697,-0.011385079,0.0667886,0.026886469,-0.007051357,0.04365609,-0.0039568767,-0.013928785,0.008392056,-0.0061708433,-0.037278704,0.0728761,0.027625665,-0.073223956,-0.036525015,0.047105674,-0.010211061,0.025089206,-0.00892109,0.0059027034,-0.041539956,0.04029347,0.013146106,-0.019566972,-0.0052142357,0.009015301,0.0263212,0.04406192,0.02527763,-0.006203455,0.012247475,-0.05388889,-0.05113502,-0.0025944356,0.031915907,0.0077253305,0.045540314,-0.0009819721,0.048294187,0.023523849,-0.022291854,-0.017102983,-0.017349381,0.014523041,0.026582094,-0.02817644,-0.022393312,-0.028263405,0.032031856,-0.047801387,-0.0035800312,-0.024915278,0.01240691,0.009921179,0.037249718,-0.073513836,0.110328734,-0.0056707985,0.01691456,0.0031361508,-0.024263045,-0.03858317,-0.008508009,0.012530109,0.04452573,-0.024451468,-0.008899349,0.0394818,0.002822717,0.04287341,0.050294366,-0.00818914,0.009892192,-0.022871615,-0.00610562,-0.013805586,0.004065582,0.028437333,0.01952349,-0.026190754,-0.015450661,0.004623603,-0.005859221,-0.016958043,0.019349562,0.008747161,-0.013305541,-0.022320842,-0.009247206,0.01866834,0.007790554,-0.0058193626,-0.037713528,-0.08522503,0.013834574,0.031307153,-0.0057541393,-0.028509803,0.0740936,-0.003150645,-0.017363876,0.016334798,-0.022393312,-0.014269396,0.018030602,-0.0061780903,0.020407626,-0.008058693,-0.0018180978,0.0086746905,-0.05820812,0.028147452,0.010863293,-0.026509624,0.0077543184,0.06046919,0.011885123,0.001228371,0.023451379,0.037423644,-0.06655669,0.0072542736,0.027466232,0.025625486,-0.030350547,-0.02793004,-0.011986583,0.050120436,0.02037864,-0.015175274,-0.032843526,-0.032234773,0.02113233,0.025045725,-0.055918057,-0.002985775,0.021088848,-0.050352342,0.009841463,-0.029828763,-0.026277719,-0.024857301,0.005428023,-0.038351264,-0.01382008,0.0141317025,0.015885482,0.059657525,-0.019219115,0.040815253,-0.02810397,0.06586098,0.005217859,-0.043308232,0.017450841,-0.02137873,-0.013747609,0.0358293,0.0084427865,0.019494502,-0.00058247976,-0.036930848,-0.0013144294,0.013030154,-0.02227736,-0.006783217,-0.034437872,-0.044351805,-0.008283352,-0.02710388,-0.00449678,0.033307336,0.04530841,-0.012240228,0.038989004,-0.006337525,0.007080345,-0.027045904,-0.022915099,-0.0111024445,-0.018624859,0.02793004,-0.01913215,0.04469966,0.003782948,0.02756769,-0.035423465,0.024625396,0.0140085025,-0.023118015,0.021103341,0.013950527,0.028408345,-0.025132688,-0.013936033,0.017045006,-0.018929234,0.02495876,-0.030814357,0.0147477,-0.031568047,0.023784742,0.029234506,-0.022262866,0.0112618795,0.007834036,0.0015599225,0.023335425,0.02724882,0.07623872,0.0075296606,0.04901889,-0.048033293,-0.023770247,0.010544424,0.010609647,0.022262866,0.039568767,-0.016943548,0.069803365,-0.029741798,0.02739376,-0.056410857,0.039626744,0.01147929,0.033945072,0.01805959,0.03429293,0.046265017,-0.048294187,-0.00784853,0.016537715,0.003007516,0.022407807,-0.0054678814,-0.022610724,0.03600323,0.0023806482,0.040177517,-0.019291585,-0.0621505,-0.0030709275,-0.012153264,0.08655848,0.005598328,-0.008696432,0.04182984,-0.004333722,8.0396705e-05,0.005688916,-0.008928337,0.015189768,-0.06933955,-0.011080704,0.0077543184,-0.029770786,0.01808858,-0.07276015,0.037278704,0.048642043,-0.018943727,0.02968382,0.01791465,-0.028901143,0.01455203,-0.018552389,-0.0008773432,-0.0033372557,0.01813206,-0.0128562255,0.017146464,0.03640906,0.016131882,-0.023625307,0.04148198,-0.00037775128,0.03182894,0.058498,-0.034524836,-0.0014258525,-0.0175523,0.0053120707,-0.011783665,0.018784294,-0.033800133,0.019784383,-0.028654743,0.05116401,0.0131750945,-0.017639263,-0.008196387,0.021726586,0.010971999,0.015581108,0.020103252,-0.02066852,-0.012667803,-0.06342598,-0.021030871,0.00076818484,0.03843823,0.013385259,0.039162934,0.020335156,0.010515436,-0.01645075,0.016740631,-0.06412169,-0.013798338,0.025625486,-0.024335515,0.012327192,-0.013095377,0.027988017,-0.029408434,0.014233161,0.021103341,-0.0052033653,-0.055454247,0.021335246,-0.009239959,0.047192637,-0.02810397,0.023871707,0.026669059,0.012559097,-0.0031470214,-0.015421673,-0.013196835,0.042061742,0.0065875473,0.00838481,0.010863293,0.02985775,-0.0068448167,0.008109422,0.012356181,0.0073992144,0.032118823,-0.017465334,-0.025335606,-0.026451647,0.05156984,-0.0077398247,0.009884944,-0.058295082,0.01591447,0.016146375,-0.007551402,0.02005977,0.042554542,0.012638815,-0.020654026,0.07073098,0.020001793,0.016334798,0.0018026979,-0.0018950974,-0.0238862,-0.04368508,-0.012827237,0.005913574,0.013754857,-0.036843885,0.0064208657,0.0025636356,-0.016900066,0.005257718,-0.01774072,0.023161497,0.009109513,-0.03385811,-0.03446686,0.05510639,0.031133227,0.012196746,0.02137873,-0.012348933,0.002540083,-0.0099864025,-0.025509534,-0.0072107916,0.003618078,-0.023610814,0.007127451,0.0040184762,-0.032234773,0.06052717,0.016653668,-0.04104716,0.0074789315,0.029162036,0.027451737,0.010037132,-0.019161139,0.007892012,-0.0048228963,0.03182894,0.0146245,0.0036742424,-0.024219563,0.049801566,-0.036756918,-0.0064172423,-0.023219474,0.009537087,0.022784652,0.0078122946,-0.011834394,0.0147477,0.017595781,0.018958222,0.014095467,-0.00382643,0.0008877608,-0.018929234,-0.0005072919,-0.0008891196,-0.03901799,-0.020567061,-0.006612912,0.04197478,0.030292572,0.009442876,0.016407268,-0.02163962,-0.0066092885,0.02871272,0.004340969,0.008819631,-0.060875025,0.050497282,0.0071636857,-0.010812564,-0.015407179,-0.011812653,0.013646151,0.025524028,0.012472133,-0.0064208657,0.01616087,-0.056005023,-0.033133406,-0.034553822,0.039916623,-0.026118284,-0.026582094,0.009015301,0.00979798,0.02005977,-0.019407537,0.012269217,-0.0039786175,0.0003075457,0.006199831,-0.009399394,-0.02449495,0.010421224,-0.005420776,-0.025915368,-0.0038155594,0.013421494,-0.034727752,-0.010124097,0.002166861,0.0033300088,-0.026524117,-0.03994561,-0.007058604,0.05649782,0.01428389,0.050468292,0.00068484404,0.0027574936,-0.010805317,-0.002545518,-0.018871257,-0.0035347373,0.005319318,0.0029006223,0.056265917,0.008710926,-0.04301835,-0.014827416,-0.003551043,-0.046612877,0.0060875025,0.01737837,0.013182341,0.008696432,0.030901322,0.024219563,0.013559187,-0.024799325,-0.024335515,0.015552119,-0.016262328,-0.02566897,0.0063230307,-0.012617073,0.010348754,0.0057215276,-0.0069571454,-0.017972626,0.016943548,0.038670134,-0.0007840377,0.0009357723,-0.0021487435,0.0011631477,0.015899977,0.031046262,-0.025828402,0.026813999,-0.022190396,0.04380103,0.037713528,0.033916086,0.015421673,-0.03597424,0.018436436,0.019813372,-0.050642222,-0.049366746,0.020827955,0.012522862,-0.008377563,-0.0123416865,0.023973165,0.024306528,0.018537894,0.013928785,-0.010544424,0.008406551,-0.0056164456,0.022190396,-0.026553106,-0.033307336,-0.00020167117,0.0006187149,0.006098373,-0.0048228963,0.010029885,-0.0045004035,0.042496566,-0.109401114,-0.028132958,-0.035191562,0.014341866,0.01874081,-0.032553643,-0.01408822,0.001704863,0.055309307,0.020291675,0.022987569,-0.0013370764,0.00018378007,0.009210971,0.004601862,0.007790554,0.018639352,-0.049250793,0.0066998764,-0.023871707,-0.00012535091,-0.005859221,0.030205607,0.010645882,-0.012348933,0.0045040273,0.0061237374,0.016668161,-0.013370764,0.001764651,-0.012957684,0.007609378,0.021494681,0.019552479,-0.008225375,-0.011421314,0.007551402,-0.007319497,0.036380075,0.004667085,0.015639083,-0.023900693,-0.0039786175,-0.029263495,0.0023498484,-0.01408822,0.027538702,-0.0008094023,-0.042612515,-0.05249746,0.014667982,-0.033974063,0.011761924,-0.053077225,0.007935494,0.007949988,-0.020422122,0.055338297,-0.0046815793,0.022117926,0.019943817,0.014472312,0.020407626,0.015856495,0.007609378,0.006866558,-0.015131792,-0.0040836995,0.0304665,-0.013262059,-0.022233877,0.013406999,0.0048192726,-0.01630581,-0.024089117,0.043076325,-0.013291047,-0.038351264,0.0411921,-0.045569304,-0.02549504,0.021407716,-0.026002333,-0.007978977,0.014972357,-0.005815739,-0.020683015,0.014059232,0.034032036,-0.020856943,-0.024407987,0.012066299,0.022074442,-0.019581467,-0.0077035893,0.025726944,-0.013863562,0.010131343,-0.073571816,0.0029658456,-0.022407807,-0.018552389,0.022726675,0.0132113295,0.06470145,0.062904194,-0.0020400381,0.014508547,-0.042931385,-0.04391698,0.02427754,0.007913753,0.016508726,0.021726586,-0.036959834,-0.016508726,-0.047859363,-0.010971999,-0.041250076,-0.025147183,-0.037858468,-0.008500762,-0.012718532,0.011689454,0.030582452,-0.00074417907,0.025509534,-0.02785757,0.014733206,-0.026379177,-0.022755664,-0.0026415412,-0.010008144,-0.039307874,0.0212048,0.0022918722,0.013841821,-0.023291944,-0.024552926,-0.030263584,-0.006627406,0.020480098,-0.008015212,-0.027988017,-0.018421942,-0.016595691,-0.030350547,0.017421853,0.009884944,-0.009819721,0.00014505377,-0.05156984,-0.013769351,0.001362441,-0.010718352,0.037307695,0.026582094,-0.02971281,-0.004710567,0.0029839633,0.005159883,-0.0012220299,-0.021393223,0.0020907673,-0.012617073,0.017102983,-0.02624873,-0.014204172,0.015537625,-0.01616087,0.006141855,0.01662468,0.0131606,-0.021494681,-0.014515795,0.033162393,0.010899528,-0.05185972,-0.0040221,0.005351929,0.0024386244,-0.0010779952,-0.005783127,0.021552658,0.009580569,0.027770607,0.020755485,-0.03617716,-0.00443518,-0.027843077,0.011327103,-0.0051417653,-0.0041815345,-0.051685795,-0.02646614,-0.012798249,-0.0013905233,-0.00016396398,-0.017972626,0.018305989,0.0091385,0.03432192,-0.012225734,0.015798518,-0.013022907,-0.0056599276,-0.0037358422,-0.005601952,0.00899356,0.01820453,0.020436615,0.0074354494,-0.024147093,-0.00056255044,-0.03568436,0.013711374,0.03690186,0.025466051,-0.0026832116,0.0111024445,-0.02810397,-0.00069299695,-0.05041032,-0.013269306,0.026016826,-0.006217949,0.0032140564,-0.015726048,0.014581018,0.029220011,0.038003407,0.019552479,0.011174915,-0.019929323,0.025842898,0.03536549,0.055686153,0.010254542,0.01591447,-0.008486268,-0.0032629739,-0.013117119,-0.022697687,0.00442431,-0.008065941,0.0024386244,-0.04336621,-0.002025544,0.0071093333,0.007236156,-0.027944535,-0.0036126429,0.0030401277,0.031568047,-0.003634384,0.012638815,0.009181983,0.0068411934,0.054758534,-0.020856943,-0.033133406,-0.018900245,-0.006283172,-0.023654295,-0.014349113,-0.02793004,-0.0027158232,-0.025726944,0.0077615655,-0.031162215,0.015204262,0.006149102,0.038003407,0.024016647,-0.023538342,-0.020581556,-0.009297935,-0.008123917,0.024871796,0.020943908,-0.0001288612,-0.007594884,0.059222702,0.0032448561,0.021248283,-0.017653758,0.00087371963,0.05235252,0.019697418,-0.01079807,0.035510432,-0.014167937,-0.02878519,-0.0034513965,0.033771146,-0.004101817,0.032959476,-0.04574323,-0.010218307,-0.0103052715,0.012247475,0.017682744,-0.013385259,0.040844243,0.024509445,0.0094718635,-0.03565537,-0.03548144,-0.0519177,0.0024513067,0.0072941324,-0.038525194,-0.02964034,-0.015726048,-0.015349203,0.0399746,-0.020219205,-0.0062251957,0.007515167,-0.017972626,-0.03597424,0.046033114,-0.013856315,0.029335964,0.01784218,-0.015117298,-0.021103341,0.023364414,-0.022465782,0.047540493,0.02595885,0.0006911852,-0.0064208657,-0.013044648,-0.024002152,0.04527942,0.0049171075,0.004043841,-0.01991483,-0.017682744,-0.014276642,0.0013651587,0.0263212,0.0068846755,0.06394777,-0.023016557,-0.042032756,0.0030908568,0.033800133,-0.0037358422,0.019175632,-0.010848799,8.549227e-05,-0.001444876,0.0077253305,-0.036206145,0.021349741,0.02732129,0.0059027034,-0.0020201087,-0.011370585,-0.022683194,0.018842269,-0.011051715,-0.0039278883,0.005315694,-0.009696522,-0.022233877,-0.016943548,0.017639263,0.048033293,-0.03353924,-0.013566434,0.020798966,0.016102893,-0.0013678763,-0.007855777,0.007051357,-0.06870181,0.010544424,-0.004065582,0.023596318,0.019624949,-0.04901889,0.0044532977,-0.028017005,0.02113233,-0.0080442,-0.0063121603,-0.029335964,0.003964124,0.013464975,-0.031510074,0.0042721224,0.022683194,-0.024552926,0.032988466,0.006159973,0.0399746,0.015175274,0.01874081,-0.033017453,0.0027593053,0.0147477,0.0107473405,0.026422659,-0.00041579816,0.01342874,0.023016557,-0.034379896,0.0006880146,0.0015100992,0.019103162,0.0027719878,-0.035916265,0.047569484,-0.0333943,-0.027234327,-0.032669596,-0.025321111,0.0048663784,0.00429024,-0.0035129962,0.009790733,0.02717635,-0.016813101,-0.02878519,-5.4749024e-05,-0.032727573,-0.02878519,-0.0070332396,-0.01623334,-0.021161318,0.008754408,-0.0155666135,0.027437244,-0.017189948,-0.029944714,0.012493874,-0.023219474,-0.0014747699,-0.0024513067,-0.040148526,-0.0015218756,0.024581915,-0.00034853668,0.032959476,-0.0074282023,0.12859124,-0.01355194,-0.034061026,0.019103162,0.00011583919,-0.015494143,0.030263584,-0.016508726,0.010058873,0.015465155,-0.024060128,-0.0012981236,0.0047468026,0.016813101,0.018262507,0.011087951,-0.015624589,-0.018349472,-0.015102804,0.006544065,0.00085967855,-0.014378101,-0.013769351,-0.005025813,-0.01501584,0.0017229806,-0.028451826,-0.011559008,0.008435539,-0.0175523,-0.003775701,-0.03553942,-0.01401575,-0.006902793,-0.010174826,0.04197478,-0.0051562595,-0.021233788,0.005880962,-0.020117747,-0.014240407,-0.019653937,0.05667175,-0.022538252,0.0263212,0.009935673,-0.0131750945,0.0074499436,-0.037452634,0.007899259,-0.04333722,0.006717994,0.017494323,0.010566165,-0.006232443,-0.03322037,-0.0065875473,0.0047250614,0.054555617,0.010848799,0.008536997,-0.002233896,-0.005460635,0.017958133,0.045076504,-0.02968382,0.011957594,-0.010196567,0.05180175,0.030060668,-0.010696611,0.007855777,0.019827865,-0.02349486,0.007631119,0.0029296104,0.008623961,-0.036959834,0.012791002,0.0465549,0.036814895,0.023987658,0.014581018,-0.040061563,-0.019653937,-0.034727752,0.013725868,0.009964662,-0.0030328806,-0.030089654,-0.007899259,0.016030423,0.010058873,0.010812564,0.018074084,-0.0022755663,0.0079644825,-0.01881328,-0.004870002,-0.0041271816,0.029828763,0.036814895,0.012457639,-0.010348754,-0.012030064,-0.011740183,-0.011095198,-0.003634384,0.006152726,-0.024089117,-0.0076673543,0.023393402,0.0008877608,0.012957684,0.012776508,-0.028770696,0.022146914,0.038467217,0.022610724,0.0024331892,-0.02793004,0.024799325,-0.005736022,0.0070622275,-0.012660556,0.0003655219,0.04823621,0.054236747,0.011131433,0.01213877,0.008826879,-0.031452097,0.024857301,-0.027654653,0.031741977,0.028886648,0.0147694405,-0.011885123,0.0058193626,-0.010471954,-0.035046622,0.007638366,0.0014077349,-0.0030365041,0.021320753,0.00831234,-0.009674781,-0.014182432,-0.028045993,0.012385169,0.03261162,-0.0038228065,0.004572874,-0.0144143365,-0.02671254,-0.0132113295,-0.030901322,-0.010595153,-0.009384899,0.009616804,-0.044003945,-0.0072035445,-0.02227736,0.023610814,-0.014653488,0.015407179,-0.049366746,-0.014588265,0.00960231,-0.024335515,0.027524207,0.029669328,0.014051985,-0.0005149918,-0.013008413,-0.019755395,0.0076673543,-0.002473048,0.0008732667,0.0151607795,0.01645075,0.013291047,-0.009616804,0.04527942,-0.0077035893,0.048265196,0.019291585,-0.030263584,-0.019682925,-0.01174743,0.025161676,-0.012044558,0.0141317025,0.008138411,0.025466051,0.015479649,-0.052903295,-0.032959476,-0.021625128,-0.016349291,0.022117926,0.008102176,-0.023915188,0.035046622,0.02066852,-0.016407268,0.03524954,-0.008363069,-0.007870271,-0.050816152,0.010319766,0.024871796,0.060701095,-0.00097200746,-0.018769799,0.058613952,0.008087682,0.015146286,0.019465514,0.010471954,0.028408345,-0.02488629,0.028379356,0.024828313,-0.0053374353,0.01335627,0.025335606,0.010174826,0.016871078,0.012863472,0.006754229,0.018045096,-0.005286706,-0.00945737,0.018972715,0.02456742,-0.0088341255,-0.024828313,-0.01805959,-0.017682744,-0.009841463,-0.00013123913,-0.023770247,0.00027674582,-0.016334798,-0.015610095,0.017059501,0.0006522324,0.02098739,-0.0021867903,0.00038024242,0.0008614903,-0.021943998,-0.00014641258,-0.0054751285,-0.018494412,0.00010989437,-0.0029259871,-0.005920821,-0.0016831219,-0.026002333,-0.010979245,-0.008326834,0.026234237,0.03571335,-0.010790823,0.0063701365,0.010363248,0.028205428,0.01801611,0.00332095,0.01769724,0.013791092,-0.03617716,-0.0023897071,-0.0049642134,0.006022279,-0.018769799,0.026669059,0.0039496296,-0.015639083,-0.0075369077,0.021277271,0.034959655,0.00076727895,0.014312877,-0.010703858,0.028582273,0.009312429,0.024654385,-0.010232802,0.0051961183,0.027306797,-0.0045583798,0.012725779,0.021972984,0.024784831,-0.037771504,-0.03246668,0.016987031,-0.023755753,-0.013378011,-0.009645793,-0.036467038,0.004851884,0.0020418498,-0.029741798,0.002844458,-0.016726138,0.0012501121,-0.01616087,0.0003827336,-0.03324936,0.0067650992,0.029133048,0.044032935,0.051106032,0.023639802,0.027669149,0.011000986,0.009073277,-0.019103162,-0.0061237374,-0.0059896675,0.011732936,0.008986313,0.015885482,0.017247923,-0.0038807828,-0.031162215,0.013588175,0.012660556,0.0043518394,-0.0012165946,0.022538252,-0.01240691,-0.037771504,0.0027520584,0.009674781,0.0018842269,0.006438983,0.044931564,0.0042684986,-0.0047685434,-0.027219832,0.06046919,-0.00476492,-0.030988285,0.02617626,-0.0069571454,-0.03400305,-0.015972447,-0.021291764,0.0023570955,-0.016189858,-0.0002873899,0.048960913,0.010769081,0.014856405,0.0105879055,0.027263314,-0.021567151,-0.009181983,0.015494143,-0.04620704,-0.006482465,0.0008343139,-0.035452455,0.01187063,0.01991483,-0.019972805,-0.01891474,-0.02610379,0.01201557,0.00987045,0.049076866,0.025480546,0.010674871,0.00838481,-0.027205339,0.00046969793,-0.028524296,0.005225106,0.0028045992,0.023973165,0.019639442,-0.05759937,-0.010022637,0.029060576]"}]

7.直接查询获取向量对象 PGobject

String sql = "select v from rumi_embedding where t=?";
PGobject pGobject = Db.queryFirst(sql, text);
if (pGobject != null) {
  v = pGobject.getValue();
}

Edit this page
Last Updated: 10/1/26, 4:55 AM
Contributors: litongjava
Prev
PostgreSQL 全文检索
Next
PostgreSQL 优化向量查询