LangChain4j RAG从原理到实战
LangChain4j RAG从原理到实战医疗智答助手版只会“调用大模型”还不够真正可落地的 AI 助手必须具备外部知识访问能力而 RAG 正是把“知识库”接入“对话系统”的关键能力。⚡ 快速参考LangChain4j 文档https://docs.langchain4j.devEmbedding Stores 集成https://docs.langchain4j.dev/integrations/embedding-stores/Pinecone 官网https://www.pinecone.io/ 学习目标理解 RAG 的核心价值与适用场景掌握 RAG 两阶段流程索引Indexing与检索Retrieval掌握 LangChain4j 的文档加载、解析、分割与向量化学会用 Pinecone 作为生产可用向量数据库在 AIService 中接入ContentRetriever实现知识增强问答一、什么是 RAG为什么要用1.1 RAG 的本质RAGRetrieval-Augmented Generation检索增强生成本质上是先从外部知识库检索相关内容再把检索结果和用户问题一起交给大模型生成答案。1.1.1 解决了哪些问题大模型参数不是实时更新难覆盖最新知识纯模型回答容易“幻觉”企业私有知识无法直接被公有模型内化直接把整份文档喂给模型成本高、延迟高常见应用场景企业客服知识库问答医疗、法律、金融等专业问答内部制度、产品文档、FAQ 检索问答频繁更新知识的实时问答系统二、RAG 常见检索方法2.1 关键词检索 vs 向量检索关键词检索按词项匹配和频次排序适合精确术语检索向量检索语义检索把文本映射为向量按相似度匹配语义混合检索关键词 向量通常效果更稳2.1.1 相似度的理解向量检索会计算查询向量与文档向量的相似度如余弦相似度分数越高相关性越强。三、RAG 的两阶段流程3.1 索引阶段离线/预处理索引阶段目标把原始知识变成“可检索”的向量索引。流程加载文档Loader解析文档Parser切分文档Splitter片段向量化Embedding向量写入数据库EmbeddingStore3.1.1 为什么必须切分文本LLM 上下文窗口有限整库无法直接输入输入越长时延和成本越高无关上下文越多幻觉风险越高合理分块能提升召回精度与答案可控性3.2 检索阶段在线检索阶段目标根据用户问题召回高相关片段并增强回答。流程将用户问题向量化在向量库相似度检索过滤低分片段minScore将片段 问题交给 LLM 生成答案四、LangChain4j 中的 RAG 关键组件4.1 文档加载器Document Loader常见加载器包括ClassPathDocumentLoaderUrlDocumentLoaderAmazonS3DocumentLoaderAzureBlobStorageDocumentLoaderGitHubDocumentLoaderGoogleCloudStorageDocumentLoaderSeleniumDocumentLoaderTencentCosDocumentLoader4.1.1 本地快速验证示例DocumentdocumentFileSystemDocumentLoader.loadDocument(E:/knowledge/人工智能.md);4.2 文档解析器Document Parser常见解析器ApachePdfBoxDocumentParserPDFApachePoiDocumentParserDOC/DOCX/PPT/PPTX/XLS/XLSXApacheTikaDocumentParser自动识别并解析多格式4.2.1 解析器选型建议格式单一用专用解析器更轻格式复杂用 Tika更通用4.3 文档分割器Document Splitter常见分割器DocumentByLineSplitterDocumentBySentenceSplitterDocumentByWordSplitterDocumentByCharacterSplitterDocumentByRegexSplitterDocumentSplitters.recursive(...)默认常见策略片段不超过约300 token并设置一定 overlap如30 token保证上下文连贯。4.3.1 参数调优经验chunk size小命中更细可能上下文不足chunk size大上下文更完整可能引入噪声overlap过小信息断裂overlap过大冗余与成本上升常用起步建议chunk size:400~800 tokenoverlap:30~50 token五、从 InMemory 到 Pinecone生产化向量存储5.1 为什么不用 InMemoryEmbeddingStore 上生产进程重启数据丢失扩容后数据难共享难支撑大规模检索和治理5.2 集成 Pinecone依赖示例dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-pinecone/artifactId/dependency配置向量存储BeanpublicEmbeddingStoreTextSegmentembeddingStore(){returnPineconeEmbeddingStore.builder().apiKey(System.getenv(PINECONE_API_KEY)).index(med-assistant-index).nameSpace(med-assistant-namespace).createIndex(PineconeServerlessIndexConfig.builder().cloud(AWS).region(us-east-1).dimension(embeddingModel.dimension()).build()).build();}六、知识入库与检索代码实战6.1 批量上传知识库Documentdocument1FileSystemDocumentLoader.loadDocument(E:/knowledge/医院信息.md);Documentdocument2FileSystemDocumentLoader.loadDocument(E:/knowledge/科室信息.md);Documentdocument3FileSystemDocumentLoader.loadDocument(E:/knowledge/神经内科.md);ListDocumentdocumentsArrays.asList(document1,document2,document3);EmbeddingStoreIngestor.builder().embeddingStore(embeddingStore).embeddingModel(embeddingModel).build().ingest(documents);6.2 相似度检索示例EmbeddingqueryEmbeddingembeddingModel.embed(你最喜欢的运动是什么).content();EmbeddingSearchRequestsearchRequestEmbeddingSearchRequest.builder().queryEmbedding(queryEmbedding).maxResults(1)// .minScore(0.8).build();EmbeddingSearchResultTextSegmentsearchResultembeddingStore.search(searchRequest);EmbeddingMatchTextSegmentembeddingMatchsearchResult.matches().get(0);System.out.println(embeddingMatch.score());System.out.println(embeddingMatch.embedded().text());七、把 RAG 接入 AIService医疗智答助手7.1 配置ContentRetrieverBeanContentRetrievercontentRetrieverMedAssistantPinecone(){returnEmbeddingStoreContentRetriever.builder().embeddingModel(embeddingModel).embeddingStore(embeddingStore).maxResults(1).minScore(0.8).build();}7.2 在 Agent 中启用AiService(wiringModeEXPLICIT,chatModelqwenChatModel,chatMemoryProviderchatMemoryProviderMedAssistant,toolsappointmentTools,contentRetrievercontentRetrieverMedAssistantPinecone)这样用户提问时系统会先检索知识库再让模型基于检索内容回答实现“有依据”的问答。八、RAG 调参与踩坑清单8.1 检索参数maxResults太小易漏召回太大易引噪minScore太高查不到太低不相关8.2 分块参数先固定模型和向量库再调chunk size/overlap以真实问答集做 A/B 测试不要只看单条样例8.3 工程实践建议建立“数据清洗 - 入库 - 评测”闭环为每次知识库更新做版本标记保留召回结果日志便于诊断“答非所问”九、小结RAG 在 LangChain4j 中并不复杂关键是把链路打通并持续调优文档可读Loader/Parser片段可检Splitter/Embedding检索可控Retriever 参数回答可依检索结果 LLM 生成对医疗智答助手这类场景而言RAG 能显著提升回答的专业性、可追溯性和稳定性是从“能聊”走向“能用”的关键一步。