Java 干掉 Python 垄断!LangChain4j + PgVector 本地知识库开发全流程

文章目录

    • 前言
    • [一、先搞明白: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

相关推荐
夜郎king2 小时前
【码动四季】Trae + 腾讯地图 MCP 实战:让 AI 直接调用地图能力,一步到位
人工智能·trae实战·trae接入腾讯地图mcp·atomgit 码动四季
郑同学zxc2 小时前
Claude Code 的学习笔记
人工智能·笔记·学习
适应规律2 小时前
深度学习第四版
人工智能·深度学习
东离与糖宝2 小时前
OpenClaw 企业级实战:Java 微服务集成 AI 智能体,自动处理业务流
java·人工智能
nap-joker2 小时前
使用Image - To - image条件生成对抗网络评估乳腺癌新辅助化疗反应的动态对比增强MRI血管渗透性映射
人工智能·神经网络·生成对抗网络
超级AI_mes2 小时前
智慧卤味,一码追溯:万界星空MES方案
人工智能·经验分享·5g·信息可视化·创业创新·制造·可视化ai
大囚长2 小时前
AI技术对VR发展的核心促进作用
人工智能·vr
xingyuzhisuan2 小时前
怎么快速在云上部署一个Stable Diffusion环境?(实操落地版)
人工智能·stable diffusion·ai绘画·gpu算力
Daydream.V2 小时前
OpenCV——人脸识别
人工智能·opencv·计算机视觉·人脸识别·人脸识别的三种算法·附代码实现