LangChain4J-大模型开发工程师
2025-10-21 15:03:51 0 举报
AI智能生成
LangChain4J是一个面向大模型开发工程师的高级框架,专门为解决大型语言模型的训练、优化与部署提供全面解决方案。该框架融合了最新的深度学习技术,致力于简化模型开发流程,提升模型性能,缩短开发周期,支持团队协作。它覆盖了数据预处理、模型架构选择、参数调优、分布式训练以及跨平台部署等关键环节,尤其适合处理大规模数据集和复杂算法。此外,LangChain4J通过其用户友好的APIs和深入的文档,提供了灵活性和易用性,使得开发者能够专注于核心模型的创新,而不必担心基础设施的复杂性。
作者其他创作
大纲/内容
1. AI理论入门<br>
模型出生
BERT vs GPT
<br>
语言发展阶段
<br>
初始机器学习
<br>
什么是ChatGPT
ChatGPT,一个预训练的对话式文本生成AI<br>Chat包括输入端即发出有效提问(Prompt)和输出端的智能参考答案<br>
G: Generative, 可以生成符合语法和语义规则的自然语言文本
P: Pre-trained, 基于大规模文本数据的预训练,使它更聪明
T: 使用Transformer架构来有序处理文本
三者关系
LLM:大量训练数据训练的能够生成高质量人工语言的神经网络模型
ChatGPT:代表性的大型语言生成模型之一
AIGC:由人工智能算法自动生成的文本、图片等多种类型的数字内容
Java大模型工程师开发架构转变
方向
<br>
传统Java开发-分布式微服务架构
1<br>
2
3
LLM大模型能干什么
<br>
LLM大模型技术架构
<br>
2. LangChain VS LangChain4J理论入门速通<br>
Java相关的AI框架-概述
Why
SpringAI<br>
官网
https://docs.spring.io/spring-ai/reference/index.html<br>
https://github.com/spring-projects/spring-ai<br>
自习室情况
<br>
案例实战之从DeepSeek→DeepSeek4J
是什么
<br>
案例实战之从LangChain→LangChain4J
LangChain VS LangChain4J
是什么
大模型版的Docker
<br>
能干嘛
Why LangChain
无代码的AI开发平台
Dify
Coze
痛点
在复杂业务场景中,无法灵活打通系统的各个环节,实现业务的流转和自动化。因此,深入学习编码开发平台依然是AI应用开发的核心路径
去哪下
官网
https://docs.langchain4j.dev/
Github
https://github.com/langchain4j/langchain4j<br>
怎么玩
为了更容易集成,LangChain4j 还包括与 Quarkus 和 Spring Boot 的集成
https://docs.langchain4j.dev/tutorials/spring-boot-integration/
3. Win系Docker+OpenWebUI+Ollama+阿里百炼平台<br>
阿里百炼平台
国内大模型市场中,阿里通义系列无疑是首选,属于第一梯队
https://account.aliyun.com/login/login.html
https://bailian.console.aliyun.com/
官网访问+开通API-Key+模型选择<br>
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fbailian.console.aliyun.com%2F&lang=zh
<br>
LLM大模型工具Ollama<br>
是什么
官网
能干嘛
Docker Hub玩镜像
Ollama Hub玩模型
产品定位
<br>
实现原理
<br>
去哪下
说明:Ollama的运行会受到所使用模型大小的影响; <br>1. 例如,运行一个7B(70亿参数)的模型至少需要8GB的可用内存(RAM),而运行一个13B(130亿参数)的模型需要16GB的内存,33B(330亿参数)的模型需要32GB的内存;<br>2. 需要考虑有足够的磁盘空间,大模型的文件大小可能比较大,建议至少为Ollama和其模型预留50GB的磁盘空间;<br>3. 性能较高的CPU可以提供更好的运算速度和效率,多核处理器能够更好地处理并行任务,选择具有足够核心数的CPU;<br>4. 显卡(GPU):Ollama支持纯CPU运行,但如果电脑配备了NVIDIA GPU,可以利用GPU进行加速,提高模型的运行速度和性能;<br>
https://ollama.com/download
怎么玩
<br>
SpringAI VS Ollama
https://docs.spring.io/spring-ai/reference/1.0-SNAPSHOT/api/chat/ollama-chat.html
安装Ollama<br>
自定义Ollama安装路径<br>
<br>
手动创建大模型存储目录<br>
新建一个环境变量<br> <br>OLLAMA_MODELS<br> <br>D:\devSoft\Ollama\models<br>
复制转移大模型存储目录
<br>
安装通义千问大模型
验证是否安装成功<br>
千问模型为例<br>
<br>
ollama run qwen:4b
千问模型为例02
<br>
ollama run qwen:32b
假如模型不好使
<br>
微服务下载Maven坐标,大坑SpringAI——调用Ollama上的模型,需要下载的坐标
<br>
https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-ollama-spring-boot-starter<br>
https://mvnrepository.com/artifact/io.springboot.ai/spring-ai-ollama-spring-boot-starter/1.0.3
常用命令
下载和删除模型<br>
ollama pull <model_name><br>
ollama rm <model_name><br>
运行模型<br>
ollama run <model_name><br>
运行后,会进入交互式对话模式,可以直接与模型对话。<br>在交互模式下,输入 /bye 或按下 Ctrl+D 退出。<br>
查看现有模型<br>
ollama list<br>
查看模型信息<br>
ollama show <model_name><br>
Ollama搭建OpenWebUI
Ollama的图形化理论知识
Docker版(官方推荐)
https://docs.openwebui.com/getting-started/#quick-start-with-docker-
Web & Desktop
<br>
https://github.com/open-webui/open-webui
官网
子主题
openwebui.com
Win-Docker下安装OpenWebUI
win系统下先安装Docker引擎
window下安装Docker DeskTop
先下载到本地
https://www.docker.com/products/docker-desktop/
子主题
本地直接安装即可+安装完后启动验证
子主题
本地win虚拟化支持必须打开
子主题
修改image镜像保存地址<br>
子主题<br>
修改docker镜像下载地址
默认
<br>
自己优化
子主题
登录自己的阿里云账号
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fwww.aliyun.com%2F
镜像加速器
<br>
win系统下正常启动Docker引擎后安装OpenWebUI
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v D:\44\open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main<br>
子主题
安装完成
<br>
访问3000启动异常<br>
子主题
国内访问<br>
<br>
科学上网
<br>
注册账号
子主题<br>
登陆后选择模型使用
<br>
4. LangChain4j之HelloWorld
永远的helloworld
官网参考
https://docs.langchain4j.dev/tutorials/spring-boot-integration/#spring-boot-starters
Spring Boot Integration
boot微服务整合
https://docs.langchain4j.dev/tutorials/spring-boot-integration
接入阿里百炼平台的通义模型qwen-turbo-0624
获得Api-key
获得baseUrl开发地址
获得模型名称
qwen-turbo-0624
建project父工程
langchain4j-demo
初始总POM
开发步骤
建Module
langchain4j-01helloworld
改POM
写YML
阿里百炼
主启动
业务类
知识出处
聊天和语言模型
https://docs.langchain4j.dev/tutorials/chat-and-language-models
LLM 目前有两种 API 类型
ChatLanguageModel
LanguageModel
<br>
HelloLangChain4JController
测试
http://localhost:9001/langchain4j/hello?prompt=%E5%A6%82%E4%BD%95%E5%AD%A6%E4%B9%A0%E9%98%BF%E9%87%8C%E4%BA%91
5. LangChain4j之ChatAPI
DeepSeek官网推荐<br>
DeepSeek工具整合<br>
https://github.com/deepseek-ai/awesome-deepseek-integration/blob/main/README_cn.md
DeepSeek R1论文
https://github.com/deepseek-ai/DeepSeek-R1/blob/main/DeepSeek_R1.pdf
《DeepSeek R1》论文解读
https://zhuanlan.zhihu.com/p/20844750193
开发步骤
建Module
langchain4j-02chatapi<br>
改POM
写YML
主启动
业务类
低级LLM API 调用
<br>
配置
跨域问题(可选)
<br>
CorsConfig
ChatLanguageModelConfig(本例使用)
ChatLanguageModelController
业务类V2
知识出处
https://docs.langchain4j.dev/tutorials/ai-services#simplest-ai-service
https://docs.langchain4j.dev/tutorials/ai-services
目前有四种类型的聊天消息,每个消息的“来源”对应一种
<br>
四大类型
UserMessage
AiMessage
ToolExecutionResultMessage
SystemMessage
源码
<br>
高级LLM API<br>
<br>
AI Service
<br>
https://docs.langchain4j.dev/tutorials/ai-services
https://docs.langchain4j.dev/tutorials/spring-boot-integration/#spring-boot-starter-for-declarative-ai-services
原理
为了简化开发,LangChain4j提供了高层API,使开发者能够更专注于业务逻辑,而无需关注底层实现细节。高层API中,AiService 用于定义一个集成大模型的服务。
<br>
<br>
配置
定义AI Service接口
声明成SpringBean注入模型配置Config
ChatLanguageModelController
6. LangChain4j之常用配置
开发步骤
建Module
langchain4j-03chatapi-config
改POM
写YML
主启动
业务类
配置
Controller
http://localhost:9003/chatlanguagemodel/hello
常用配置
日志配置 (Logging)
官网
https://docs.langchain4j.dev/tutorials/logging/
步骤
配置
只有日志级别调整为debug级别,同时配置以上 langchain 日志输出开关才有效
ChatLanguageModelConfig
YML
监控 (Observability)
官网
<br>
https://docs.langchain4j.dev/tutorials/observability
https://docs.langchain4j.dev/tutorials/spring-boot-integration#observability
步骤
代码
implements ChatModelListener
配置
重试机制 (Retry Configuration)
官网
https://docs.langchain4j.dev/tutorials/model-parameters
步骤
默认重试3次
关闭WiFI后再访问,看后台打印几次
配置
maxRetries(1) // 重试机制
超时机制timeout
官网
https://docs.langchain4j.dev/tutorials/model-parameters
配置
timeout(Duration.ofSeconds(10)) // 设置10秒超时creep
7. LangChain4j之视觉理解
二说LangChain4J常用的API
LangChain4j的基本架构和组件
LangChain4j在两个抽象层提供不同的api
low level
ChatLanguageModel、UserMessage、AiMessage、EmbeddingStore、Embedding等
优点是你可以自由的组合使用各个组件,但是可能编码量比较高
high level
AiServices、Tools等
优点是api封装度比较高,减少了代码的复杂性,但仍可以进行灵活的微调。
官方总结
LangChian4j提供大模型接口、提示词模板、结构化输出、对话记忆、文档加载、文档分割、向量模型、向量存储等组件
相关api介绍
ChatLanguageModel
<br>
low-level模型api,提供generate方法用于对话,可以接收单个或多个消息
ChatLanguageModel提供的一种极其简便的方法
AI Service
配置
定义AI Service接口
声明成SpringBean注入模型配置Config
AI Service是如何工作的
<br>
UserMessage
ChatMessgae的一种实现,表示消息来自用户
SystemMessage
这是来自系统的消息。作为开发人员,应该定义此消息的内容。通常,你会在这里写下关于LLM在这次对话中扮演什么角色的说明,它应该如何表现,以什么方式回答,等等。LLM 被训练为比其他类型的消息更关注。所以要小心,最好不要让最终用户自由访问定义或注入一些输入
AiMessage
ChatMessage的一种实现,表示消息由AI生成,通常是对于UserMessage的响应,AiMessage可以包含文本或执行工具的请求,这是 AI 生成的消息,通常用于响应
EmbeddingModel
将文本转换为 Embedding,俗称文本向量化
ImageModel
生成和编辑image
ModerationModel
检查文本是否包含有害内容
ScoringModel
对多段文本进行评分、排名,对 RAG 很有用
二次案例
langchain4j-02chatapi
配置类切换
HighAPI新建接口
ChatApiController
多模态之视觉理解
https://docs.langchain4j.dev/tutorials/chat-and-language-models#multimodality
切换阿里百炼大模型选择能支持图像的qwen-vl-max
百炼登录入口
https://bailian.console.aliyun.com/
选择模型
<br>
qwen-vl-max
开发步骤
建Module
langchain4j-04chatapi-image
改POM
写YML
主启动
业务类
配置
resources目录下放入1.png图片
static/images/1.png
Controller
测试
http://localhost:9004/image/call
8. LangChain4j之流式输出
流式输出
https://docs.langchain4j.dev/tutorials/response-streaming/
开发步骤
建Module
langchain4j-05chat-stream
改POM
写YML
主启动
业务类
配置
ChatAssistant接口
Controller
测试
http://localhost:9005/chatstream/chat2?prompt=%E5%8C%97%E4%BA%AC%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E5%90%83%E7%9A%84
9. LangChain4j之向量数据库和存储
官网
https://docs.langchain4j.dev/tutorials/rag#embedding-store
向量<br>
是什么
<br>
案例1
维度
<br>
如何确定相似
<br>
案例2
对比图片
<br>
维度
<br>
向量化及存储
是什么
将文本、图像和视频转换为称为向量(Vectors)的浮点数数组在 VectorStore中,查询与传统关系数据库不同。它们执行相似性搜索,而不是精确匹配。<br>当给定一个向量作为查询时,VectorStore 返回与查询向量“相似”的向量<br>
<br>
Embedding Model模型简介
https://docs.langchain4j.dev/tutorials/rag#embedding-model<br>
说人话
<br>
Embedding Store存储简介
https://docs.langchain4j.dev/tutorials/rag#embedding-store
翻译
说人话
EmbeddingSearchRequest
https://docs.langchain4j.dev/tutorials/rag#embeddingsearchrequest
小总结
<br>
<br>
能干嘛
将文本、图像和视频转换为称为向量(Vectors)的浮点数数组在 VectorStore中,查询与传统关系数据库不同。它们执行相似性搜索,而不是精确匹配。
当给定一个向量作为查询时,VectorStore 返回与查询向量“相似”的向量
<br>
优点
捕捉复杂的词汇关系(如语义相似性、同义词、多义词)
超越传统词袋模型的简单计数方式
动态嵌入模型(如BERT)可根据上下文生成不同的词向量
向量嵌入为现代搜索和检索增强生成 (RAG) 应用程序提供支持
小总结
将文本映射到高维空间中的点,使语义相似的文本在这个空间中距离较近。
例如,“肯德基”和”麦当劳”的向量可能会比”肯德基”和”新疆大盘鸡”的向量更接近
去那下
LangChain4J支持的向量数据库List清单
https://docs.langchain4j.dev/integrations/embedding-stores/
怎么玩
Text search
文本搜索
想象一下在搜索引擎中输入“最好的四川美食”。嵌入模型会将您的查询转换为数字并检索具有类似嵌入的文档。然后,该模型将显示与您的查询接近的结果。
Recommend movies
推荐电影
如果您喜欢一部电影《哪吒2》,系统会使用嵌入模型将其(例如类型、演员阵容、情绪)表示为数字。<br>它会将这些数字与其他电影嵌入进行比较,并推荐类似的电影。<br>
Match images and captions
匹配图片和标题
通过将图像和潜在标题转换为数字表示(嵌入),嵌入模型可以将海上日落图像与标题“平静海浪上的宁静日落”相匹配。该模型使用最接近图像嵌入的嵌入来识别标题,从而确保准确匹配。该技术为图像搜索和照片标记等工具提供支持。
Group similar items
将相似项目归类
购物网站使用嵌入将相似的产品归为一组。例如,“红色运动鞋”在嵌入空间中可能靠近“蓝色运动鞋”,因此它们显示为相关。
Coding<br>
建Module<br>
langchain4j-10chat-embedding<br>
改POM
写YML
主启动<br>
业务类
Qdrant向量库存储
Qdrant是一个高性能的向量数据库,用于存储嵌入并进行快速的向量搜索<br>
使用Docker安装Qdrant:
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant<br>
端口6333:用于HTTP API,浏览器web界面
端口6334:用于gRPC API
安装成功
http://localhost:6333
http://localhost:6333/dashboard#/collections
阿里云百炼平台向量大模型
text-embedding-v3
配置类
controller
测试
http://localhost:9010/embedding/embed
<br>
新建向量数据库实例和创建索引:test-qdrant,类似mysql create database test-qdrant<br>http://localhost:9010/embedding/createCollection
<br>
往向量数据库新增文本记录<br>http://localhost:9010/embedding/add
<br>
查询
http://localhost:9010/embedding/query1
<br>
http://localhost:9010/embedding/query2
10. LangChain4j之文本向量化分类
文本向量化分类2025.3.23
一线战报2025.3.23
<br>
https://docs.langchain4j.dev/tutorials/classification
基于向量数据库对特征匹配归类
余弦相似度
在实际应用中,余弦相似度广泛应用于文本分析、信息检索、数据挖掘等领域,用于比较文档、文章或其他种类的数据对象的相似性。例如,在文本分类或聚类任务中,可以通过计算文档向量(通常基于词频或TF-IDF权重)之间的余弦相似度来评估文档间的相似程度。
企业案例
智慧HR: 基于LangChain4j文本向量的面试者性格特征匹配
智能客服: 基于LangChain4j文本向量的问题咨询特征匹配
智能医生: 基于LangChain4j文本向量的医学咨询特征匹配
智能财务/智能法官
......<br>
小总结
性格/简历/医学/问题/故障等,特征匹配是HR领域的一项重要任务,它通过分析面试者/咨询者的语言表达、行为模式等信息,<br>将其与预定义的性格标签进行匹配。这有助于智能系统更好地评估候选人/患者/咨询人是否适合特定问题或团队文化。
设计思考
基于向量模型的分类器实现
LangChain4j框架通过TextClassifier接口,结合向量模型,为我们提供了实现性格特征匹配的强大工具。
基于向量模型的分类器实现<br>EmbeddingModelTextClassifier通过向量模型对文本进行向量化,并利用余弦相似度计算文本与性格标签之间的匹配度。<br>
源码概述
EmbeddingModelTextClassifier
https://github.com/langchain4j/langchain4j-examples/blob/main/other-examples/src/main/java/embedding/classification/EmbeddingModelTextClassifierExample.java
开发步骤
建Module
langchain4j-11chat-embeddingtextclassifier
改POM
写YML
主启动
业务类
向量配置类
定义业务枚举
向量文本分类器
controller
测试
http://localhost:9011/textClassifier/ask
11. LangChain4j之模型敏感词处理<br>
模型敏感词处理
<br>
sensitive-word
https://github.com/houbb/sensitive-word
基于DFA算法实现的高性能敏感词工具
问大模型之前需要先走一下自己的【敏感词】词库
开发步骤
建Module
langchain4j-12chat-sensitiveword<br>
改POM
<!--sensitive-word--><br> <dependency><br> <groupId>com.github.houbb</groupId><br> <artifactId>sensitive-word</artifactId><br> <version>0.25.0</version><br> </dependency><br>
写YML
主启动
测试Junit5
12. LangChain4j之记忆缓存
官网
https://docs.langchain4j.dev/tutorials/chat-memory/
作用
记忆缓存是聊天系统中的一个重要组件,用于存储和管理对话的上下文信息。它的主要作用是让AI助手能够”记住”之前的对话内容,从而提供连贯和个性化的回复。
随便找个大模型测试一下看看,上下文记忆功能
<br>
更换模型
<br>
开发步骤
建Module
langchain4j-06chat-memory
改POM
写YML
主启动
配置类<br>
业务类
ChatAssistanti接口
AiAssistant接口
Controller
测试
http://localhost:9006/chatmemory/test1
http://localhost:9006/chatmemory/test2
13. LangChain4j之提示词工程
官网
https://docs.langchain4j.dev/tutorials/ai-services/#systemmessage
https://api-docs.deepseek.com/zh-cn/prompt-library/
作用
角色设定:塑造AI助手的专业身份<br>
开发步骤
设计要求
使用SystemMessage明确定义助手的角色和能力范围,将其限定在法律咨询领域。在LangChain4j中,我们主要利用SystemMessage来实现这一点,SystemMessage具有高优先级,能有效地指导模型的整体行为
利用提示词模板(@UserMessage, @V)精确控制输入和期望的输出格式,确保问题被正确理解和回答
建Module
langchain4j-07chat-prompt
改POM
写YML<br>
主启动
配置类
本次模型qwen-long
业务类
第一组
@SystemMessage+@UserMessage+@V
新建接口LawAssistant
提示词模板:精确控制输入输出<br>
SystemMessage具有高优先级,能有效地指导模型的整体行为
使用 @UserMessage 和 @V 注解:
controller<br>
第二组
新建带着@StructuredPrompt的业务实体类
修改接口LawAssistant
controller
第三组
使用 PromptTemplate 渲染
controller
测试
14. LangChain4j之functioncalling/动态函数<br>
函数
官网
https://docs.langchain4j.dev/tutorials/tools
是什么
一些LLM除了生成文本外,还可以触发操作。
函数调用
流程图
<br>
不调用如何
<br>
将 LLM 的智能与外部工具或 API 无缝连接
大语言模型(LLMs)不仅仅是文本生成的能手,它们还能触发并调用第3方函数,比如查询微信/调用支付宝/查看顺丰快递单据号等等......
重要提示: LLM 本身并不执行函数,它只是指示应该调用哪个函数以及如何调用
开发步骤
建Module
langchain4j-08chat-functioncalling
改POM
写YML
主启动
业务类,编码方式V1
新建大模型调用的功能接口FunctionAssistant
配置类
工具说明 ToolSpecification
业务逻辑 ToolExecutor
说明
<br>
bug-升级版
controller<br>
测试
http://localhost:9008/chatfunction/test1
业务类,注解方式V2
使用注解 @Tool,可以更方便地集成函数调用,只需将Java方法标注为 @Tool,LangChain4j 就会自动将其转换为ToolSpecification
第3方接口
和风天气开发服务
https://dev.qweather.com/
<br>
注册
创建项目
1
2
有项目后创建可以访问该项目的api-key
1创建凭证
2凭证名称<br>
API地址和参数<br>
子主题
新建天气查询业务类
WeatherService
新建类<br>
配置类<br>
测试
http://localhost:9008/chatfunction/test1
10. LangChain4j之检索增强生成RAG私有知识库外挂
检索增强生成RAG(Retrieval-Augmented Generation)
是什么
官网
https://docs.langchain4j.dev/tutorials/rag/
RAG(Retrieval Augmented Generation,检索增强生成)是一种结合信息检索和文本生成的技术范式
核心设计理念
RAG技术就像给AI装上了「实时百科大脑」,通过先查资料后回答的机制,让AI摆脱传统模型的”知识遗忘”困境
能干嘛
通过引入外部知识源来增强LLM的输出能力,传统的LLM通常基于其训练数据生成响应,但这些数据可能过时或不够全面。RAG允许模型在生成答案之前,从特定的知识库中检索相关信息,从而提供更准确和上下文相关的回答
怎么玩
RAG 流程分为两个不同的阶段:索引和检索。LangChain4j 为这两个阶段提供了工具。
Coding<br>
建Module
langchain4j-11chat-rag01
改POM
写YML
主启动
业务类
新建接口ChatAssistant
配置类
controller
测试
http://localhost:9010/embedding/embed
RAG知识库实战Case
文件读取
document文档读取装载
https://docs.langchain4j.dev/category/document-loaders
分词器
文本向量化
检索增强
整合springboot+Qwen
15. LangChain4j之检索增强生成RAG私有知识库外挂
前情回顾
是什么
<br>
能干嘛
通过引入外部知识源来增强LLM的输出能力,传统的LLM通常基于其训练数据生成响应,但这些数据可能过时或不够全面。RAG允许模型在生成答案之前,从特定的知识库中检索相关信息,从而提供更准确和上下文相关的回答
怎么玩
<br>
RAG 流程分为两个不同的阶段:索引和检索
Here is a simplified diagram of the indexing stage
https://docs.langchain4j.dev/tutorials/rag#indexing
Retrieval
https://docs.langchain4j.dev/tutorials/rag#retrieval
LangChain4j offers three flavors of RAG:
Easy RAG: the easiest way to start with RAG
Naive RAG: a basic implementation of RAG using vector search
Advanced RAG: a modular RAG framework that allows for additional steps such as query transformation, retrieval from multiple sources, and re-ranking
核心 RAG API
核心 RAG API
EmbeddingStoreIngestor组织结构分析
<br>
主要内容
<br>
Document Loader (文档加载器)
FileSystemDocumentLoader: 从文件系统加载文档
UrlDocumentLoader: 从 URL 加载文档
AmazonS3DocumentLoader: 从 Amazon S3 加载文档
AzureBlobStorageDocumentLoader: 从 Azure Blob 存储加载文档
GitHubDocumentLoader: 从 GitHub 仓库加载文档
TencentCosDocumentLoader: 从腾讯云 COS 加载文档
<br>
Document Parser (文档解析器)
<br>
Document Transformer (文档转换器)
DocumentTransformer 用于对文档执行各种转换,如清理、过滤、增强或总结。
Document Splitter (文档拆分器)
DocumentByParagraphSplitter: 按段落拆分
DocumentBySentenceSplitter: 按句子拆分
DocumentByWordSplitter: 按单词拆分
DocumentByCharacterSplitter: 按字符拆分
DocumentByRegexSplitter: 按正则表达式拆分
小总结
使用LangChain4j构建RAG的一般步骤
加载文档: 使用适当的 DocumentLoader 和 DocumentParser 加载文档
转换文档: 使用 DocumentTransformer 清理或增强文档(可选)
拆分文档: 使用 DocumentSplitter 将文档拆分为更小的片段
嵌入文档: 使用 EmbeddingModel 将文档片段转换为嵌入向量
存储嵌入: 使用 EmbeddingStore 存储嵌入向量
检索相关内容: 根据用户查询,从 EmbeddingStore 检索最相关的文档片段EmbeddingSearchRequest
生成响应: 将检索到的相关内容与用户查询一起提供给语言模型,生成最终响应
开发步骤
建Module
langchain4j-14chat-rag02
改POM
写YML
主启动
业务类
新建接口ChatAssistant
配置类
controller
Advanced RAG
官网
https://docs.langchain4j.dev/tutorials/rag#advanced-rag
https://blog.langchain.dev/query-transformations/
前情复习+小总结
RetrievalAugmentor 是 RAG(检索增强生成)流程的核心<br>它通过从不同的数据源中检索相关内容来增强用户的消息
<br>
https://docs.langchain4j.dev/tutorials/rag#advanced-rag
流程如下:
The user produces a UserMessage, which is converted into a Query<br>用户生成一个 UserMessage ,它被转换为 Query
The QueryTransformer transforms the Query into one or multiple Querys<br>QueryTransformer 将 Query 转换为一个或多个 Query
Each Query is routed by the QueryRouter to one or more ContentRetrievers<br>每个 Query 都由 QueryRouter 路由到一个或多个 ContentRetriever
Each ContentRetriever retrieves relevant Contents for each Query<br>每个 ContentRetriever 为每个 Query 检索相关的 Content
The ContentAggregator combines all retrieved Contents into a single final ranked list<br>ContentAggregator 将所有检索到的 Content 组合成一个最终的排序列表
This list of Contents is injected into the original UserMessage<br>这个 Content 列表被注入到原始的 UserMessage 中
Finally, the UserMessage, containing the original query along with the injected relevant content, is sent to the LLM<br>最后,包含原始查询以及注入的相关内容的 UserMessage 被发送到 LLM
在创建AI-Service 时,可以指定 RetrievalAugmentor
转换
<br>
具体代码落地
<br>
高级 RAG 可以通过 LangChain4j 实现,其核心组件包括:<br>
QueryTransformer
QueryRouter
ContentRetriever
ContentAggregator
ContentInjector
内容聚合器
通过上图可以知道,来自多个数据源的查询结果放到内容聚合器里面,需要进行排序
RRF
Rerank
小总结
<br>
<br>
源码查看
Query,用户输入的提示词<br>List<Content>,从数据源(向量数据库)找到了满足i条件的,比如符合余玄相似度分数的,多个结果集<br>
<br>
RRF算法简介
源码查看
<br>
https://docs.langchain4j.dev/tutorials/rag#content-aggregator
是什么
Reciprocal Rank Fusion (RRF) 是一种用于结合多个排序结果的简单而有效的算法。<br>它通过计算每个候选项在多个列表中的排名倒数,然后将这些倒数相加,从而得出一个”融合分数”,并根据该分数对候选项进行重新排序。
案例Case
RRF如何结合多个列表进行排序,从而提高结果的精确性
结论
我和语义无关,我认分数不认人
reranker算法
是什么
落地实现
jina
官网
https://jina.ai/
Jina AI提供了一个强大的reranker模型,可以轻松集成到LangChain4j项目中
api-获得<br>
<br>
POM
<!--jina--><br><dependency><br> <groupId>dev.langchain4j</groupId><br> <artifactId>langchain4j-jina</artifactId><br></dependency><br>
在LangChain4j中使用Jina Reranker的基本示例
<br>
开发步骤
建Module
langchain4j-14chat-rag03
改POM
写YML
主启动
业务类
新建接口ChatAssistant
配置类
controller
16. MCP模型上下文协议(Model Context Protocol)<br>
MCP入门概念
是什么
<br>
一句话
大模型版的OpenFeign,一个用于微服务之间通讯,一个用于大模型之间通讯
MCP就像是AI世界的"万能适配器"。<br>想象你有很多不同类型的服务和数据库,每个都有自己独特的"说话方式"。AI需要和这些服务交流时就很麻烦因为要学习每个服务的"语言"。<br>MCP解决了这个问题 - 它就像一个统一的翻译官,让AI只需学一种"语言"就能和所有服务交流。<br>这样开发者不用为每个服务单独开发连接方式,AI也能更容易获取它需要的信息。<br>如果你是一个后端同学,那么应该接触或听说过gRPC。gRPC通过标准化的通信方式可以实现不同语言开发的服务之间进行通信,那么MCP专门为AI模型设计的"翻译官和接口管理器",让AI能以统一方式与各种应用或数据源交互。
<br>
为什么会有MCP出现,之前痛点是什么
<br>
<br>
MCP就是比FunctionCalling的更高一级抽像,也是实现智能体Agent的基础
能干嘛
提供了一种标准化的方式来连接 LLMs 需要的上下文,MCP 就类似于一个 Agent 时代的 Type-C协议,希望能将不同来源的数据、工具、服务统一起来供大模型调用
总
子主题
分
子主题
总
子主题<br>
案例
架构模式
<br>
SpringAI 或者SpringAI Alibaba
子主题
Spring AI MCP 采用模块化架构,包括以下组件
Spring AI 应用程序:使用 Spring AI 框架构建想要通过 MCP 访问数据的生成式 AI 应用程序
MCP 客户端:MCP 协议的 Spring AI 实现,与服务器保持 1:1 连接
MCP 服务器:轻量级程序,每个程序都通过标准化的模型上下文协议公开特定的功能
本地数据源:MCP 服务器可以安全访问的计算机文件、数据库和服务
远程服务:MCP 服务器可以通过互联网(例如,通过 API)连接到的外部系统
MCP 服务端存在两种通信方式
子主题
stdio
支持标准输入和输出流进行通信,主要用于本地集成、命令行工具等场景
sse
支持使用 HTTP POST 请求进行服务器到客户端流式处理,以实现客户端到服务器的通信
案例实战
需求分析
<br>
17. LangChain4j之AIService
官网
https://docs.langchain4j.dev/tutorials/ai-services
18. MCP模型上下文协议高阶二话V2-2025.5.18(Model Context Protocol)
调用上万个通用的MCP
https://mcp.so/zh
需求说明
百度地图
https://mcp.so/zh/server/baidu-map/baidu-maps
案例步骤
原理说明
子主题<br>
下载最新版的NodeJS
https://nodejs.org/zh-cn
注册百度地图账号+申请API-key
https://lbsyun.baidu.com/apiconsole/key
1<br>
2
3
4
nodejs配置编码
<br>
测试
大坑
上述全部配置完成后,重启电脑一下,确保配置生效
查ip
查看本地ip https://8jz.cn/local-ip/
http://localhost:8083/mcp/chat?question=查询61.149.121.66归属地
查天气<br>
有MCP服务<br>
子主题<br>
无MCP服务
子主题
19. LLM+Prompt+mysql-2025.5.24<br>
小复习
RAG,为了让大模型获取足够的上下文
Function Calling,为了让大模型使用工具
MCP,为了让大模型之间的调用
子主题<br>
子主题<br>
原理说明
子主题
LangChain4J调用mcp官网
https://docs.langchain4j.dev/tutorials/mcp
需求说明
微服务调用Qwen大模型操作MySQL-MCPServer对mysql进行查询
mcp调用mysql官网
https://mcp.so/zh/server/dpflucas_mysql-mcp-server/MCP-Mirror?tab=content
案例步骤
前置环境NodeJS和MCPMySQL-Server相关
安装mcp-server
npm install -g mysql-mcp-server
构建mcp-server
知识出处
https://mcp.so/zh/server/dpflucas_mysql-mcp-server/MCP-Mirror?tab=content#option-2-build-from-source
命令
git clone https://github.com/dpflucas/mysql-mcp-server.git
cd mysql-mcp-server
npm install
npm run build
通过原生JS脚本执行
知识出处
子主题<br>
查看安装包位置
npm config get prefix
查看index.js位置
替换为你本地的<br>C:\Users\阳\AppData\Roaming\npm\node_modules\mysql-mcp-server\build
微服务
建Module
mcp-client-demo
改POM
写YML
主启动
业务类
\src\main\resources\db03-prompt.txt
SQL脚本db03-prompt.txt准备,后续投喂给提示词模板
MysqlMCP调用接口
controller
原理
C:\Users\阳\AppData\Roaming\npm\node_modules\mysql-mcp-server\build
20. RAG04
文本向量化及存储-<br>速度复习一下O(∩_∩)O
向量数据库-Milvus和对应新案例
环境准备
Docker Desktop
https://www.docker.com/get-started/
在Docker中运行Milvus命令步骤
在 Docker 中运行 Milvus
https://milvus.io/docs/zh/install_standalone-windows.md
https://milvus.io/docs/zh/install_standalone-docker.md
<br>
1
Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat
2
.\standalone.bat start
说明
运行安装脚本后,包含以下内容:<br>·名为Milvus-standalone的docker容器已在19530端口启动。<br>·嵌入式etcd与Milvus安装在同一个容器中服务端口为2379。<br>其配置文件被映射到当前文件夹中的embedEtcd.yaml。<br>Milvus数据卷映射到当前文件夹中的volumes/milvus。
<br>
可以访问 Milvus WebUI,网址是http://127.0.0.1:9091/webui/ ,了解有关 Milvus 实例的更多信息。 http://192.168.2.131:9091/webui/
Milvus客户端图形化工具
官网
https://github.com/zilliztech/attu/releases/tag/v2.4.12
直接运行exe连接上本地Milvus向量数据库<br>
1
<br>
2
<br>
代码步骤
建Module
langchain4j-18rag4<br>
改POM
写YML
主启动
配置类
MilvusConfig<br>
EmbeddingModelConfig
业务类
controller
相似度去重V2
测试
http://localhost:9018/milvus/chat?prompt=%E6%88%91%E7%88%B1%E5%90%83%E9%9D%A2%E6%9D%A1
<br>
面试题
粉丝面试题:实时高并发下如何实现积分排行榜,实时查找榜一/榜二大哥
需求分析和设计思想
设计思想
落地细节情况
用户积分列表
新增
zadd user:ranking 100 user1 200 user2 300 user3
查看获取用户积分排行
ZRANDMEMBER user:ranking 10 withscores
积分相同时,如何处理?
<br>
积分相同时,解决思路
积分相同时,按最后更新时间升序,解决思路
可以将zset中的score设置为一个浮点数,其中整数部分为积分,小数部分为最后更新时间时间戳
算法如下
积分score = 积分 + 时间戳➗10的13次方
这里为什么要除以10的13次方?由于时间戳的长度是13位,除以10的13次方,可以将其移到小数点的右边
<br>
<br>
进一步V2优化修改
score = 积分 + (1 - 时间戳÷10的13次方)
获取排名前3的用户列表,先按积分从大到小(降序),积分相同时,按最后更新时间升序(从小到大)
score = 积分 + (1 - 时间戳÷10的13次方),保证先更新的(时间戳小)排在前面
<br>
<br>
Codeing
测试·
粉丝面试题:请你谈谈延时双删
需求分析和设计思想
适用面试场景:生产Bug<br>
查询过程:先redis → 再mysql<br>查询到的数据并不是数据库中的真实数据导致数据不一致的严重问题
业务场景
在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,<br> <br>修改请求的实现中需要修改数据库后,级联修改Redis中的数据。<br> <br>请求一:A修改数据库数据 B修改Redis数据<br> <br>请求二:C修改数据库数据 D修改Redis数据<br> <br>正常情况:A —> B—>C —> D <br> <br>并发情况下就会存在A —> C —> D —> B的情况,问题在哪里?<br> <br>一定要理解线程并发执行多组原子操作执行顺序是可能存在交叉现象的<br>
存在问题
请求一:A修改数据库数据 B修改Redis数据<br> <br>请求二:C修改数据库数据 D修改Redis数据<br> <br>正常情况:A —> B—>C —> D <br> <br>并发情况下就会存在A —> C —> D —> B的情况,问题在哪里?<br> <br>A修改数据库的数据最终保存到了Redis中,但是在A没有修改完成是不会同步进mysql的,<br>C在AB操作之间来查询,缓存redis数据没有删除,那A已经修改新数据了但是没有同步进B步骤进redis<br>导致C查看的还是老数据,此时出现了Redis中数据和数据库数据不一致的情况,从而出现查询到的数据并不是数据库中的真实数据的严重问题。
解决方案
步骤
删除缓存
更新数据库
延时500毫秒 <br>(根据具体业务设置延时执行的时间,保证数据库更新或者删除业务操作完成即可,看你自己实际情况)<br>
删除缓存
为何要两次删除缓存?
如果我们没有第二次删除操作,此时有请求访问数据,有可能是访问的之前未做修改的Redis数据,删除操作执行后,Redis为空,有请求进来时,便会去访问数据库,此时数据库中的数据已是更新后的数据,保证了数据的一致性。
因为mysql做了update操作,
导致数据不一致
查都是先查redis,一旦redis和mysql数据不一致,我返回的是redis里面的老数据,导致了这个生产bug
那一不做二不休,直接删掉redis,没有redis了,只有唯一的一个底单数据源mysql,数据源现在在唯一了
大家都来自mysql,success
小总结
更新动作完成之前,redis没有值,都从mysql一个数据源来
Code工程见代码
SQL脚本
建Module<br>
question-delayDoubleDel<br>
改POM
写YML
主启动
业务类
配置类RedisConfig2
RedisUtils
统一返回值和entity实体类<br>
Result
User
先查redis再查mysql的注解和切面类,容器捞鱼思想O(∩_∩)O<br>
假设不采用
<br>
注解
切面类CacheAspect
延时双删的注解和切面类
注解
切面类ClearAndReloadCacheAspect
mapper
servcie
controller
收藏
收藏
0 条评论
下一页