LangChain4j实战:构建RAG医疗问答系统完整教程

为什么需要LangChain4j?
在Java生态的AI智能体开发领域,Spring AI 2.0无疑是当前最热门的选择。它功能强大,与Spring Boot深度集成,是大多数新项目的首选方案。然而,现实开发中并非所有项目都运行在Spring Boot之上——老系统的二次开发、轻量级CS项目、或者不依赖Spring框架的独立应用,都需要一个更灵活的替代方案。
LangChain4j正是为这类场景而生。LangChain4j是LangChain框架的Java移植版本,LangChain最初由Harrison Chase于2022年在Python生态中创建,迅速成为构建LLM应用的事实标准框架。LangChain4j由Dmytro Liubarskyi主导开发,目标是将LangChain的核心抽象——如Chain、Agent、Tool、Memory等概念——带入Java生态。与Spring AI 2.0不同,LangChain4j不依赖Spring容器的依赖注入和自动配置机制,而是通过Builder模式和纯Java API构建组件,这意味着它可以在Quarkus、Micronaut、甚至普通的Java SE应用中运行。Spring AI则深度绑定Spring Boot的自动配置体系,通过application.yml即可完成大部分配置,开发体验更接近传统Spring开发。同时掌握Spring AI 2.0和LangChain4j这两套方案,才能在不同项目场景中游刃有余。
本文将介绍一个基于LangChain4j的RAG(检索增强生成)医疗健康知识问答系统的完整实战项目,该项目使用Cursor AI编程辅助实现,展示了从需求分析到功能落地的全过程。
项目技术架构与选型
核心技术栈
该项目采用了前后端分离的经典架构:
- 后端:Spring Boot 4(Server Module)
- 前端:Vue 3 + Vite(Client Module)
- 数据库:MySQL 8(端口3308,默认3306)
- 向量数据库:Redis(用于存储文档向量)
- 大模型:Ollama本地部署的Qwen3-4B
- 嵌入模型:Ollama的Qwen3-Embedding-4B

有意思的是,该项目选择了Ollama本地私有部署方案,而非调用云端API。Ollama是一个开源的本地大模型运行时,由Meta的Llama模型生态催生,支持在消费级硬件上运行量化后的大语言模型。它封装了llama.cpp等底层推理引擎,提供了类似Docker的模型管理体验——通过ollama pull命令即可下载模型,ollama run即可启动推理服务。Qwen3-4B是阿里巴巴通义千问团队发布的40亿参数模型,经过量化后可在16GB内存的普通笔记本上流畅运行。
这对于医疗健康类应用尤为重要——医疗数据的隐私性要求数据不出本地。在中国,《个人信息保护法》和《数据安全法》明确要求敏感医疗数据不得未经授权传输至第三方服务器,因此本地部署不仅是技术选择,更是法律合规的必要条件。
数据库表设计
系统共设计了4张核心数据表:
- 用户表:支持管理员和普通用户两种角色,密码采用MD5加密。需要注意的是,MD5(Message-Digest Algorithm 5)是一种128位哈希函数,由Ron Rivest于1991年设计,但早在2004年就被王小云教授的团队证明存在碰撞漏洞,目前已被认为不适合用于安全敏感场景。现代密码存储的最佳实践是使用BCrypt、SCrypt或Argon2等自适应哈希算法,它们内置了盐值(Salt)和可调节的计算成本因子,能有效抵御彩虹表攻击和暴力破解。该项目作为学习演示项目使用MD5可以接受,但在生产环境的医疗系统中,应当升级为更安全的方案。
- 文档表:记录上传的知识库文件信息
- 问答记录表:存储用户的提问与回答历史
- 知识库类别表:对知识文档进行分类管理
RAG检索增强生成核心流程
该系统的核心是RAG(Retrieval-Augmented Generation)架构。RAG由Meta AI研究团队于2020年在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中首次提出,其核心思想是将信息检索与文本生成解耦:生成模型不再仅依赖训练时学到的参数化知识,而是在推理时动态检索外部知识库,将检索结果作为上下文注入Prompt。这种架构解决了大模型的两大痛点:一是知识截止日期问题(模型无法获知训练数据之后的信息),二是幻觉问题(模型在缺乏相关知识时倾向于编造看似合理的答案)。在医疗领域,一个错误的药物剂量建议可能危及生命,因此RAG通过提供可追溯的引用来源,让每个回答都有据可查。
其工作流程可以分为两个阶段。
知识入库:文档解析与向量化
系统支持四种主流文档格式的上传与解析:TXT、DOCX、PDF、Markdown。文档上传后,系统会自动完成以下处理:
- 文件解析:提取文档中的文本内容
- 文本分块:将长文本切分为适当大小的片段。文本分块(Chunking)是RAG系统中直接影响检索质量的关键环节。常见的分块策略包括:固定大小分块(按字符数或Token数切分)、递归字符分块(按段落、句子、词语逐级回退)、语义分块(基于嵌入向量的语义相似度判断分割点)。分块大小的选择需要权衡:过大的块包含更多上下文但检索精度下降,过小的块检索精度高但可能丢失语义完整性。LangChain4j内置了DocumentSplitter接口及多种实现,支持设置chunk size和overlap(重叠区域),重叠区域确保跨块边界的语义信息不会丢失。对于医疗文档,通常建议使用500-1000个Token的块大小,配合50-100个Token的重叠。
- 向量化:通过Qwen3-Embedding-4B嵌入模型将文本片段转换为向量。向量嵌入(Embedding)是将文本映射到高维向量空间的过程,使得语义相近的文本在向量空间中距离更近。Qwen3-Embedding-4B是专门为文本嵌入任务优化的模型,与通用语言模型不同,它经过对比学习训练,能够生成更适合检索任务的向量表示。
- 存储:将向量数据存入Redis向量数据库。Redis从7.2版本开始通过Redis Stack模块原生支持向量搜索功能(RediSearch),支持FLAT(暴力搜索)和HNSW(Hierarchical Navigable Small World,层次化可导航小世界图)两种索引算法。相比专业向量数据库如Milvus、Pinecone或Weaviate,Redis的优势在于:大多数Java项目已经在使用Redis作为缓存层,无需引入额外的基础设施组件;Redis的内存计算模型提供了极低的检索延迟;运维团队通常已具备Redis的管理经验。但其劣势也很明显:向量数据全部存储在内存中,对于大规模知识库(百万级以上文档)成本较高。对于中小规模的医疗知识库场景,Redis是一个务实的选择。
问答检索:从提问到生成回答
当用户提出问题时,系统执行以下流程:
- 将用户问题通过嵌入模型(Qwen3-Embedding-4B)转换为向量
- 在Redis向量数据库中进行相似度检索,获取Top-K(默认4条)最相关的文档片段。相似度检索通常使用余弦相似度(Cosine Similarity)或欧氏距离来衡量向量间的接近程度。Top-K中的K值选择需要权衡:K过小可能遗漏关键信息,K过大则引入噪声干扰生成质量,K=4是一个在信息覆盖度和噪声控制之间的常见平衡点。
- 将用户问题与检索到的文档片段组合为Prompt
- 将Prompt发送给Qwen3-4B大模型生成回答
- 返回回答内容及引用来源
这种架构确保了回答基于实际的知识库内容,而非大模型的"幻觉",对于医疗健康这类需要准确性的领域至关重要。
系统功能模块详解
管理员后台功能
管理员登录后可以访问以下功能模块:
- 数据概览:首页展示系统运行的统计数据和图表
- 用户管理:管理系统中的用户账号
- 分类管理:维护知识库的分类体系
- 知识库管理:上传文档、触发向量化处理、查看解析状态
- 问答历史:查看所有用户的问答记录

项目中预置了12个测试用的知识库文件,涵盖多种医疗健康主题,方便开发者快速上手测试。
普通用户端功能
普通用户登录后可以使用以下功能:
- 知识问答:选择知识类别后进行提问,系统基于RAG返回答案及引用来源
- 问答历史:查看个人的历史提问记录
- 个人中心:更换头像、修改昵称、修改密码等
Cursor AI辅助编程实践经验
结构化需求Prompt的设计技巧
该项目的一大亮点是全程使用Cursor AI辅助编程。Cursor是基于VS Code分叉开发的AI原生代码编辑器,由Anysphere公司开发。它集成了多种大语言模型(包括GPT-4、Claude等),提供了三种核心交互模式:Tab补全(行级/块级代码自动完成)、Chat对话(在侧边栏与AI讨论代码问题)、以及Agent模式(AI自主执行多步骤任务,包括创建文件、运行命令、修复错误)。
作者设计了一个结构化的需求Prompt,包含以下关键要素:
- 明确技术栈:指定后端框架、前端框架、数据库类型及端口
- 功能边界:要求"复杂度适中",避免过于简单或过于复杂
- 代码规范:要求生成中文注释,包括类和方法级别
- 配置细节:指定大模型名称、嵌入模型名称、向量数据库类型
- 界面要求:明确要求"美观大方,多一些好看的样式,不能太古板"

这种详细的Prompt设计使得Cursor生成的代码质量相当高。结构化Prompt的设计质量直接决定了AI生成代码的可用性——明确的技术约束、功能边界和代码规范能显著减少后续的人工修改量。整个项目的开发流程包括:Plan沟通方案 → AI生成代码 → Agent修复Bug → 完善功能,这正是Cursor Agent模式的典型应用:AI首先理解需求并制定实施计划,然后生成代码,最后自动运行测试并修复发现的问题。一共6讲即可完成核心开发。
开发效率与代码理解
借助Cursor AI编程,该项目的开发效率显著提升。从项目搭建到功能完善,核心开发过程被压缩到了6讲的内容量。当然,理解生成代码的架构和实现细节同样重要——作者额外花了两天时间录制了14讲的项目架构与功能模块讲解,帮助学习者真正理解代码背后的设计思路。
学习建议与前置知识要求
要顺利完成这个项目,需要具备以下前置知识:
- Java基础:扎实的Java编程能力
- Spring Boot:熟悉Spring Boot的基本使用
- LangChain4j基础:了解LangChain4j的核心概念和API
- 基本的AI概念:理解向量、嵌入、RAG等基本概念
对于已经掌握Spring AI 2.0的开发者来说,LangChain4j的学习曲线并不陡峭,两者在概念层面有很多相通之处,核心差异在于框架的集成方式和API设计风格。
总结
这个基于LangChain4j的RAG医疗问答系统项目,展示了Java生态中构建AI智能体应用的完整路径。从技术选型上看,LangChain4j + Ollama本地部署的组合,为不依赖Spring Boot的Java项目提供了可行的AI能力集成方案;从开发方式上看,Cursor AI编程显著提升了项目开发效率,但理解代码架构仍然是不可跳过的环节。
对于想要入门Java AI开发的工程师来说,同时掌握Spring AI 2.0和LangChain4j两套方案,将在实际项目中拥有更大的技术选择空间。
相关推荐

OpenCode深度评测:免费开源AI编程助手实战体验
深度评测OpenCode开源AI编程助手,涵盖三层架构解析、安装配置、实战构建待办事项应用全过程,对比DeepSeek Flash等模型表现,帮助开发者了解这款支持75+LLM提供商的免费Cursor替代方案。

Wayfair如何用GPT模型处理4000万商品目录
深度解析Wayfair如何利用OpenAI GPT模型对4000万SKU进行目录enrichment,涵盖技术实现、非标品分类难题的AI解法,以及对电商行业商品数据管理的启示。

Codex编程智能体全解析:和ChatGPT到底有什么区别?
深入解析OpenAI Codex编程智能体的核心能力,对比Codex与ChatGPT在编程场景中的本质区别,帮助开发者理解AI编程智能体如何改变软件开发模式。