提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、项目地址
- 二、简介
- 总结
前言
之前据说很厉害的项目上线了,不过AI说像ETL,无所谓了,给大家看看
一、项目地址
添加链接描述
二、简介
基于springboot 3.5.7 springAI 1.1.0实现。
接口: ChatController用于用户输入和日志拉取两个流程复用返回精准匹配 自动异步落盘
searchController用于文本图片双模态多路召回top10,并对工具返回格式采取prompt注入和直接调用两种选项获取工具原值
工具:Fastmcp search_mcp.py利用网络接口补全相关信息
pika test_clip.py 分布式系统通过rabbitmq互相通信,多步补全图片向量
python代码: insert.py获取简介
insert2.py获取演员和导演 k_means.py聚出5个差异最大的数据 Farthest Point Sampling(k‑center greedy) move.py 数据清洗并向量化 test.py 入库文档: links_updated.csv 根据tmdbID获取简介
links_updated2.csv获取演员和导演信息
第一步:数据清洗
https://files.grouplens.org/datasets/movielens/ml-32m.zip
因为下的是比较新的数据源(2023-10)所以多了一个links.csv,里面有imdbId和tmdbId,方便我们补全电影简介。简单看一下,里面有八万条电影,限制速度40次/10S,那就要六个小时。
第二步:写python+下载ollama+下载bge-m3
python要写FastAPI,原因是ollama图片向量模型本地没有,云端太贵,所以python提供接口直接调用
第三步:下载PostgreSQL + pgvector
第四步:使用python接口处理向量和文本,然后存储为向量
第五步:多路复用,文本0.7+图片0.3 如果没有图片就是文本*1.0
第六步:拉入近期搜索值,处理当天的nginx日志,提取有价值的指标
为了和java对接 引入rabbitmq
第七步:实时调整向量
应该要归一化 避免文本长度带来的影响
第八步:MCP搜索工具和agent智能体的引入
提示词写好 可以让他在用户提问后多次调用工具 不过感觉不算是真的agent
第九步 测验
建立对照实验,1.重新导入instruct向量,证明他有用2.下载bg25证明bge-m3多语言情况下与文本检索的bg25有同等性能 bg25 缩减版语句 HR@10 = 47 / 50 = 0.94 bge-m3 未加instruct的中文原文简介 HR@10 = 27 / 50 = 0.54 bge-m3 加instruct的中文原文简介 HR@10 = 24 / 50 = 0.48
补充:
要建索引
CREATE INDEX ON documents
USING hnsw (embedding_text vector_cosine_ops);
建表语句 CREATE TABLE movie ( movie_id INTEGER, title CHARACTER VARYING(200), introduction TEXT, genres CHARACTER VARYING(100), embedding_text VECTOR(1024), embedding_image VECTOR(512) );
title要有唯一标识 ALTER TABLE movie ADD CONSTRAINT uk_movie_title UNIQUE (title);
遇到的问题: @Autoweired后在别的地方new了它,交给spring管理后就不能new了 改为参数注入 没有规划好类 导致多个类循环依赖 改为lazy懒加载 AdvisorCall获取不到返回值 通过提示词要求返回原值 并再过一遍LLM回复用户偏好语言 或者通过手动调mcp工具获取原值 但是不能模糊匹配用户偏好
展望: 通过设置偏移值实现让LLM翻页搜索的功能 维护用户偏好标题链和用户向量 实现用户的持久化 (但是会增加写操作,所以要引入redis缓冲)
总结
总的来说就是工具调用吧,多轮对话也很有意思。