文章目录
-
- 前言
- [一、先搞明白:LangChain4j 是个啥来头?](#一、先搞明白:LangChain4j 是个啥来头?)
- [二、PgVector:PostgreSQL 的"超能力"觉醒](#二、PgVector:PostgreSQL 的"超能力"觉醒)
- 三、环境准备:别光看不练
- 四、实战开搞:从零搭建知识库
-
- [4.1 项目依赖](#4.1 项目依赖)
- [4.2 配置大模型和向量存储](#4.2 配置大模型和向量存储)
- [4.3 核心代码:文档入库](#4.3 核心代码:文档入库)
- [4.4 问答检索:RAG 的核心](#4.4 问答检索:RAG 的核心)
- [五、进阶玩法:别只会基础 CRUD](#五、进阶玩法:别只会基础 CRUD)
-
- [5.1 混合搜索:关键词 + 向量双管齐下](#5.1 混合搜索:关键词 + 向量双管齐下)
- [5.2 本地 Embedding 模型:省钱大招](#5.2 本地 Embedding 模型:省钱大招)
- [5.3 监控与调优:JVM 老本行](#5.3 监控与调优:JVM 老本行)
- [六、Java vs Python:这场仗怎么打?](#六、Java vs Python:这场仗怎么打?)
- [七、总结:Java 程序员的 AI 春天](#七、总结:Java 程序员的 AI 春天)
无意间发现了一个巨牛巨牛巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门blog.csdn.net/HHX_01
前言
兄弟们,做 AI 应用开发这几年,有没有一种被 Python "霸凌" 的感觉?
老板拍桌子:"搞个智能客服知识库,三天上线!" 你兴冲冲打开 GitHub,搜 RAG 教程------嚯,清一色 Python。langchain、chromadb、sentence-transformers,pip install 一条龙。等你吭哧吭哧配好 Python 环境,发现公司那台生产服务器上,Java 服务跑得正欢,内存占用稳如老狗。难不成为了个知识库,要把整个微服务架构推倒重来?
别慌。2025 年的 Java 生态,早就不是那个只能写 CRUD 的"企业级语言"了。LangChain4j 这玩意儿横空出世,直接把 Python 那套 RAG 玩法原封不动搬到了 Java 世界。再配上 PostgreSQL 的 PgVector 扩展,连向量数据库都省了额外部署的成本。今天这篇,咱们就用纯 Java 技术栈,手把手搭一个本地知识库,让 Python 党看看,什么叫"你有的我都有,我稳的你没有"。
一、先搞明白:LangChain4j 是个啥来头?
很多人一听 LangChain,下意识地以为是 Python 专属。其实 LangChain4j 可不是什么"山寨版",它是正经八百为 JVM 生态设计的原生框架,最新稳定版已经到了 0.35.x(2025 年 3 月 release)。
说白了,它就是把大模型调用、提示词管理、向量存储、文本切分这些脏活累活,封装成了一堆 Fluent API。你不需要手写 HTTP 客户端去调 OpenAI,不用自己算文本的 token 长度,更不用纠结怎么把 PDF 里的表格提取出来。这些 LangChain4j 都给你包圆了。
最骚的是类型安全。Python 那种"传个字典进去,返回个字典,里面到底有啥键全看运气"的写法,在 Java 这里变成了一板一眼的 POJO。编译期就能发现问题,上线后少睡多少半夜被叫起来修bug。
二、PgVector:PostgreSQL 的"超能力"觉醒
搞知识库离不开向量检索。以前大家一说到向量数据库,就想到 Pinecone、Milvus、Weaviate,又要部署新服务,又要维护集群。其实对于中小规模的业务(百万级文档以下),PgVector 完全够用。
这是 PostgreSQL 的一个开源扩展,直接把向量相似度搜索塞进了关系型数据库里。支持 HNSW 和 IVFFlat 索引,支持余弦相似度、欧氏距离、内积各种算法。最关键的是------你的业务数据本来就存在 PG 里,现在把向量也存进去,JOIN 查询一把梭,事务一致性还能保证。省了多少数据同步的麻烦,你细品。
2025 年的 PgVector 已经支持到 0.8.0 版本,性能比早期版本提升了将近 3 倍。单表存个几百万向量,检索延迟控制在 50ms 以内,妥妥的工业级水准。
三、环境准备:别光看不练
光说不练假把式,先把环境搭起来。你需要:
- JDK 17+:LangChain4j 用了不少新特性,JDK 8 确实有点老了,该升级升级
- Maven 或 Gradle:本文用 Maven 演示,Gradle 党自己翻译一下
- PostgreSQL 14+:确保安装了 PgVector 扩展,安装方法后面给
- 一个 Embedding 模型:可以用 OpenAI 的 API,也可以用本地模型(Ollama 或者 HuggingFace)
先装 PgVector。如果你用 Docker,一行命令搞定:
bash
docker run -d --name pgvector \
-e POSTGRES_PASSWORD=password \
-p 5432:5432 \
pgvector/pgvector:pg16
进容器里创建扩展:
sql
CREATE EXTENSION IF NOT EXISTS vector;
完事儿。就这一步,你的 Postgres 已经拥有了存储 1024 维向量的能力。
四、实战开搞:从零搭建知识库
4.1 项目依赖
新建一个 Spring Boot 3.x 项目,pom.xml 里加上这些:
xml
dev.langchain4j
langchain4j
0.35.0
dev.langchain4j
langchain4j-spring-boot-starter
0.35.0
dev.langchain4j
langchain4j-pgvector
0.35.0
dev.langchain4j
langchain4j-document-parser-apache-pdfbox
0.35.0
注意版本号,2025 年 4 月的最新稳定版是 0.35.0。别用 0.30 以下的老版本,API 变动挺大。
4.2 配置大模型和向量存储
application.yml 这么写:
yaml
langchain4j:
open-ai:
api-key: ${OPENAI_API_KEY}
model-name: text-embedding-3-small # 便宜又好用
pgvector:
host: localhost
port: 5432
database: postgres
user: postgres
password: password
table: knowledge_vectors
dimension: 1536 # text-embedding-3-small 的维度
4.3 核心代码:文档入库
假设你有一堆产品说明书 PDF,想让 AI 能回答相关问题。代码长这样:
java
@Service
public class KnowledgeBaseService {
@Autowired
private EmbeddingStore embeddingStore;
@Autowired
private EmbeddingModel embeddingModel;
public void ingestDocument(Path filePath) {
// 1. 解析 PDF
DocumentParser parser = new ApachePdfBoxDocumentParser();
Document document = parser.parse(filePath);
// 2. 切分文档,这里用递归切分,保持语义连贯
DocumentSplitter splitter = DocumentSplitters.recursive(
500, // 每段最大 token 数
50 // 段与段之间的重叠,防止断章取义
);
List segments = splitter.split(document);
// 3. 转为向量并存储
List embeddings = embeddingModel.embedAll(segments).content();
embeddingStore.addAll(embeddings, segments);
System.out.println("成功入库 " + segments.size() + " 个文档片段");
}
}
看到没?全程强类型,Document、TextSegment、Embedding 都是实实在在的类。不像 Python 那样,传个字符串列表进去,也不知道出来的是啥。
4.4 问答检索:RAG 的核心
文档存进去了,怎么问答?上代码:
java
public String askQuestion(String question) {
// 1. 把问题也转成向量
Embedding queryEmbedding = embeddingModel.embed(question).content();
// 2. 去 PgVector 里找最相关的 3 个片段
List> relevant = embeddingStore
.findRelevant(queryEmbedding, 3, 0.7);
// 3. 组装上下文
String context = relevant.stream()
.map(match -> match.embedded().text())
.collect(Collectors.joining("\n---\n"));
// 4. 构建提示词,丢给大模型
Prompt prompt = PromptTemplate.from("""
基于以下上下文回答问题:
{{context}}
问题:{{question}}
如果上下文里没有相关信息,请回答"我不知道",不要瞎编。
""").apply(Map.of("context", context, "question", question));
// 这里假设你配了 ChatLanguageModel
return chatLanguageModel.generate(prompt.text());
}
流程清楚不?就是"向量检索 + 上下文增强"的标准 RAG 套路。PgVector 在背后帮你做了最重的相似度计算,Java 代码只负责编排逻辑。
五、进阶玩法:别只会基础 CRUD
5.1 混合搜索:关键词 + 向量双管齐下
纯向量搜索有时候不准,特别是用户输入的是专有名词(比如产品型号)。这时候可以结合 Postgres 的全文搜索(Full Text Search)做混合检索:
java
// 先用 PgVector 召回 TOP 20,再用 SQL 过滤包含关键词的
String sql = """
SELECT text, embedding <=> ? as distance
FROM knowledge_vectors
WHERE to_tsvector('chinese', text) @@ plainto_tsquery('chinese', ?)
ORDER BY embedding <=> ?
LIMIT 5
""";
LangChain4j 的 PgVectorEmbeddingStore 支持自定义元数据过滤,你可以在入库时给文档打上标签(如"产品手册"、"售后政策"),检索时按标签过滤。
5.2 本地 Embedding 模型:省钱大招
调用 OpenAI API 是要钱的,而且数据要出海。如果公司内网隔离,可以用 Ollama 跑本地模型:
java
EmbeddingModel localModel = OllamaEmbeddingModel.builder()
.baseUrl("http://localhost:11434")
.modelName("nomic-embed-text") // 开源模型,效果还不错
.build();
LangChain4j 对 Ollama、LocalAI、HuggingFace Transformers 都有支持。2025 年的 nomic-embed-text v2,在中文场景下的表现已经能媲美 OpenAI 的 ada-002 了。
5.3 监控与调优:JVM 老本行
知识库上线后,检索延迟怎么样?PgVector 的 HNSW 索引构建需要时间,数据量大了记得调 ef_construction 和 ef_search 参数。这些在 Java 代码里可以通过 PgVectorEmbeddingStore.Builder 配置:
java
PgVectorEmbeddingStore.builder()
.host("localhost")
.indexType(PgVectorIndexType.HNSW)
.efConstruction(100) // 构建时精度,越高越慢但召回越好
.efSearch(50) // 查询时探索因子
.build();
再配合 Micrometer + Prometheus,把检索延迟、入库吞吐量都监控起来。这一套,Python 那边可没这么成熟的生态。
六、Java vs Python:这场仗怎么打?
写到这里,估计有人要杠:"Python 生态还是更丰富啊,Jupyter Notebook 调试多方便。"
没错,Python 在数据科学领域的积累确实深厚。但做工程化落地,Java 的优势就出来了:
- 类型安全:重构时 IDE 能帮你找出所有受影响的地方,Python 改个字段名,可能线上跑着跑着就炸了。
- 并发性能:Spring Boot + 虚拟线程(Project Loom),一个请求处理一次向量检索,轻松扛几万 QPS。Python 的 GIL 在那卡着,多线程就是笑话。
- 运维友好:JVM 的监控、 profiling、GC 调优,工具链成熟得可怕。出了问题 arthas attach 上去直接看,Python 进程挂了找原因都费劲。
- 团队协同:大厂后端本来就是 Java 居多,现在不用为了 AI 功能专门招 Python 工程师,现有团队就能上手 LangChain4j。
2025 年的趋势很明显:AI 应用从"实验室玩具"走向"生产环境",Java 这种久经考验的工程语言,正在重新拿回话语权。
七、总结:Java 程序员的 AI 春天
LangChain4j + PgVector 这套组合,等于是在 JVM 生态里铺了一条直通 AI 应用的高速公路。你不用离开熟悉的 Spring Boot,不用学习 Python 的语法糖,更不用在生产环境引入异构语言带来的维护噩梦。
从 0.30 版本到 0.35 版本,LangChain4j 这半年迭代飞快,对国产大模型(文心一言、通义千问、智谱 GLM)的支持也越来越完善。PgVector 作为 Postgres 的扩展,稳定性和性能都经过了实战检验。
所以啊,下次再有人跟你说"搞 AI 必须用 Python",你可以把这篇文章甩他脸上。Java 不仅能搞 AI,而且搞得又稳又快又省钱。代码都给你写好了,还等什么?今晚就把公司的知识库升级成 AI 版,明天老板肯定给你加鸡腿。
无意间发现了一个巨牛巨牛巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门blog.csdn.net/HHX_01