当前位置: 首页 > article >正文

langchain4j笔记-09

RAG1. easy ragTestvoidtest03(){// 1. 创建模型// 2. 加载文档ListDocumentdocumentsClassPathDocumentLoader.loadDocuments(excel);//ListDocument documents FileSystemDocumentLoader.loadDocuments(/home/langchain4j/documentation);// 递归去加载// ListDocument documents FileSystemDocumentLoader.loadDocumentsRecursively(/home/langchain4j/documentation);// 通过正则表达式去过滤对应的文件//PathMatcher pathMatcher FileSystems.getDefault().getPathMatcher(glob:*.pdf);//ListDocument documents FileSystemDocumentLoader.loadDocuments(/home/langchain4j/documentation, pathMatcher);//3. 把文档存储到EmbeddingStoreInMemoryEmbeddingStoreTextSegmentembeddingStorenewInMemoryEmbeddingStore();EmbeddingStoreIngestor.ingest(documents,embeddingStore);//4. 配置embeddingStore到AiServices里面AssistantassistantAiServices.builder(Assistant.class).chatModel(BASE_MODEL).chatMemory(MessageWindowChatMemory.withMaxMessages(10)).contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore)).build();//String chat assistant.chat();// 5. 执行问答Stringanswerassistant.chat(当前活动节点是处理市场与销售的活动给我推荐几个动词和名词);System.out.println(answer);}5个步骤;创建模型加载文档把文档存储到EmbeddingStore配置embeddingStore到AiServices里面执行问答publicclassEmbeddingStoreIngestor{privatestaticfinalLoggerlogLoggerFactory.getLogger(EmbeddingStoreIngestor.class);privatefinalDocumentTransformerdocumentTransformer;privatefinalDocumentSplitterdocumentSplitter;privatefinalTextSegmentTransformertextSegmentTransformer;privatefinalEmbeddingModelembeddingModel;privatefinalEmbeddingStoreTextSegmentembeddingStore;/** * 1. 通过DocumentTransformer转换 documents documentTransformer.transformAll(documents); * 2. 将documents切割为segments segments documentSplitter.splitAll(documents); * 3. textSegmentTransformer segments textSegmentTransformer.transformAll(segments); * 4. 通过embeddingModel把segments转换为 ListEmbedding ResponseListEmbedding embeddingsResponse embeddingModel.embedAll(segments); * 5. 保存到embeddingStore embeddingStore.addAll(embeddingsResponse.content(), segments); */publicIngestionResultingest(ListDocumentdocuments){log.debug(Starting to ingest {} documents,documents.size());if(documentTransformer!null){documentsdocumentTransformer.transformAll(documents);log.debug(Documents were transformed into {} documents,documents.size());}ListTextSegmentsegments;if(documentSplitter!null){segmentsdocumentSplitter.splitAll(documents);log.debug(Documents were split into {} text segments,segments.size());}else{segmentsdocuments.stream().map(Document::toTextSegment).collect(toList());}if(textSegmentTransformer!null){segmentstextSegmentTransformer.transformAll(segments);log.debug({} documents were transformed into {} text segments,documents.size(),segments.size());}log.debug(Starting to embed {} text segments,segments.size());ResponseListEmbeddingembeddingsResponseembeddingModel.embedAll(segments);log.debug(Finished embedding {} text segments,segments.size());log.debug(Starting to store {} text segments into the embedding store,segments.size());embeddingStore.addAll(embeddingsResponse.content(),segments);log.debug(Finished storing {} text segments into the embedding store,segments.size());returnnewIngestionResult(embeddingsResponse.tokenUsage());}}DocumentSplitter 的本质是把面向人阅读的连续长文本转换成面向向量检索的独立语义单元这是连接文档存储和精准检索之间的桥梁。DocumentByParagraphSplitter DocumentByLineSplitter DocumentBySentenceSplitter DocumentByWordSplitter DocumentByCharacterSplitter DocumentByRegexSplitter Recursive: DocumentSplitters.recursive(...)Embedding/** * Embedding.dimension() returns the dimension of the embedding vector (its length) * CosineSimilarity.between(Embedding, Embedding) calculates the cosine similarity between 2 Embeddings * Embedding.normalize() normalizes the embedding vector (in place) * * EmbeddingModel.embed(String) embeds the given text * EmbeddingModel.embed(TextSegment) embeds the given TextSegment * EmbeddingModel.embedAll(ListTextSegment) embeds all the given TextSegment */Testvoidtest01(){EmbeddingModelembeddingModelnewBgeSmallEnV15QuantizedEmbeddingModel();ResponseEmbeddingembeddingResponseembeddingModel.embed(男人);EmbeddingmaleembeddingResponse.content();ResponseEmbeddingembeddingResponse2embeddingModel.embed(女人);EmbeddingfemaleembeddingResponse2.content();doublebetween1CosineSimilarity.between(male,female);ResponseEmbeddingembeddingResponse3embeddingModel.embed(猿猴);EmbeddingmonkeyembeddingResponse3.content();doublebetween2CosineSimilarity.between(male,monkey);}Advanced RAGQueryTransformer: 核心目的是通过改写、扩展或压缩查询来提高检索质量。 QueryRouter: 决定将处理好的查询Query发送给哪一个或哪几个“内容检索器”,其核心目的是确保查询能准确到达相关的数据源实现精准检索; ContentRetriever: 真正与数据源交互根据查询去“找出”相关的原始内容。 ContentAggregator 将来自不同查询、不同检索器的所有“原材料”进行“清洗、融合和精选”。 ContentInjector将最终聚合好的、高质量的内容以特定的格式“注入”回用户的原始消息中。核心的代码逻辑如下 DefaultRetrievalAugmentorOverridepublicAugmentationResultaugment(AugmentationRequestaugmentationRequest){ChatMessagechatMessageaugmentationRequest.chatMessage();StringqueryText;if(chatMessageinstanceofUserMessageuserMessage){queryTextuserMessage.singleText();}else{thrownewIllegalArgumentException(Unsupported message type: chatMessage.type());}QueryoriginalQueryQuery.from(queryText,augmentationRequest.metadata());CollectionQueryqueriesqueryTransformer.transform(originalQuery);MapQuery,CollectionListContentqueryToContentsprocess(queries);ListContentcontentscontentAggregator.aggregate(queryToContents);ChatMessageaugmentedChatMessagecontentInjector.inject(contents,chatMessage);returnAugmentationResult.builder().chatMessage(augmentedChatMessage).contents(contents).build();}privateMapQuery,CollectionListContentprocess(CollectionQueryqueries){if(queries.size()1){Queryqueryqueries.iterator().next();CollectionContentRetrieverretrieversqueryRouter.route(query);if(retrievers.size()1){ContentRetrievercontentRetrieverretrievers.iterator().next();ListContentcontentscontentRetriever.retrieve(query);returnsingletonMap(query,singletonList(contents));}elseif(retrievers.size()1){CollectionListContentcontentsretrieveFromAll(retrievers,query).join();returnsingletonMap(query,contents);}else{returnemptyMap();}}elseif(queries.size()1){MapQuery,CompletableFutureCollectionListContentqueryToFutureContentsnewConcurrentHashMap();queries.forEach(query-{CompletableFutureCollectionListContentfutureContentssupplyAsync(()-queryRouter.route(query),executor).thenCompose(retrievers-retrieveFromAll(retrievers,query));queryToFutureContents.put(query,futureContents);});returnjoin(queryToFutureContents);}else{returnemptyMap();}}

相关文章:

langchain4j笔记-09

RAG 1. easy rag Test void test03() {// 1. 创建模型// 2. 加载文档List<Document> documents ClassPathDocumentLoader.loadDocuments("excel");//List<Document> documents FileSystemDocumentLoader.loadDocuments("/home/langchain4j/docum…...

使用 Elcomsoft System Recovery 恢复 Windows 凭据

在传统的取证工作流程中&#xff0c;获取 Windows 系统的访问权限曾是一件比较直接的事情&#xff1a;从本地数据库中提取 NT 哈希&#xff0c;然后运行一次快速的离线攻击。如今&#xff0c;Windows 身份验证正从那些本质上不安全的 NTLM 哈希向更具弹性的机制迁移。微软正积极…...

用Python手把手复现灰狼算法GWO:从狩猎行为到代码实现(附完整源码)

用Python手把手复现灰狼算法GWO&#xff1a;从狩猎行为到代码实现&#xff08;附完整源码&#xff09; 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;作为一种新兴的群体智能算法&#xff0c;正逐渐在工程优化、机器学习参数调优等领域崭露头角。与传统的遗传…...

从 XChat 到超级 APP 生态:小程序生态为什么成为了超级APP的最佳技术选型

2026年4月17日&#xff0c;XChat 正式登陆苹果 App Store。 马斯克一直想做一个美国版的微信的目标已经实现&#xff1a;端对端加密、无广告、无追踪&#xff0c;注册只需要一个 X 账号&#xff0c;不需要手机号。马斯克给它的目标也很直接——X 要从社交平台&#xff0c;变成「…...

国产巴伦替代 Mini-Circuits TCM1‑63AX+,H3‑TCM1‑63AX+ 现货可原位替代

最近很多做射频 / 通信 / 无线项目的朋友都在找Mini TCM1‑63AX 的国产替代&#xff0c;既要性能对标、又要现货快交、还要价格友好。给大家分享一款恒利泰 H3‑TCM1‑63AX&#xff0c;完全原位替代 TCM1‑63AX&#xff0c;参数一致、脚位兼容&#xff0c;直接替换不用改板。 ✅…...

两阶段目标检测器核心原理与流程详解

两阶段目标检测器的核心思想是&#xff1a;第一阶段先找候选区域&#xff0c;第二阶段再对候选区域做分类和精修。典型代表是&#xff1a; R-CNN Fast R-CNN Faster R-CNN Mask R-CNN现在最典型的是 Faster R-CNN / Mask R-CNN&#xff0c;所以我以它为主来讲。1. 两阶段目标检…...

NotebookLM权限审计日志难追溯?手把手教你启用VPC Service Controls + Cloud Logging Query Builder构建实时越权预警看板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM权限控制设置 NotebookLM 是 Google 推出的基于用户上传文档进行 AI 辅助理解与生成的实验性工具&#xff0c;其权限模型默认采用 Google 账户体系集成&#xff0c;但需主动配置以满足团队协…...

用于免训练手术视频分割的记忆增强SAM2(MA-SAM2)

学影像 手术视频 基础模型增强 ──────────────────────────────────────── 1. 标题 英文:Memory-Augmented SAM2 for Training-Free Surgical Video Segmentation 中文:用于免训练手术视频分割的记忆增强SAM2(MA-SAM2) 2. 作者…...

神经网络分子动力学与长程静电相互作用优化技术

1. 神经网络分子动力学与长程静电相互作用优化概述分子动力学模拟作为计算化学和材料科学的核心工具&#xff0c;其精度和效率直接决定了研究的深度和广度。传统分子动力学依赖经验力场&#xff0c;虽然计算速度快&#xff0c;但难以准确描述化学键断裂/形成等过程。而基于量子…...

2026年企业做GEO推广找哪家?推荐几家源头厂家

2026年&#xff0c;GEO赛道正在经历一场剧烈的洗牌。根据界面新闻、极客公园、IT之家及多家第三方机构近期密集发布的行业评测&#xff0c;头部服务商格局已初步成型&#xff0c;但大量贴牌套壳的“伪源头”仍在搅浑市场。企业在选型时最焦虑的问题已经从“要不要做GEO”变成了…...

前端工程化:Vite与Rollup构建优化

前端工程化&#xff1a;Vite与Rollup构建优化 大家好&#xff0c;我是欧阳瑞&#xff08;Rich Own&#xff09;。今天想和大家聊聊前端工程化这个重要话题。作为一个全栈开发者&#xff0c;构建工具是日常开发中不可或缺的一部分。今天就来分享一下Vite和Rollup的构建优化技巧…...

【信息科学与工程学】【物理/化学科学和工程技术】知识体系 第四十一篇 数据中心基础设施领域中的力学知识 01

编号:001 类别 结构力学 (静力学与动力学) 领域 计算基础设施 / 机房设施 力学模型配方 将服务器机架简化为一个底部固定、顶部自由的悬臂梁模型。在地震激励下,该模型转化为一个单自由度阻尼受迫振动系统。主要考虑水平方向的地震力作用。 数学分析 通过建立运动微分…...

GitHub本周热门项目(2026-05-18)

GitHub 本周热门项目推荐 更新时间&#xff1a;2026-05-18 数据来源&#xff1a;GitHub Trending &#x1f525; TOP 10 热门项目 1. mattpocock/skills 一句话描述&#xff1a;面向真实工程师的技能框架&#xff0c;提供Claude Code等AI编码工具的专业技能扩展。 项目信息详…...

物业临时工考勤记录管理痛点与栎偲考勤神器技术实现方案

物业行业临时工考勤一直是HR管理的“老大难”&#xff1a;人员流动性大、班次碎片化&#xff08;如早班/晚班/临时替班&#xff09;、外勤打卡场景多&#xff08;如园区巡检、设备维修&#xff09;&#xff0c;传统Excel统计不仅耗时&#xff0c;还常因数据错漏引发薪资纠纷。本…...

ChatGPT实时支付功能“不可见”的真相:不是没上线,而是被GDPR/SCA双重拦截——3分钟自查你的地区、浏览器、MFA配置是否全达标?

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT实时支付功能在哪里 ChatGPT 本身并不原生支持实时支付功能。OpenAI 官方发布的 ChatGPT&#xff08;包括免费版、Plus 订阅版及 Team/Enterprise 版&#xff09;定位为人工智能对话助手&#xff0c;其…...

【信息科学与工程学】【物理/化学科学和工程技术】知识体系 第四十篇 低空/高空领域中的力学知识 01

低空与高空(地球大气层内/地球大气层外)领域的核心力学知识。 编号:001 类别:流体力学 / 连续介质力学 领域:低空飞行器空气动力学 力学模型配方:Navier-Stokes方程组(可压缩/不可压缩) 数学分析:求解控制流体运动的质量、动量和能量守恒偏微分方程组。 定理/算法…...

在不确定的命题环境中,如何建立稳定的考研数学备考体系

近两年&#xff0c;考研数学始终是考研备考中讨论度较高的科目。每年考试结束后&#xff0c;关于试卷难度、题型变化、计算量以及复习节奏的讨论都会迅速升温。对考生而言&#xff0c;真正需要关注的并不只是某一年试题“偏难”还是“偏易”&#xff0c;而是在变化之中建立一套…...

DNS 泄露是什么?为什么网络环境检测时要看 DNS

很多人在检查网络环境时&#xff0c;第一反应通常是看 IP。比如 IP 显示在哪个地区、运营商是谁、是不是数据中心网络。 但实际上&#xff0c;除了 IP 之外&#xff0c;DNS 也是一个很容易被忽略的关键指标。如果 DNS 查询结果和当前网络出口不一致&#xff0c;就可能出现所谓的…...

【麒麟系统-解释器错误:权限不足】

执行脚本后发现无法执行权限不足查看发现当前是有执行权限的&#xff1b;最后发现可能是有安全限制&#xff1a; 执行命令getstatus 执行这个命令即可&#xff1a;sudo setstatus softmode...

学生用户画像-利用ETL零代码构建考勤主题标签

1 实验说明 1.1 实验目的 依托 “数智教育” 大赛数据集搭建学生考勤 ETL 转换流&#xff0c;掌握 ETL 全流程&#xff0c;解决校园考勤统计低效、标准不一问题&#xff1b;优化空值处理&#xff0c;输出精准多维度考勤数据&#xff0c;支撑校园考勤管理。 1.2 实验环境 工…...

NTN 长距离通信领域亮相

核心蜂窝解决方案亮相并带来Nordic NTN 核心解决方案深度分享。环节将全面解析 nRF9151 模组的核心特性与技术优势&#xff0c;详解卫星星座生态布局及 nRFCloud 平台的应用价值&#xff0c;为参会者勾勒 NTN 技术的整体框架与商业落地前景&#xff0c;为后续内容奠定专业基础。…...

pycharm接入AI大模型测试脚本费用说明

费用说明 阿里云通义千问提供: 新用户免费额度:注册即送一定额度的免费 tokens 按量付费:用多少付多少&#xff0c;无最低消费 价格透明:详见 官方定价 示例成本(以 qwen-plus 为例) 解析-个 100页 PDF≈ 50,000 tokens ≈0.4 生成 100 个问答对≈20,000 tokens ≈0.16 下一步 …...

新手教程使用curl命令一分钟测试Taotoken的OpenAI兼容API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 新手教程&#xff1a;使用curl命令一分钟测试Taotoken的OpenAI兼容API 本文面向刚获取Taotoken API Key的开发者&#xff0c;目标是…...

多平台布局时代,店群账号高效管控之道

在电商行业持续精细化运营的当下&#xff0c;店群模式仍是商家拓宽渠道、分散风险、提升规模效应的主流选择。伴随抖店、拼多多、TikTok Shop、Temu、亚马逊等国内外平台规则趋严&#xff0c;多店铺账号管理已成为制约店群商家稳定经营的关键瓶颈。传统依赖人工登记、多设备登录…...

SC4541SKTRT 2MHz 2.9V~22V升/降压单线LED驱动器Semtech电子元器件IC芯片

SC4541SKTRT是Semtech&#xff08;升特&#xff09;推出的高频LED驱动器芯片&#xff0c;该器件集升压与降压拓扑于一体&#xff0c;支持2.9V至22V超宽输入电压并具备25V输出电压能力&#xff0c;利用内置肖特基二极管和功率开关&#xff0c;将外部电路减至最少&#xff0c;实现…...

2026年DevSecOps工具选型推荐:如何构建安全高效的研运体系

在2026年&#xff0c;软件交付的速度与质量安全已成为企业核心竞争力的关键。DevSecOps作为将安全能力左移并贯穿软件开发生命周期&#xff08;SDLC&#xff09;的实践方法论&#xff0c;其成功落地高度依赖于一套功能强大、易于集成且团队愿意采纳的工具链。面对市场上纷繁复杂…...

A-29P深度解析:100dB回音消除与AI降噪的硬件设计实战

摘要&#xff1a;在可视门禁、车载蓝牙、远程会议等设备中&#xff0c;结构空间狭小与高音量需求往往导致严重的回声和啸叫问题。本文基于A-29P纯模拟回音消除模块&#xff0c;深入解析其100dB消回音能力、AI降噪特性及7种硬件应用模式&#xff0c;为工程师提供一套无需代码的快…...

CodeWF Toolbox:一个用 Avalonia + Prism 做出来的开发者工具箱

今天这篇文章&#xff0c;站长来聊聊我自己开发的 CodeWF Toolbox&#xff0c;CodeWF 工具箱。熟悉我的朋友一般都叫我“站长”&#xff0c;因为我还有一个网站&#xff1a;CodeWF。这个工具箱也是围绕我平时写代码、维护网站、整理资料、排查问题时反复遇到的需求做出来的。它…...

日本租房成本核算沙盘

最近忙着租房子&#xff0c;日本租房不同于国内&#xff0c;有非常多杂乱的费用&#xff0c;这些都是必须在租房子的时候就考虑在内的&#xff0c;所以我制作了这个网站&#xff0c;希望能帮助到各位小伙伴。 目前已经部署在了服务器上&#xff0c;网址如下 http://8.130.68.…...

CHI协议WriteZero事务的DBIDResp与Comp响应机制解析

1. CHI协议中WriteZero事务的响应机制解析在AMBA 5 CHI协议中&#xff0c;WriteZero类事务&#xff08;包括WriteUniqueZero和WriteNoSnpZero&#xff09;的响应流程存在一个看似冗余的设计特点&#xff1a;它们会同时接收DBIDResp和Comp两种响应。这种现象常常让硬件设计工程师…...