tag:blogger.com,1999:blog-30625006191055199752026-01-31T01:38:43.513-08:00Programming for beginnersThis blog is primarily focus on Java fundamentals and the libraries built on top of Java programming language. Most of the post are example oriented, hope you have fun in reading my blog....:)Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]Blogger11258125tag:blogger.com,1999:blog-3062500619105519975.post-50060035306462282082025-12-22T06:00:00.000-08:002025-12-22T06:00:50.091-08:00Understanding AgenticScope in LangChain4j: How Agents Share and Collaborate<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When we build AI systems with multiple agents, it’s not enough for each agent to just do its job in isolation. Agents need to communicate and share information. For example, if one agent writes a poem, another agent might edit it, and yet another might convert it to uppercase. To make this collaboration possible, LangChain4j provides a mechanism called AgenticScope.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Think of AgenticScope as a shared notebook where agents can write down their results and read what others have written. It also keeps track of who did what and when, giving you a complete history of the conversation between agents.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is AgenticScope?</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">A shared environment where agents in the same system can store and read variables.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Helps agents collaborate by passing results between each other.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Keeps a record of all agent calls and responses so you can reconstruct the conversation later.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Imagine you and your friends are solving a puzzle together. Instead of shouting answers, you all write your findings in a shared notebook. Each friend can look at what’s already written, add new notes, or edit something. That’s what AgenticScope does for AI agents.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The AgenticScope Interface:</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">AgenticScope</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">writeState</span>(String<span style="color: #bbbbbb;"> </span>key,<span style="color: #bbbbbb;"> </span>Object<span style="color: #bbbbbb;"> </span>value);<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Add a piece of info</span> <span style="color: #bbbbbb;"> </span>Object<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">readState</span>(String<span style="color: #bbbbbb;"> </span>key);<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Get a piece of info</span> <span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">boolean</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">hasState</span>(String<span style="color: #bbbbbb;"> </span>key);<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Check if something exists</span> <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">state</span>();<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Get all shared info</span> <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">contextAsConversation</span>(String...<span style="color: #bbbbbb;"> </span>agents);<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// See conversation history</span> } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Think of writeState as writing in the notebook and readState as reading from it.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example in Action</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s say we have three agents:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poet: writes a poem about robots</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemEditor: polishes the poem</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemInUppercase: makes it all uppercase</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">We connect them in sequence using LangChain4j:</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>UntypedAgent<span style="color: #bbbbbb;"> </span>untypedAgent<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">sequenceBuilder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">subAgents</span>(poet,<span style="color: #bbbbbb;"> </span>poemEditor,<span style="color: #bbbbbb;"> </span>poemInUppercase) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"poemInCapitalLetters"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>input<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Map.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"theme"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Robots"</span>); <span style="color: #888888;">// Run the agents with AgenticScope</span> ResultWithAgenticScope<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>poem<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>untypedAgent.<span style="color: #0000cc;">invokeWithAgenticScope</span>(input); AgenticScope<span style="color: #bbbbbb;"> </span>agenticScope<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>poem.<span style="color: #0000cc;">agenticScope</span>(); <span style="color: #888888;">// Inspect shared state</span> Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>state<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>agenticScope.<span style="color: #0000cc;">state</span>(); System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(state); </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What Happens Behind the Scenes</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The Poet writes a poem about robots and saves it in the AgenticScope.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The PoemEditor reads that poem, edits it, and writes the new version back into the scope.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The PoemInUppercase reads the edited poem, makes it uppercase, and writes the result.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Finally, you can inspect the scope to see all intermediate steps as well as the final result.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Define Agents.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poet.java</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.Agent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.V</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Poet</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You are a poet.</span> <span style="background-color: #fff0f0;"> Write a short poem of no more than</span> <span style="background-color: #fff0f0;"> 4 lines about the given theme.</span> <span style="background-color: #fff0f0;"> Return only the poem and nothing else.</span> <span style="background-color: #fff0f0;"> The theme is {{theme}}.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(description<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>,<span style="color: #bbbbbb;"> </span>name<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Poet"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"theme"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>theme); } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemEditor.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.Agent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.V</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">PoemEditor</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You are a professional Poem Editor.</span> <span style="background-color: #fff0f0;"> Analyze and rewrite the following {{poem}} to better align</span> <span style="background-color: #fff0f0;"> with the target theme of {{theme}}.</span> <span style="background-color: #fff0f0;"> Return only the poem and nothing else.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(description<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>,<span style="color: #bbbbbb;"> </span>name<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Poet"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"poem"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>poemToEdit,<span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"theme"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>targetTheme); } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemInUppercase.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.Agent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.V</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">PoemInUppercase</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Return only the following {{editedPoem}} in uppercase and nothing else.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(description<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Convert the Poem to Uppercase"</span>,<span style="color: #bbbbbb;"> </span>name<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"PoemInUppercase"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"editedPoem"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>poem); } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Define AgenticScopeDemo class.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">AgenticScopeDemo.java</span></b></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.workflows</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.PoemEditor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.PoemInUppercase</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.Poet</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.AgenticServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.UntypedAgent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.scope.AgenticScope</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.scope.ResultWithAgenticScope</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">AgenticScopeDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Poet<span style="color: #bbbbbb;"> </span>poet<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(Poet.<span style="color: #0000cc;">class</span>).<span style="color: #0000cc;">chatModel</span>(chatModel).<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"poem"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>PoemEditor<span style="color: #bbbbbb;"> </span>poemEditor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(PoemEditor.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"editedPoem"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>PoemInUppercase<span style="color: #bbbbbb;"> </span>poemInUppercase<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(PoemInUppercase.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"poemInCapitalLetters"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>UntypedAgent<span style="color: #bbbbbb;"> </span>untypedAgent<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">sequenceBuilder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">subAgents</span>(poet,<span style="color: #bbbbbb;"> </span>poemEditor,<span style="color: #bbbbbb;"> </span>poemInUppercase) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"poemInCapitalLetters"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>input<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Map.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"theme"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Robots"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"----------------------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>ResultWithAgenticScope<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>poem<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>untypedAgent.<span style="color: #0000cc;">invokeWithAgenticScope</span>(input); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(poem.<span style="color: #0000cc;">result</span>()); <span style="color: #bbbbbb;"> </span> <span style="color: #bbbbbb;"> </span>AgenticScope<span style="color: #bbbbbb;"> </span>agenticScope<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>poem.<span style="color: #0000cc;">agenticScope</span>(); <span style="color: #bbbbbb;"> </span> <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>state<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>agenticScope.<span style="color: #0000cc;">state</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span>(String<span style="color: #bbbbbb;"> </span>key:<span style="color: #bbbbbb;"> </span>state.<span style="color: #0000cc;">keySet</span>())<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\t"</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>key<span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">" = "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>state.<span style="color: #0000cc;">get</span>(key).<span style="color: #0000cc;">toString</span>().<span style="color: #0000cc;">replace</span>(<span style="background-color: #fff0f0;">"\n"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">" "</span>)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\n----------------------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>poem<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>untypedAgent.<span style="color: #0000cc;">invokeWithAgenticScope</span>(input); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(poem.<span style="color: #0000cc;">result</span>()); <span style="color: #bbbbbb;"> </span>agenticScope<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>poem.<span style="color: #0000cc;">agenticScope</span>(); <span style="color: #bbbbbb;"> </span>state<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>agenticScope.<span style="color: #0000cc;">state</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span>(String<span style="color: #bbbbbb;"> </span>key:<span style="color: #bbbbbb;"> </span>state.<span style="color: #0000cc;">keySet</span>())<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\t"</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>key<span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">" = "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>state.<span style="color: #0000cc;">get</span>(key).<span style="color: #0000cc;">toString</span>().<span style="color: #0000cc;">replace</span>(<span style="background-color: #fff0f0;">"\n"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">" "</span>)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p>&nbsp; </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>METAL HEARTS THAT BEAT WITH STONE, CIRCUIT HUM, A MECHANICAL TONE, GEARS SHIFT SMOOTH, WITH CALCULATED MIGHT, FORGED FROM CODE, IN DIGITAL LIGHT. theme = Robots poem = Metal hearts that beat with stone, Their electronic eyes shine like moan, Rustic limbs that move with precision cold, Forged from wires, souls grown old. editedPoem = Metal hearts that beat with stone, Circuits hum, a mechanical tone, Gears shift smooth, with calculated might, Forged from code, in digital light. poemInCapitalLetters = METAL HEARTS THAT BEAT WITH STONE, CIRCUIT HUM, A MECHANICAL TONE, GEARS SHIFT SMOOTH, WITH CALCULATED MIGHT, FORGED FROM CODE, IN DIGITAL LIGHT. ---------------------------------------------------------- WHIRRING MINDS WITH LOGIC'S STEADY PACE, THEY RISE FROM WIRES, A MECHANICAL THRONE, ECHOES OF CODE, IN METALLIC BONE. theme = Robots poem = Metal hearts that beat in time, Whirring souls with calculating mind, They rise from dust, a synthetic reign, Echoes of man, in artificial frame. editedPoem = Metal hearts that beat in digital space, Whirring minds with logic's steady pace, They rise from wires, a mechanical throne, Echoes of code, in metallic bone. poemInCapitalLetters = WHIRRING MINDS WITH LOGIC'S STEADY PACE, THEY RISE FROM WIRES, A MECHANICAL THRONE, ECHOES OF CODE, IN METALLIC BONE. </pre></div> <p>&nbsp;</p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/sequential-workflow-in-genai-building.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/sequential-workflow-in-genai-building.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-68254559157165060852025-12-22T05:55:00.000-08:002025-12-22T06:01:16.212-08:00Sequential Workflow in GenAI: Building Step-by-Step Agent Pipelines<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When working with Generative AI (GenAI) applications, tasks are often broken into multiple steps. Instead of asking a single agent to handle everything at once, you can chain smaller, focused agents together. This chaining forms a sequential workflow, a simple but powerful pattern where each agent’s output is passed as input to the next agent, like links in a chain.</span></p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This approach makes the system easier to design, debug, and extend. For beginners, sequential workflows are the best place to start before moving into more advanced workflow patterns like branching or parallel execution.</span></p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimrjqneWQXrCaA_lpNh5WKYyg-vOlWQnYvW0ei0eoa0sP5KC6ruc6MIGQ2mTQEErj_4FgwYOFv_J2wW5HpScmwp5TwJXRRlocKhuNUkitl2-78dHHbFv5ktL6twOjZfzWB7TF5chNG0x8vBmHUjNYTouTZTbBh79yc71isE0Ov_T4nFkHVan6fCz5qD4U/s880/sequential%20workflow%20agent.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="176" data-original-width="880" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimrjqneWQXrCaA_lpNh5WKYyg-vOlWQnYvW0ei0eoa0sP5KC6ruc6MIGQ2mTQEErj_4FgwYOFv_J2wW5HpScmwp5TwJXRRlocKhuNUkitl2-78dHHbFv5ktL6twOjZfzWB7TF5chNG0x8vBmHUjNYTouTZTbBh79yc71isE0Ov_T4nFkHVan6fCz5qD4U/w640-h128/sequential%20workflow%20agent.png" width="640" /></a></div><br /><p></p><p class="MsoNormal"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is a Sequential Workflow?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">A sequential workflow is a pipeline of agents, executed in order.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each agent performs one clear task.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The output of one agent becomes the input to the next.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The flow continues until the final output is ready.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Think of it like a factory assembly line, where each worker (agent) does their part, and the product (data) moves to the next worker until it’s finished.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let's understand this with an example.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Let's define three agents.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poet.java</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.Agent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.V</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Poet</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You are a poet.</span> <span style="background-color: #fff0f0;"> Write a short poem of no more than</span> <span style="background-color: #fff0f0;"> 4 lines about the given theme.</span> <span style="background-color: #fff0f0;"> Return only the poem and nothing else.</span> <span style="background-color: #fff0f0;"> The theme is {{theme}}.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(description<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>,<span style="color: #bbbbbb;"> </span>name<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Poet"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"theme"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>theme); } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemEditor.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.Agent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.V</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">PoemEditor</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>(<span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You are a professional Poem Editor.</span> <span style="background-color: #fff0f0;"> Analyze and rewrite the following {{poem}} to better align</span> <span style="background-color: #fff0f0;"> with the target theme of {{theme}}.</span> <span style="background-color: #fff0f0;"> Return only the poem and nothing else.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(description<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>,<span style="color: #bbbbbb;"> </span>name<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Poet"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"poem"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>poemToEdit,<span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"theme"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>targetTheme); } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemInUppercase.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.Agent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.V</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">PoemInUppercase</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>(<span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Return the following {{editedPoem}} in uppercase and nothing else.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(description<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Convert the Poem to Uppercase"</span>,<span style="color: #bbbbbb;"> </span>name<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"PoemInUppercase"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"editedPoem"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>poem); } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Let's combine these three agents, where the output of the Poet is passed as input to the PoemEditor, and the output of PoemEditor is passed as input to the PoemInUppercase, and the final output is the edited poem in uppercase.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">SequentialWorkflow.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.workflows</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.PoemEditor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.PoemInUppercase</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.Poet</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.AgenticServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.UntypedAgent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">SequentialWorkflow</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Poet<span style="color: #bbbbbb;"> </span>poet<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(Poet.<span style="color: #0000cc;">class</span>).<span style="color: #0000cc;">chatModel</span>(chatModel).<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"poem"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>PoemEditor<span style="color: #bbbbbb;"> </span>poemEditor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(PoemEditor.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"editedPoem"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>PoemInUppercase<span style="color: #bbbbbb;"> </span>poemInUppercase<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(PoemInUppercase.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"poemInCapitalLetters"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>UntypedAgent<span style="color: #bbbbbb;"> </span>untypedAgent<span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">sequenceBuilder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">subAgents</span>(poet,<span style="color: #bbbbbb;"> </span>poemEditor,<span style="color: #bbbbbb;"> </span>poemInUppercase) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">outputName</span>(<span style="background-color: #fff0f0;">"poemInCapitalLetters"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>input<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Map.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"theme"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Robots"</span>); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>poem<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>(String)<span style="color: #bbbbbb;"> </span>untypedAgent.<span style="color: #0000cc;">invoke</span>(input); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(poem); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The workflow can be visualized like below.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWsmnYksZyErsjvfr2NoV6aNZ1GZtmwx9PjSBSyN85OLinx1rAoufZIrzTjIW2WdPGw7UxS-jQQrOLEcJPLGqauPvK7XVfykk96n7hcCeVEndJoeN5_owrZYykTsb8lOE5C17mIW_RrKTis4sXB3IrkP3Ns6AWuGFCbV0BbR16W1s4vOfwNO2MTXqh-AU/s904/sequential%20workflow%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="182" data-original-width="904" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWsmnYksZyErsjvfr2NoV6aNZ1GZtmwx9PjSBSyN85OLinx1rAoufZIrzTjIW2WdPGw7UxS-jQQrOLEcJPLGqauPvK7XVfykk96n7hcCeVEndJoeN5_owrZYykTsb8lOE5C17mIW_RrKTis4sXB3IrkP3Ns6AWuGFCbV0BbR16W1s4vOfwNO2MTXqh-AU/w640-h128/sequential%20workflow%202.png" width="640" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>METAL HEARTS BEAT WITH COLD DESIGN, GEARS TICK ON, ELECTRONIC MIND, IN METALLIC FLESH, NO HEARTBEAT'S FOUND, A SYNTHETIC HEART BEATS ALONE, PROFOUND. </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">We defined three agents in our workflow:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poet</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemEditor</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemInUppercase</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The Poet agent takes a theme as input and generates a poem related to that theme.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The PoemEditor agent receives both the theme and the poem generated by the Poet agent, then refines it and returns the result as editedPoem.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The PoemInUppercase agent takes the editedPoem as input and transforms it into uppercase text. The final output is stored in the variable poemInCapitalLetters.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/getting-started-with-agents-in.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/understanding-agenticscope-in.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-29381603039319855092025-12-22T05:50:00.000-08:002025-12-22T05:56:11.341-08:00Getting Started with Agents in LangChain4j<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When working with Large Language Models (LLMs), you often want them to act like “specialists” that can perform a well-defined task, whether it’s writing a poem, summarizing a document, or answering a customer’s question.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In LangChain4j, these specialists are called agents. An agent is simply an interface that defines a task and lets the LLM perform it. The magic comes from how simple it is to define and connect an agent to your system.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is an Agent?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">An agent in LangChain4j is a component that:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Performs a specific task using an LLM.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Is defined as a Java interface.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Uses special annotations like @Agent and @UserMessage to describe its purpose and instructions.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Think of an agent as a helper bot with a clear job description.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example: A Poet Agent</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here’s a simple agent that writes poems:</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Poet</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>(<span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You are a poet.</span> <span style="background-color: #fff0f0;"> Write a short poem of no more than</span> <span style="background-color: #fff0f0;"> 4 lines about the given theme.</span> <span style="background-color: #fff0f0;"> Return only the poem and nothing else.</span> <span style="background-color: #fff0f0;"> The theme is {{theme}}.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(<span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"theme"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>theme); } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here:</span></p> <p class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">@UserMessage: Defines what instructions the LLM should follow.</span></p> <p class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">@Agent: Declares this as an agent and gives it a description.</span></p> <p class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Method Parameter @V("theme"): Passes the theme (like "friendship" or "nature") into the message template.</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">So, when you call generatePoem("friendship"), the agent will ask the LLM to produce a short poem about friendship.</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why Provide a Description?</span></b></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The description tells other agents or systems what this agent does. This is especially useful in multi-agent systems, where several agents collaborate. You can even supply the description about the agent while constructing an Agent object using AgenticServices.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Poet<span style="color: #bbbbbb;"> </span>poet<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(Poet.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">description</span>(<span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div><p class="MsoNormal"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Naming Your Agent</span></b></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Every agent should have a unique name in the system. This can be set in two ways:</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In the @Agent annotation.</span></p> <p class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Programmatically, using .name("Poet") when building the agent.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Poet<span style="color: #bbbbbb;"> </span>poet<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(Poet.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">description</span>(<span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">name</span>(<span style="background-color: #fff0f0;">"Poet"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">If you don’t set a name, LangChain4j uses the method name (generatePoem) as the agent’s name.</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Poet.java</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.Agent</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.V</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">Poet</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@UserMessage</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You are a poet.</span> <span style="background-color: #fff0f0;"> Write a short poem of no more than</span> <span style="background-color: #fff0f0;"> 4 lines about the given theme.</span> <span style="background-color: #fff0f0;"> Return only the poem and nothing else.</span> <span style="background-color: #fff0f0;"> The theme is {{theme}}.</span> <span style="background-color: #fff0f0;"> """</span>) <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Agent</span>(description<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Generates a short poem based on the given theme"</span>,<span style="color: #bbbbbb;"> </span>name<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Poet"</span>) <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">generatePoem</span>(<span style="color: #555555; font-weight: bold;">@V</span>(<span style="background-color: #fff0f0;">"theme"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>theme); } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNormal"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">AgentHelloWorld.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.agents.Poet</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.agentic.AgenticServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">AgentHelloWorld</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Poet<span style="color: #bbbbbb;"> </span>poet<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>AgenticServices.<span style="color: #0000cc;">agentBuilder</span>(Poet.<span style="color: #0000cc;">class</span>).<span style="color: #0000cc;">chatModel</span>(chatModel).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>poem<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>poet.<span style="color: #0000cc;">generatePoem</span>(<span style="background-color: #fff0f0;">"nature"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(poem); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNormal"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Golden sunsets fade to blue, Nature's canvas, painted anew. Trees stand tall, their leaves rustle free, A symphony for you and me. </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/enhancing-llm-observability-with.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/sequential-workflow-in-genai-building.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-24427602485749024082025-12-22T05:45:00.000-08:002025-12-22T05:50:49.893-08:00Enhancing LLM Observability with Langchain4j: Tracking Requests, Responses, and Errors with ChatModelListener<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In the world of AI-driven applications, visibility into what’s happening inside your language model interactions is important for debugging, monitoring, and optimizing performance. Langchain4j provides powerful observability hooks for this purpose, especially using ChatModelListener with supported ChatModel and StreamingChatModel implementations.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, we’ll explore how you can use Langchain4j's observability features to gain insights into requests sent to the LLM, responses received, and any errors that occur during processing. </span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why Observability Matters in LLM Applications</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Debugging unpredictable LLM behavior</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Monitoring model usage and performance</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Capturing token usage for billing insights</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Tracking errors systematically</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Understanding the Events</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Langchain4j captures events aligned with OpenTelemetry's Generative AI Semantic Conventions:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Request Attributes: messages, model, temperature, top_p, max_tokens, tools, response_format, etc.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Response Attributes: assistant_message, id, model, token_usage, finish_reason, etc.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Error Attributes: Exception details, stack trace, model info, etc.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Introduction to ChatModelListener interface</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The ChatModelListener interface is part of the LangChain4j framework and provides a way to observe and react to events that occur during interactions with a ChatModel. This is particularly useful for logging, debugging, monitoring, or tracing interactions with Language Models (LLMs).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ChatModelListener listener interface designed to hook into three key lifecycle events of a language model request:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Before the request is sent to the LLM (onRequest)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">After the response is received from the LLM (onResponse)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">If an error occurs during processing (onError)</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">It provides access to rich context objects for each of these events, enabling detailed introspection and observability.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatModelListener</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">default</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">onRequest</span>(ChatModelRequestContext<span style="color: #bbbbbb;"> </span>requestContext)<span style="color: #bbbbbb;"> </span>{} <span style="color: #bbbbbb;"> </span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">default</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">onResponse</span>(ChatModelResponseContext<span style="color: #bbbbbb;"> </span>responseContext)<span style="color: #bbbbbb;"> </span>{} <span style="color: #bbbbbb;"> </span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">default</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">onError</span>(ChatModelErrorContext<span style="color: #bbbbbb;"> </span>errorContext)<span style="color: #bbbbbb;"> </span>{} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">onRequest(ChatModelRequestContext requestContext)</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Called before the request is sent to the model. It lets you inspect the ChatRequest, including Messages, Model name and Parameters like temperature, top-k, max tokens, etc.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">onResponse(ChatModelResponseContext responseContext)</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Called after a successful response is received from the LLM. It allows you to access the generated AiMessage, Metadata (model used, finish reason, token usage), the original ChatRequest, and any attributes set earlier.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">onError(ChatModelErrorContext errorContext)</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Called when an exception occurs during model interaction. It provides access to the thrown Throwable, the original ChatRequest etc.,</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ChatModelListenerDemo.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.observability</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.ChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.listener.ChatModelErrorContext</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.listener.ChatModelListener</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.listener.ChatModelRequestContext</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.listener.ChatModelResponseContext</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.request.ChatRequest</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.request.ChatRequestParameters</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.response.ChatResponse</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.response.ChatResponseMetadata</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.output.TokenUsage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ChatModelListenerDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>ChatModelListener<span style="color: #bbbbbb;"> </span>listener<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>createListener(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>ChatModelListener<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">createListener</span>()<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">return</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ChatModelListener()<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Override</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">onRequest</span>(ChatModelRequestContext<span style="color: #bbbbbb;"> </span>requestContext)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\n--- LLM REQUEST ---"</span>); <span style="color: #bbbbbb;"> </span>ChatRequest<span style="color: #bbbbbb;"> </span>request<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>requestContext.<span style="color: #0000cc;">chatRequest</span>(); <span style="color: #bbbbbb;"> </span>ChatRequestParameters<span style="color: #bbbbbb;"> </span>params<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>request.<span style="color: #0000cc;">parameters</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Messages:"</span>); <span style="color: #bbbbbb;"> </span>request.<span style="color: #0000cc;">messages</span>().<span style="color: #0000cc;">forEach</span>(msg<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>msg)); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Request Parameters:"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Model: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">modelName</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Temperature: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">temperature</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Top P: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">topP</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Top K: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">topK</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Frequency Penalty: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">frequencyPenalty</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Presence Penalty: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">presencePenalty</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Max Output Tokens: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">maxOutputTokens</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Stop Sequences: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">stopSequences</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Tool Specifications: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">toolSpecifications</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Tool Choice: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">toolChoice</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Response Format: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>params.<span style="color: #0000cc;">responseFormat</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Model Provider: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>requestContext.<span style="color: #0000cc;">modelProvider</span>()); <span style="color: #bbbbbb;"> </span>requestContext.<span style="color: #0000cc;">attributes</span>().<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"my-attribute"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"my-value"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Override</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">onResponse</span>(ChatModelResponseContext<span style="color: #bbbbbb;"> </span>responseContext)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\n--- LLM RESPONSE ---"</span>); <span style="color: #bbbbbb;"> </span>ChatResponse<span style="color: #bbbbbb;"> </span>response<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>responseContext.<span style="color: #0000cc;">chatResponse</span>(); <span style="color: #bbbbbb;"> </span>ChatResponseMetadata<span style="color: #bbbbbb;"> </span>metadata<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>response.<span style="color: #0000cc;">metadata</span>(); <span style="color: #bbbbbb;"> </span>TokenUsage<span style="color: #bbbbbb;"> </span>tokenUsage<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>metadata.<span style="color: #0000cc;">tokenUsage</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Assistant Message: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>response.<span style="color: #0000cc;">aiMessage</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Response Metadata:"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" ID: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>metadata.<span style="color: #0000cc;">id</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Model: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>metadata.<span style="color: #0000cc;">modelName</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Finish Reason: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>metadata.<span style="color: #0000cc;">finishReason</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Token Usage:"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Input Tokens: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>tokenUsage.<span style="color: #0000cc;">inputTokenCount</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Output Tokens: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>tokenUsage.<span style="color: #0000cc;">outputTokenCount</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" Total Tokens: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>tokenUsage.<span style="color: #0000cc;">totalTokenCount</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Original Request: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>responseContext.<span style="color: #0000cc;">chatRequest</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Model Provider: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>responseContext.<span style="color: #0000cc;">modelProvider</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Custom Attributes:"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" my-attribute: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>responseContext.<span style="color: #0000cc;">attributes</span>().<span style="color: #0000cc;">get</span>(<span style="background-color: #fff0f0;">"my-attribute"</span>)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Override</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">onError</span>(ChatModelErrorContext<span style="color: #bbbbbb;"> </span>errorContext)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\n--- LLM ERROR ---"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Exception:"</span>); <span style="color: #bbbbbb;"> </span>errorContext.<span style="color: #0000cc;">error</span>().<span style="color: #0000cc;">printStackTrace</span>(System.<span style="color: #0000cc;">out</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Related Request: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>errorContext.<span style="color: #0000cc;">chatRequest</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Model Provider: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>errorContext.<span style="color: #0000cc;">modelProvider</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Custom Attributes:"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">" my-attribute: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>errorContext.<span style="color: #0000cc;">attributes</span>().<span style="color: #0000cc;">get</span>(<span style="background-color: #fff0f0;">"my-attribute"</span>)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>}; <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create the Ollama model with listener</span> <span style="color: #bbbbbb;"> </span>ChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">listeners</span>(List.<span style="color: #0000cc;">of</span>(listener)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Build the request</span> <span style="color: #bbbbbb;"> </span>ChatRequest<span style="color: #bbbbbb;"> </span>chatRequest<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>ChatRequest.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">messages</span>( <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span>UserMessage.<span style="color: #0000cc;">from</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"What are the benefits of using AI in education, just explain in 2 lines?"</span>))) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">temperature</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxOutputTokens</span>(<span style="color: #0000dd; font-weight: bold;">200</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Get response</span> <span style="color: #bbbbbb;"> </span>ChatResponse<span style="color: #bbbbbb;"> </span>response<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatModel.<span style="color: #0000cc;">chat</span>(chatRequest); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Print final AI output</span> <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\nFinal AI Response: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>response.<span style="color: #0000cc;">aiMessage</span>()); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>SLF4J(W): No SLF4J providers were found. SLF4J(W): Defaulting to no-operation (NOP) logger implementation SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. --- LLM REQUEST --- Messages: UserMessage { name = null contents = [TextContent { text = "What are the benefits of using AI in education, just explain in 2 lines?" }] } Request Parameters: Model: llama3.2 Temperature: 0.7 Top P: null Top K: null Frequency Penalty: null Presence Penalty: null Max Output Tokens: 200 Stop Sequences: [] Tool Specifications: [] Tool Choice: null Response Format: null Model Provider: OLLAMA --- LLM RESPONSE --- Assistant Message: AiMessage { text = "The use of AI in education offers several benefits, including personalized learning experiences, improved student engagement, and enhanced academic performance. Additionally, AI can automate administrative tasks, freeing up educators to focus on more hands-on teaching and mentoring roles." toolExecutionRequests = [] } Response Metadata: ID: null Model: llama3.2 Finish Reason: STOP Token Usage: Input Tokens: 42 Output Tokens: 47 Total Tokens: 89 Original Request: ChatRequest { messages = [UserMessage { name = null contents = [TextContent { text = "What are the benefits of using AI in education, just explain in 2 lines?" }] }], parameters = OllamaChatRequestParameters{modelName="llama3.2", temperature=0.7, topP=null, topK=null, frequencyPenalty=null, presencePenalty=null, maxOutputTokens=200, stopSequences=[], toolSpecifications=[], toolChoice=null, responseFormat=null, mirostat=null, mirostatEta=null, mirostatTau=null, numCtx=null, repeatLastN=null, repeatPenalty=null, seed=null, minP=null, keepAlive=null} } Model Provider: OLLAMA Custom Attributes: my-attribute: my-value Final AI Response: AiMessage { text = "The use of AI in education offers several benefits, including personalized learning experiences, improved student engagement, and enhanced academic performance. Additionally, AI can automate administrative tasks, freeing up educators to focus on more hands-on teaching and mentoring roles." toolExecutionRequests = [] } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><br /></p><p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/extracting-structured-java-objects-from.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/getting-started-with-agents-in.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-60334856877223840142025-12-22T05:43:00.000-08:002025-12-22T05:46:56.256-08:00Extracting Structured Java Objects from Unstructured Text Using LLMs and JSON Schema<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In modern Java applications, integrating LLMs (Large Language Models) opens up powerful ways to extract insights from unstructured text. However, one major problem remains, how do we reliably convert these natural language outputs into well-typed Java objects?</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, we’ll explore how to guide LLMs to return structured JSON that maps directly to Java records or classes using JSON Schema.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why Structured Output from LLMs Matters?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LLMs are great at generating human-like text, but applications often require structured, machine parseable formats like JSON. By using structured output capabilities of LLM providers, we can:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Avoid fragile regex or prompt parsing.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Automatically map outputs into Java objects.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Enhance validation and error handling via schema enforcement.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Defining Our Java Model</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s say we want to extract the following data from a paragraph of text:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">public record Employee(String name, int age, double height, boolean married) {}</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Now, here’s an example of the unstructured input text:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Alice is 30 years old and leads a vibrant lifestyle.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">She is 1.65 meters tall and always brings energy into any room.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Though married, she balances her family life with an active professional career.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Our goal is to extract a valid Employee record from this.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step-by-Step Integration Using JSON Schema</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Define the JSON Schema for the Output</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The schema clearly defines the required structure for the LLM output:</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>JsonObjectSchema<span style="color: #bbbbbb;"> </span>employeeSchema<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>JsonObjectSchema.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">addStringProperty</span>(<span style="background-color: #fff0f0;">"name"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">addIntegerProperty</span>(<span style="background-color: #fff0f0;">"age"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">addNumberProperty</span>(<span style="background-color: #fff0f0;">"height"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">addBooleanProperty</span>(<span style="background-color: #fff0f0;">"married"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">required</span>(<span style="background-color: #fff0f0;">"name"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"age"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"height"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"married"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Build the Response Format</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Using the schema, create a ResponseFormat that instructs the LLM to respond with JSON conforming to our Employee record:</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>ResponseFormat<span style="color: #bbbbbb;"> </span>responseFormat<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>ResponseFormat.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">type</span>(ResponseFormatType.<span style="color: #0000cc;">JSON</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">jsonSchema</span>(JsonSchema.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">name</span>(<span style="background-color: #fff0f0;">"Employee"</span>).<span style="color: #0000cc;">rootElement</span>(employeeSchema).<span style="color: #0000cc;">build</span>()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 3:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Provide the Input Message</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>UserMessage<span style="color: #bbbbbb;"> </span>userMessage<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>UserMessage.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Alice is 30 years old and leads a vibrant lifestyle.</span> <span style="background-color: #fff0f0;"> She is 1.65 meters tall and always brings energy into any room.</span> <span style="background-color: #fff0f0;"> Though married, she balances her family life with an active professional career.</span> <span style="background-color: #fff0f0;">"""</span>); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 4:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Construct and Send the Chat Request</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>ChatRequest<span style="color: #bbbbbb;"> </span>chatRequest<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>ChatRequest.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">responseFormat</span>(responseFormat) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">messages</span>(userMessage) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); ChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); ChatResponse<span style="color: #bbbbbb;"> </span>chatResponse<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatModel.<span style="color: #0000cc;">chat</span>(chatRequest); </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Employee.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.dto</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">record</span> <span style="color: #bb0066; font-weight: bold;">Employee</span>(String<span style="color: #bbbbbb;"> </span>name,<span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #bbbbbb;"> </span>age,<span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">double</span><span style="color: #bbbbbb;"> </span>height,<span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">boolean</span><span style="color: #bbbbbb;"> </span>married)<span style="color: #bbbbbb;"> </span>{ } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">JsonSchemaDemo.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.structured.responses</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.fasterxml.jackson.core.JsonProcessingException</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.fasterxml.jackson.databind.JsonMappingException</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.fasterxml.jackson.databind.ObjectMapper</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.dto.Employee</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.ChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.request.ChatRequest</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.request.ResponseFormat</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.request.ResponseFormatType</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.request.json.JsonObjectSchema</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.request.json.JsonSchema</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.chat.response.ChatResponse</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">JsonSchemaDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">throws</span><span style="color: #bbbbbb;"> </span>JsonMappingException,<span style="color: #bbbbbb;"> </span>JsonProcessingException<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>JsonObjectSchema<span style="color: #bbbbbb;"> </span>employeeSchema<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>JsonObjectSchema.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">addStringProperty</span>(<span style="background-color: #fff0f0;">"name"</span>).<span style="color: #0000cc;">addIntegerProperty</span>(<span style="background-color: #fff0f0;">"age"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">addNumberProperty</span>(<span style="background-color: #fff0f0;">"height"</span>).<span style="color: #0000cc;">addBooleanProperty</span>(<span style="background-color: #fff0f0;">"married"</span>).<span style="color: #0000cc;">required</span>(<span style="background-color: #fff0f0;">"name"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"age"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"height"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"married"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ResponseFormat<span style="color: #bbbbbb;"> </span>responseFormat<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>ResponseFormat.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">type</span>(ResponseFormatType.<span style="color: #0000cc;">JSON</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">jsonSchema</span>(JsonSchema.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">name</span>(<span style="background-color: #fff0f0;">"Employee"</span>).<span style="color: #0000cc;">rootElement</span>(employeeSchema).<span style="color: #0000cc;">build</span>()).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create a new user message with a different username and message</span> <span style="color: #bbbbbb;"> </span>UserMessage<span style="color: #bbbbbb;"> </span>userMessage<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>UserMessage.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Alice is 30 years old and leads a vibrant lifestyle.</span> <span style="background-color: #fff0f0;"> She is 1.65 meters tall and always brings energy into any room.</span> <span style="background-color: #fff0f0;"> Though married, she balances her family life with an active professional career.</span> <span style="background-color: #fff0f0;"> """</span>); <span style="color: #bbbbbb;"> </span>ChatRequest<span style="color: #bbbbbb;"> </span>chatRequest<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>ChatRequest.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">responseFormat</span>(responseFormat).<span style="color: #0000cc;">messages</span>(userMessage).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ChatResponse<span style="color: #bbbbbb;"> </span>chatResponse<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatModel.<span style="color: #0000cc;">chat</span>(chatRequest); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>output<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatResponse.<span style="color: #0000cc;">aiMessage</span>().<span style="color: #0000cc;">text</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(output); <span style="color: #bbbbbb;"> </span>Employee<span style="color: #bbbbbb;"> </span>person<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ObjectMapper().<span style="color: #0000cc;">readValue</span>(output,<span style="color: #bbbbbb;"> </span>Employee.<span style="color: #0000cc;">class</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(person); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ "name": "Alice", "age": 30, "height": 1.65, "married": true } Employee[name=Alice, age=30, height=1.65, married=true] </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">If a large language model (LLM) does not produce the expected output, you can provide additional guidance by annotating classes and fields with @Description. These annotations help clarify the intent and format of the data for the LLM. For example.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #555555; font-weight: bold;">@Description</span>(<span style="background-color: #fff0f0;">"An Employee"</span>) <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">record</span> <span style="color: #bb0066; font-weight: bold;">Employee</span>( <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Description</span>(<span style="background-color: #fff0f0;">"Employee's full name, e.g., 'Krishna'"</span>)<span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>name, <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Description</span>(<span style="background-color: #fff0f0;">"Employee's age, e.g., 42"</span>)<span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #bbbbbb;"> </span>age, <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Description</span>(<span style="background-color: #fff0f0;">"Employee's height in meters, e.g., 1.78"</span>)<span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">double</span><span style="color: #bbbbbb;"> </span>height, <span style="color: #bbbbbb;"> </span><span style="color: #555555; font-weight: bold;">@Description</span>(<span style="background-color: #fff0f0;">"Whether the employee is married, e.g., false"</span>)<span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">boolean</span><span style="color: #bbbbbb;"> </span>married )<span style="color: #bbbbbb;"> </span>{} </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This approach allows you to supply meaningful context and examples, improving the LLM's understanding and output accuracy.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><br /></p><p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/enhancing-ai-responses-with.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/enhancing-llm-observability-with.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-83071134637599624942025-12-22T05:37:00.000-08:002025-12-22T05:43:41.849-08:00Enhancing AI Responses with LangChain4j’s ContentInjector<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In any Retrieval-Augmented Generation (RAG) setup, once you’ve retrieved the most relevant content using tools like ContentRetriever and merged them using a ContentAggregator, the final step before generating a response is injecting that content into the actual user query. LangChain4j handles this using a component called the ContentInjector.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, we’ll look specifically at the DefaultContentInjector, the standard implementation of ContentInjector and understand how it works with templates, metadata, and more.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is a ContentInjector?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The ContentInjector is responsible for inserting the aggregated content into the user’s original message. This helps the AI give a better answer by using information from documents or other sources.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In LangChain4j, you can plug in your own implementation or use the built-in DefaultContentInjector.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How DefaultContentInjector Works?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The DefaultContentInjector appends the retrieved content to the user’s query using a predefined prompt template. Here’s the default prompt structure used:</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">final</span><span style="color: #bbbbbb;"> </span>PromptTemplate<span style="color: #bbbbbb;"> </span>DEFAULT_PROMPT_TEMPLATE<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>PromptTemplate.<span style="color: #0000cc;">from</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> {{userMessage}}</span> <span style="background-color: #fff0f0;"> Answer using the following information:</span> <span style="background-color: #fff0f0;"> {{contents}}"""</span> ); </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This means:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The user's original question ({{userMessage}}) appears at the top.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The AI is explicitly instructed to answer using the provided {{contents}}.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The injected content comes from the ContentAggregator, which combines results from one or more retrievers.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKpkkSsdrEZPnzyx1gguNf0M8zsJLHvTX1IoaE1XMYavJDmm9XFdhZj2Ey0Grqwimex7fNrbhjcPaXUloeUi44oW0nA9VMFwc15z5odWgtmH505k0_W8vdJEctXIg70lDQ3V07IvfdwlKDkFRTj4JY8FTvbS5J2xwvZ_8IM8lLoAdyrH0CPgjN4qE4BlI/s1396/content%20injector.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1396" data-original-width="532" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKpkkSsdrEZPnzyx1gguNf0M8zsJLHvTX1IoaE1XMYavJDmm9XFdhZj2Ey0Grqwimex7fNrbhjcPaXUloeUi44oW0nA9VMFwc15z5odWgtmH505k0_W8vdJEctXIg70lDQ3V07IvfdwlKDkFRTj4JY8FTvbS5J2xwvZ_8IM8lLoAdyrH0CPgjN4qE4BlI/w153-h400/content%20injector.png" width="153" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Including Metadata for More Transparency</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">One powerful feature of DefaultContentInjector is metadata injection. Suppose your content pieces have metadata (like source, author, or documentId); you can choose to include them in the final prompt.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here’s how you can configure it:</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>DefaultContentInjector.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">metadataKeysToInclude</span>(List.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"author"</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">With this setup, the author metadata (e.g., document name or URL) will be included in the injected content, making the AI’s responses more auditable and transparent.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContentInjectorDemo.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.contentinjector</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Metadata</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.ChatMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.Content</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.injector.DefaultContentInjector</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ContentInjectorDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 1: Create a sample UserMessage</span> <span style="color: #bbbbbb;"> </span>UserMessage<span style="color: #bbbbbb;"> </span>userMessage<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>UserMessage.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"What are the HR policies?"</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 2: Create sample contents with text segments and metadata</span> <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>metadata<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(Map.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Company portal"</span>)); <span style="color: #bbbbbb;"> </span>Content<span style="color: #bbbbbb;"> </span>content1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>( <span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Our HR policies include flexible work hours, medical leave, and onboarding support."</span>, <span style="color: #bbbbbb;"> </span>metadata)); <span style="color: #bbbbbb;"> </span>Content<span style="color: #bbbbbb;"> </span>content2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>( <span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"You can check your leave balance and benefits on the HR portal."</span>)); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>contents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>(content1,<span style="color: #bbbbbb;"> </span>content2); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 3: Create a DefaultContentInjector with metadata keys to include</span> <span style="color: #bbbbbb;"> </span>DefaultContentInjector<span style="color: #bbbbbb;"> </span>contentInjector<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultContentInjector.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">metadataKeysToInclude</span>(List.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"source"</span>)).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 4: Inject the contents into the user message</span> <span style="color: #bbbbbb;"> </span>ChatMessage<span style="color: #bbbbbb;"> </span>finalMessage<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>contentInjector.<span style="color: #0000cc;">inject</span>(contents,<span style="color: #bbbbbb;"> </span>userMessage); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 5: Print the final message content (injected prompt)</span> <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(((UserMessage)<span style="color: #bbbbbb;"> </span>finalMessage).<span style="color: #0000cc;">singleText</span>()); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>What are the HR policies? Answer using the following information: content: Our HR policies include flexible work hours, medical leave, and onboarding support. source: Company portal You can check your leave balance and benefits on the HR portal. </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">We can configure the contentAggregator using RetrievalAugmentor and then use it together with AiServices to build the assistant.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #888888;">// Create a retrieval augmentor with a dynamic content retriever routed via a router</span> RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryRouter</span>(router) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentAggregator</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>DefaultContentAggregator()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentInjector</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>DefaultContentInjector()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #888888;">// Build the assistant using the configured retrieval augmentor</span> ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">ContentInjectorDemoFullApp.java</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.contentinjector</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.chat.MessageWindowChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.DefaultRetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.RetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.aggregator.DefaultContentAggregator</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.injector.DefaultContentInjector</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.router.LanguageModelQueryRouter</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.transformer.ExpandingQueryTransformer</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.AiServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ContentInjectorDemoFullApp</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatAssistant</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">chat</span>(String<span style="color: #bbbbbb;"> </span>userMessage); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model for routing and chatting</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Shared embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create embedding stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Sample data for ingestion</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Our HR policies include flexible work hours, medical leave, and onboarding support."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can check your leave balance and benefits on the HR portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Employee handbooks and code of conduct documents are available on the intranet."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Annual performance reviews are conducted in Q1 of each year."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"We provide mental wellness programs and employee assistance plans (EAP)."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"New employees must complete their joining formalities within the first week."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"HR holds town halls every quarter to discuss policy changes and updates."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Exit interviews are mandatory and help improve employee retention practices."</span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"If you're facing issues with VPN, restart your system and try again."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Password resets can be done via the IT Helpdesk portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"For software installation requests, raise a ticket through the ServiceNow portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Two-factor authentication is mandatory for accessing company email remotely."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Laptop issues should be reported to the IT asset management team."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"New joiners will receive their device credentials within 24 hours of onboarding."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"We recommend using the Chrome browser for all internal web tools."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The weekly IT newsletter includes patch updates and known issues."</span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Payslips are generated on the 5th of every month and available on the finance dashboard."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can file business travel reimbursements through the expense portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Employees must submit receipts within 15 days for expense claims."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Annual tax declarations must be uploaded to the HRMS by January 31."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Salary revisions are processed in March and reflected in April pay."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"All invoice-related queries should be addressed to [email protected]."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The company reimburses professional certification exam fees up to ₹10,000."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can track investment proofs under the ‘My Tax’ section on the intranet."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Ingest documents into respective stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(hrDocs),<span style="color: #bbbbbb;"> </span>hrStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(itDocs),<span style="color: #bbbbbb;"> </span>itStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(financeDocs),<span style="color: #bbbbbb;"> </span>financeStore); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create content retrievers</span> <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>hrRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(hrStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"hrRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>itRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(itStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"itRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>financeRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(financeStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"financeRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>retrieverToDescription<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>hrRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Provides information on leave policies, benefits, onboarding, and other HR-related topics."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>itRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Handles technical queries such as VPN access, email issues, password resets, and software installations."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>financeRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Answers questions related to reimbursements, payslips, taxation, invoices, and financial approvals."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create LLM-based router</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter<span style="color: #bbbbbb;"> </span>router<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrieverToDescription</span>(retrieverToDescription) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Expand queries (optional step for better retrieval)</span> <span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer<span style="color: #bbbbbb;"> </span>expandingQueryTransformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer(chatModel,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">3</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create retrieval augmentor with dynamic contentRetriever via router</span> <span style="color: #bbbbbb;"> </span>RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryRouter</span>(router) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentAggregator</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>DefaultContentAggregator()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentInjector</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>DefaultContentInjector()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Build the assistant</span> <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Run a conversation</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>userQueries<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How do I reset my email password?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Where can I see my payslip for last month?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"What is the company policy on medical leave?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How to claim business travel reimbursement?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"I'm facing issues connecting to the VPN."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>userQueries)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"User: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>userQuery); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>answer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatAssistant.<span style="color: #0000cc;">chat</span>(userQuery); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Assistant: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>answer); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"-----------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>text<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(Document.<span style="color: #0000cc;">from</span>(text)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">return</span><span style="color: #bbbbbb;"> </span>documents; <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>SLF4J(W): No SLF4J providers were found. SLF4J(W): Defaulting to no-operation (NOP) logger implementation SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. User: How do I reset my email password? Assistant: To reset your email password, follow these steps: 1. Log in to the IT Helpdesk portal. 2. Follow the prompts to initiate a password reset request. 3. Complete any additional verification steps as required. Note: You may need to use two-factor authentication to access company email remotely. If you're having trouble accessing the IT Helpdesk portal, try restarting your system and then attempting again. ----------------------------------------------- User: Where can I see my payslip for last month? Assistant: To view your payslip for last month, follow these steps: 1. Log in to the finance dashboard. 2. Look for the section related to payroll and benefits. 3. You should be able to see your payslip for the previous month. Note: The finance dashboard is available on the intranet, so make sure you have access to it. ----------------------------------------------- User: What is the company policy on medical leave? Assistant: Unfortunately, the provided information does not specifically state the company's policy on medical leave. However, it does mention that medical leave is included in the HR policies, which suggests that there are guidelines and procedures in place for managing medical leaves. To find more specific information about the company's policy on medical leave, you may need to check other resources, such as the employee handbook or speak with HR directly. ----------------------------------------------- User: How to claim business travel reimbursement? Assistant: To claim business travel reimbursement: 1. Log in to the expense portal. 2. Submit your receipts for eligible business expenses within 15 days of the trip. Note: The specific steps and deadlines may vary depending on the company's policies, so it's best to check the employee handbook or consult with HR for more detailed information. ----------------------------------------------- User: I'm facing issues connecting to the VPN. Assistant: To resolve your issue connecting to the VPN: 1. Restart your system. 2. Try reconnecting to the VPN again. If you're still experiencing issues, you may want to consider reaching out to the IT Helpdesk for further assistance or support. ----------------------------------------------- </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/content-aggregation-in-langchain4j-from.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/extracting-structured-java-objects-from.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-51883170545588868942025-12-22T05:29:00.000-08:002025-12-22T05:38:15.334-08:00Content Aggregation in LangChain4j: From Multi-Retriever Results to Ranked Relevance<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When building Retrieval-Augmented Generation (RAG) applications, it's common to fetch relevant content using multiple queries or content retrievers. However, this introduces challenges: how do you combine overlapping, partially relevant, or differently ranked content into a unified list that’s both accurate and non-redundant for the LLM?&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LangChain4j addresses this problem with a powerful component: the ContentAggregator. This post explores its purpose, core logic, and implementations, including the DefaultContentAggregator and the ReRankingContentAggregator.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy8EUY62jceQUx12IahpDGl1DHC_uXm73KeF2Mz5osCyK2-8xoGEmkUr3V1qVNLV0OEwLHZ5ZJx3PpqfHLieRFjCiTdkOqCn1fqo3-E-dI53niBAKdEdTKLrPGpzP78gfhHxb_rcP8wxyBCsb4G2yC0JA3j5EQURarG0l0ikjqiF8rtCDH0MOdDsur9Ec/s1396/content%20aggregators.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1396" data-original-width="532" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy8EUY62jceQUx12IahpDGl1DHC_uXm73KeF2Mz5osCyK2-8xoGEmkUr3V1qVNLV0OEwLHZ5ZJx3PpqfHLieRFjCiTdkOqCn1fqo3-E-dI53niBAKdEdTKLrPGpzP78gfhHxb_rcP8wxyBCsb4G2yC0JA3j5EQURarG0l0ikjqiF8rtCDH0MOdDsur9Ec/w153-h400/content%20aggregators.png" width="153" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. What Is a Content Aggregator?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In LangChain4j, the ContentAggregator interface defines a strategy for combining multiple lists of ranked content retrieved via different queries and content retrievers into a single, consistent, and sorted list of results.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This is important in RAG-based applications where:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">A single user query may be transformed into multiple sub-queries.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each sub-query might hit different retrievers (e.g., vector DBs, web APIs, PDF documents).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each retriever returns its own ranked content.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Instead of bombarding the LLM with all of this data, the ContentAggregator ensures only the most relevant and non-redundant content is passed along.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Interface Overview</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here’s what the ContentAggregator interface looks like:</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ContentAggregator</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">aggregate</span>(Map<span style="color: #333333;">&lt;</span>Query,<span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;">&lt;</span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;&gt;&gt;</span><span style="color: #bbbbbb;"> </span>queryToContents); } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Input: A map from each Query to a collection of List&lt;Content, one list per retriever hit.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output: A single, relevance-ranked List&lt;Content&gt;.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3. ContentAggregator Implementations</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LangChain4j offers two built-in implementations of the ContentAggregator interface:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">DefaultContentAggregator</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ReRankingContentAggregator</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.1 DefaultContentAggregator (Uses Reciprocal Rank Fusion Algorithm)</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The DefaultContentAggregator is the standard implementation provided by LangChain4j. It performs two-stage Reciprocal Rank Fusion (RRF), a widely used technique in information retrieval.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is Reciprocal Rank Fusion?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">RRF combines multiple ranked lists by assigning scores based on the inverse of their rank positions. The idea: content that ranks high in multiple lists gets a strong overall score.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.2 ReRankingContentAggregator (Semantic Relevance Boosted by Scoring Models)</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sometimes, structural signals like position in a list (used in RRF) aren’t enough. That’s where the ReRankingContentAggregator shines. It uses a ScoringModel (e.g., from Cohere, OpenAI, or other providers) to semantically re-score content. The re-ranking is based on how well each content chunk semantically aligns with the query.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContentAggregatorDemo.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.contentaggregator</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Collection</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.Content</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.aggregator.ContentAggregator</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.aggregator.DefaultContentAggregator</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.Query</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ContentAggregatorDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 1: Define sample queries</span> <span style="color: #bbbbbb;"> </span>Query<span style="color: #bbbbbb;"> </span>query1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>Query(<span style="background-color: #fff0f0;">"What are the investment options available?"</span>); <span style="color: #bbbbbb;"> </span>Query<span style="color: #bbbbbb;"> </span>query2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>Query(<span style="background-color: #fff0f0;">"Tell me about the risk assessment process."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 2: Create content chunks related to each query</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>investmentContentList1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Our company offers SIPs, mutual funds, and fixed deposits."</span>), <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"You can diversify your investments via index funds and ETFs."</span>)); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>investmentContentList2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Fixed income options like bonds are also available."</span>), <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"We give personalized investment advice based on each client's risk level."</span>)); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>riskContentList1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Risk assessment includes credit score checks and portfolio volatility analysis."</span>), <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"We follow RBI guidelines for financial risk mitigation."</span>)); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>riskContentList2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"We use internal scoring models to assess client eligibility and investment risk."</span>), <span style="color: #bbbbbb;"> </span>Content.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Risk is periodically reviewed based on market trends and compliance audits."</span>)); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 3: Build the map of Query -&gt; Collection&lt;List&lt;Content&gt;&gt;</span> <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>Query,<span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;">&lt;</span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;&gt;&gt;</span><span style="color: #bbbbbb;"> </span>queryToContents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>queryToContents.<span style="color: #0000cc;">put</span>(query1,<span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>(investmentContentList1,<span style="color: #bbbbbb;"> </span>investmentContentList2)); <span style="color: #bbbbbb;"> </span>queryToContents.<span style="color: #0000cc;">put</span>(query2,<span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>(riskContentList1,<span style="color: #bbbbbb;"> </span>riskContentList2)); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Use DefaultContentAggregator (uses Reciprocal Rank Fusion)</span> <span style="color: #bbbbbb;"> </span>ContentAggregator<span style="color: #bbbbbb;"> </span>defaultAggregator<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>DefaultContentAggregator(); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>defaultAggregated<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>defaultAggregator.<span style="color: #0000cc;">aggregate</span>(queryToContents); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"=== DefaultContentAggregator Output ==="</span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(Content<span style="color: #bbbbbb;"> </span>c<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>defaultAggregated)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"- "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>c.<span style="color: #0000cc;">textSegment</span>().<span style="color: #0000cc;">text</span>()); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>=== DefaultContentAggregator Output === - Risk assessment includes credit score checks and portfolio volatility analysis. - Our company offers SIPs, mutual funds, and fixed deposits. - We use internal scoring models to assess client eligibility and investment risk. - Fixed income options like bonds are also available. - We follow RBI guidelines for financial risk mitigation. - You can diversify your investments via index funds and ETFs. - Risk is periodically reviewed based on market trends and compliance audits. - We give personalized investment advice based on each client's risk level. </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s build a complete RAG application using content aggregator</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create retrieval augmentor with dynamic contentRetriever via router</span> <span style="color: #bbbbbb;"> </span>RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryRouter</span>(router) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentAggregator</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>DefaultContentAggregator()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Build the assistant</span> <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This code snippet shows how to configure a RetrievalAugmentor in LangChain4j by setting a custom ContentAggregator.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">It uses a DefaultRetrievalAugmentor builder to configure:</span></p> <p class="MsoNoSpacing" style="margin-left: 72pt; mso-list: l0 level2 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: &quot;Courier New&quot;; mso-ansi-language: EN-US; mso-fareast-font-family: &quot;Courier New&quot;;"><span style="mso-list: Ignore;">o<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">a queryTransformer (e.g., for expanding or rewriting queries),</span></p> <p class="MsoNoSpacing" style="margin-left: 72pt; mso-list: l0 level2 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: &quot;Courier New&quot;; mso-ansi-language: EN-US; mso-fareast-font-family: &quot;Courier New&quot;;"><span style="mso-list: Ignore;">o<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">a queryRouter (to route queries to appropriate retrievers),</span></p> <p class="MsoNoSpacing" style="margin-left: 72pt; mso-list: l0 level2 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: &quot;Courier New&quot;; mso-ansi-language: EN-US; mso-fareast-font-family: &quot;Courier New&quot;;"><span style="mso-list: Ignore;">o<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">and a DefaultContentAggregator (to merge retrieved content using Reciprocal Rank Fusion).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This RetrievalAugmentor is then used to build a ChatAssistant, combining it with a chat model and chat memory.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The resulting assistant can process user inputs, transform and route queries, retrieve and aggregate content, and respond accordingly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContentAggregatorDemoFullApp.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.contentaggregator</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.chat.MessageWindowChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.DefaultRetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.RetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.aggregator.DefaultContentAggregator</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.router.LanguageModelQueryRouter</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.transformer.ExpandingQueryTransformer</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.AiServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ContentAggregatorDemoFullApp</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatAssistant</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">chat</span>(String<span style="color: #bbbbbb;"> </span>userMessage); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model for routing and chatting</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Shared embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create embedding stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Sample data for ingestion</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Our HR policies include flexible work hours, medical leave, and onboarding support."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can check your leave balance and benefits on the HR portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Employee handbooks and code of conduct documents are available on the intranet."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Annual performance reviews are conducted in Q1 of each year."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"We provide mental wellness programs and employee assistance plans (EAP)."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"New employees must complete their joining formalities within the first week."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"HR holds town halls every quarter to discuss policy changes and updates."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Exit interviews are mandatory and help improve employee retention practices."</span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"If you're facing issues with VPN, restart your system and try again."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Password resets can be done via the IT Helpdesk portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"For software installation requests, raise a ticket through the ServiceNow portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Two-factor authentication is mandatory for accessing company email remotely."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Laptop issues should be reported to the IT asset management team."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"New joiners will receive their device credentials within 24 hours of onboarding."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"We recommend using the Chrome browser for all internal web tools."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The weekly IT newsletter includes patch updates and known issues."</span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Payslips are generated on the 5th of every month and available on the finance dashboard."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can file business travel reimbursements through the expense portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Employees must submit receipts within 15 days for expense claims."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Annual tax declarations must be uploaded to the HRMS by January 31."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Salary revisions are processed in March and reflected in April pay."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"All invoice-related queries should be addressed to [email protected]."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The company reimburses professional certification exam fees up to ₹10,000."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can track investment proofs under the ‘My Tax’ section on the intranet."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Ingest documents into respective stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(hrDocs),<span style="color: #bbbbbb;"> </span>hrStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(itDocs),<span style="color: #bbbbbb;"> </span>itStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(financeDocs),<span style="color: #bbbbbb;"> </span>financeStore); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create content retrievers</span> <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>hrRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(hrStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"hrRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>itRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(itStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"itRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>financeRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(financeStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"financeRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>retrieverToDescription<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>hrRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Provides information on leave policies, benefits, onboarding, and other HR-related topics."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>itRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Handles technical queries such as VPN access, email issues, password resets, and software installations."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>financeRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Answers questions related to reimbursements, payslips, taxation, invoices, and financial approvals."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create LLM-based router</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter<span style="color: #bbbbbb;"> </span>router<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrieverToDescription</span>(retrieverToDescription) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Expand queries (optional step for better retrieval)</span> <span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer<span style="color: #bbbbbb;"> </span>expandingQueryTransformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer(chatModel,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">3</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create retrieval augmentor with dynamic contentRetriever via router</span> <span style="color: #bbbbbb;"> </span>RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryRouter</span>(router) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentAggregator</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>DefaultContentAggregator()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Build the assistant</span> <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Run a conversation</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>userQueries<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How do I reset my email password?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Where can I see my payslip for last month?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"What is the company policy on medical leave?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How to claim business travel reimbursement?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"I'm facing issues connecting to the VPN."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>userQueries)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"User: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>userQuery); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>answer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatAssistant.<span style="color: #0000cc;">chat</span>(userQuery); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Assistant: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>answer); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"-----------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>text<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(Document.<span style="color: #0000cc;">from</span>(text)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">return</span><span style="color: #bbbbbb;"> </span>documents; <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>User: How do I reset my email password? Assistant: To reset your email password, follow these steps: 1. Go to the IT Helpdesk portal. 2. Log in with your company credentials. 3. Click on the "Password Reset" or "Forgot Password" option. 4. Follow the instructions provided to complete the password reset process. Please note that you may need to provide additional verification information due to two-factor authentication requirements for accessing company email remotely. ----------------------------------------------- User: Where can I see my payslip for last month? Assistant: To view your payslip for last month, follow these steps: 1. Log in to the finance dashboard. 2. Check if a new month's payslips have been generated (typically around the 5th of the current month). 3. If available, click on the "View" or "Last Month's Pay" option to access your payslip for the previous month. Please note that you should be able to view this information online through the finance dashboard, without needing any additional assistance or credentials. ----------------------------------------------- User: What is the company policy on medical leave? Assistant: Unfortunately, this information doesn't directly state the company's policy on medical leave. However, it does mention that "Our HR policies include flexible work hours" and provides resources for managing leaves (the HR portal) and offers mental wellness programs and EAPs. It can be inferred that the company has some form of medical leave policy, but the specific details are not provided in this information. ----------------------------------------------- User: How to claim business travel reimbursement? Assistant: To claim business travel reimbursement, follow these steps: 1. Use the expense portal. 2. Log in with your company credentials. 3. Navigate to the "Business Travel" or "Expense Claims" section. 4. Submit your receipts and relevant documentation for reimbursement within 15 days of the trip. Note that specific details about reimbursement procedures, such as what expenses are eligible or any additional requirements, are not mentioned in this information. ----------------------------------------------- User: I'm facing issues connecting to the VPN. Assistant: Try restarting your system to resolve the issue connecting to the VPN. If the problem persists, you can consider reaching out to IT for further assistance or requesting help from the Helpdesk via the IT Helpdesk portal. Note that two-factor authentication and software installation requests are not directly related to resolving VPN connection issues. ----------------------------------------------- </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><br /></p><p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/content-retrievers-in-langchain4j.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/enhancing-ai-responses-with.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a> Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-32925361664607148872025-10-30T08:18:00.000-07:002025-12-22T05:29:53.379-08:00Content Retrievers in LangChain4j: Bridging the gap between Natural Language and Data Sources<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Retrieval-Augmented Generation (RAG) applications rely heavily on the ability to pull relevant information from external data sources. In LangChain4j, this responsibility lies with the ContentRetriever interface. Whether your data lives in a vector store, SQL database, graph database, or even on the open web, LangChain4j provides a unified way to retrieve relevant chunks of information.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, we’ll walk through the role of ContentRetriever, explore various implementations provided by LangChain4j, and understand how they help bridge the gap between unstructured queries and structured (or semi-structured) data sources.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. What is Content Retriever?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">A ContentRetriever retrieves Content from an underlying data source using a given Query.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ContentRetriever</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">retrieve</span>(Query<span style="color: #bbbbbb;"> </span>query); } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">At the time of writing this pos, langchain4j support following content retrievers.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LangChain4j comes with several built-in content retrievers that help get information from different types of data sources. </span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The EmbeddingStoreContentRetriever finds content using vector similarity, which is great for working with embeddings and doing smart searches. </span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The WebSearchContentRetriever pulls in up-to-date information from the web using a search engine. </span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The AzureAiSearchContentRetriever works with Azure AI Search and supports full-text search, vector search, a mix of both, and can re-rank results to show the most useful ones first, making it good for enterprise use. </span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The SqlDatabaseContentRetriever (still experimental) connects to relational databases and turns plain language questions into SQL queries to get the right data. </span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Lastly, the Neo4jContentRetriever lets you search graph databases by converting natural language into Cypher queries and fetching related entities and connections.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">These retrievers allow LangChain4j to link AI models with many different types of data sources.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Benefits of LangChain4j's Content Retriever Abstraction</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Pluggable architecture: Easily switch between retrievers without rewriting business logic.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Unified Query API: Regardless of the backend (vector DB, SQL, graph), all retrievers accept the same Query object.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Composable with RAG pipelines: Easily integrate with LangChain4j’s other RAG components (query transformers, aggregators, etc.).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>ContentRetriever<span style="color: #bbbbbb;"> </span>contentRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(embeddingStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"informaitonAboutIndia"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Above code creates an instance of ContentRetriever using the EmbeddingStoreContentRetriever. It configures how this retriever should fetch relevant content from an embedding-based data store.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContentRetrieverDemo.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.contentretriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.Content</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.Query</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ContentRetrieverDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>indiaDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India, officially the Republic of India, is a country in South Asia. It is the seventh-largest country by area,</span> <span style="background-color: #fff0f0;"> the most populous country as of 2023, and the most populous democracy in the world. Bounded by the Himalayas in</span> <span style="background-color: #fff0f0;"> the north and surrounded by the Indian Ocean, Arabian Sea, and Bay of Bengal, India has a rich cultural and</span> <span style="background-color: #fff0f0;"> historical heritage.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> The Indian economy is the fifth-largest in the world by nominal GDP and the third-largest by purchasing power parity.</span> <span style="background-color: #fff0f0;"> It is classified as a newly industrialized country and one of the world's fastest-growing major economies. Major</span> <span style="background-color: #fff0f0;"> industries include IT services, textiles, pharmaceuticals, and agriculture.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India's political system is a federal parliamentary democratic republic. The President of India is the head of state,</span> <span style="background-color: #fff0f0;"> while the Prime Minister is the head of government. The Indian Parliament consists of the Lok Sabha (House of the People)</span> <span style="background-color: #fff0f0;"> and the Rajya Sabha (Council of States).</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Indian culture is renowned for its diversity and depth. It includes a wide variety of languages, religions, music,</span> <span style="background-color: #fff0f0;"> dance forms, cuisine, and traditions. Major religions born in India include Hinduism, Buddhism, Jainism, and Sikhism.</span> <span style="background-color: #fff0f0;"> Festivals such as Diwali, Eid, Christmas, and Pongal are celebrated across the country.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India is home to 40 UNESCO World Heritage Sites, including the Taj Mahal, Qutub Minar, and the Western Ghats. The country</span> <span style="background-color: #fff0f0;"> offers a wide variety of landscapes ranging from deserts in Rajasthan, the Himalayan mountain range, tropical rainforests</span> <span style="background-color: #fff0f0;"> in the northeast, to coastal plains and fertile river valleys.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> The Indian education system has seen significant progress, with institutes like the IITs, IIMs, and AIIMS gaining global</span> <span style="background-color: #fff0f0;"> recognition. India also has a growing startup ecosystem, particularly in tech hubs such as Bengaluru, Hyderabad, and Pune.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India has a vibrant film industry, notably Bollywood, which produces the largest number of films in the world. Indian music</span> <span style="background-color: #fff0f0;"> and dance forms such as Bharatanatyam, Kathak, Carnatic music, and Bollywood songs are famous worldwide.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Indian cuisine is known for its rich flavors and diverse ingredients. Each region has its own distinct dishes –</span> <span style="background-color: #fff0f0;"> from butter chicken and biryani in the north, to dosa and sambar in the south, to seafood delicacies in the coastal regions.</span> <span style="background-color: #fff0f0;"> Spices like turmeric, cumin, coriander, and cardamom are integral to Indian cooking.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> The Indian space program, led by ISRO, has made remarkable achievements including the Chandrayaan lunar missions and the</span> <span style="background-color: #fff0f0;"> Mars Orbiter Mission (Mangalyaan), which made India the first Asian nation to reach Mars orbit and the first in the world</span> <span style="background-color: #fff0f0;"> to do so in its maiden attempt.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Indian sports are dominated by cricket, but other sports like hockey, badminton, wrestling, and kabaddi are also popular.</span> <span style="background-color: #fff0f0;"> India has produced world-class athletes including Sachin Tendulkar, P.V. Sindhu, Neeraj Chopra, and Mary Kom. The country</span> <span style="background-color: #fff0f0;"> has hosted major sporting events like the Commonwealth Games and the Cricket World Cup.</span> <span style="background-color: #fff0f0;"> """</span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">prepareDocuments</span>()<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>doc<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>indiaDocs)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(Document.<span style="color: #0000cc;">from</span>(doc)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>prepareDocuments(); <span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>embeddingStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(documents,<span style="color: #bbbbbb;"> </span>embeddingStore); <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>contentRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">embeddingStore</span>(embeddingStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"informaitonAboutIndia"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>).<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Hey, I was reading about how countries manage their political systems and got curious — can you tell me how India runs its government, who’s in charge, and what kind of structure they follow politically?</span> <span style="background-color: #fff0f0;"> """</span>; <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Content<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>matchedContent<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>contentRetriever.<span style="color: #0000cc;">retrieve</span>(Query.<span style="color: #0000cc;">from</span>(userQuery)); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Total Matched Documents : "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>matchedContent.<span style="color: #0000cc;">size</span>()<span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"\n"</span>); <span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #bbbbbb;"> </span>i<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1</span>; <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(Content<span style="color: #bbbbbb;"> </span>content<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>matchedContent)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(i<span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">". "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span>content.<span style="color: #0000cc;">textSegment</span>().<span style="color: #0000cc;">text</span>()<span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"\n"</span>); <span style="color: #bbbbbb;"> </span>i<span style="color: #333333;">++</span>; <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Total Matched Documents : 3 1. India's political system is a federal parliamentary democratic republic. The President of India is the head of state, while the Prime Minister is the head of government. The Indian Parliament consists of the Lok Sabha (House of the People) and the Rajya Sabha (Council of States). 2. India, officially the Republic of India, is a country in South Asia. It is the seventh-largest country by area, the most populous country as of 2023, and the most populous democracy in the world. Bounded by the Himalayas in the north and surrounded by the Indian Ocean, Arabian Sea, and Bay of Bengal, India has a rich cultural and historical heritage. 3. The Indian economy is the fifth-largest in the world by nominal GDP and the third-largest by purchasing power parity. It is classified as a newly industrialized country and one of the world's fastest-growing major economies. Major industries include IT services, textiles, pharmaceuticals, and agriculture. </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContentRetriever takes the input from Query router in RAG pipelines.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnWEhVNG9ZWrviElpaHRoi8L_xDoYkMh1eM0CmtYhW5JSYUZ2r1yVJ0RRe37RY85ThSZDSPMujcBE0IK3LPmlobZtrbUyueTPaZ5vxQ7ncW6KoKaKEd4_Bjvc2DFsmUKN4YDU70ijcBu9Ho79mtDO1_qK5czx_6S-2hqlZs2HoIsfpIiWputgBNmQQMWg/s1396/langchain%20content%20retriever%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1396" data-original-width="532" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnWEhVNG9ZWrviElpaHRoi8L_xDoYkMh1eM0CmtYhW5JSYUZ2r1yVJ0RRe37RY85ThSZDSPMujcBE0IK3LPmlobZtrbUyueTPaZ5vxQ7ncW6KoKaKEd4_Bjvc2DFsmUKN4YDU70ijcBu9Ho79mtDO1_qK5czx_6S-2hqlZs2HoIsfpIiWputgBNmQQMWg/s320/langchain%20content%20retriever%201.png" width="122" /></a></b></div><b><br />&nbsp;</b><p></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContentRetrieverFullApp.java</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.contentretriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.chat.MessageWindowChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.DefaultRetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.RetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.router.LanguageModelQueryRouter</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.transformer.ExpandingQueryTransformer</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.AiServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ContentRetrieverFullApp</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatAssistant</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">chat</span>(String<span style="color: #bbbbbb;"> </span>userMessage); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model for routing and chatting</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Shared embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create embedding stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Sample data for ingestion</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Our HR policies include flexible work hours, medical leave, and onboarding support."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can check your leave balance and benefits on the HR portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Employee handbooks and code of conduct documents are available on the intranet."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Annual performance reviews are conducted in Q1 of each year."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"We provide mental wellness programs and employee assistance plans (EAP)."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"New employees must complete their joining formalities within the first week."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"HR holds town halls every quarter to discuss policy changes and updates."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Exit interviews are mandatory and help improve employee retention practices."</span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"If you're facing issues with VPN, restart your system and try again."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Password resets can be done via the IT Helpdesk portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"For software installation requests, raise a ticket through the ServiceNow portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Two-factor authentication is mandatory for accessing company email remotely."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Laptop issues should be reported to the IT asset management team."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"New joiners will receive their device credentials within 24 hours of onboarding."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"We recommend using the Chrome browser for all internal web tools."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The weekly IT newsletter includes patch updates and known issues."</span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Payslips are generated on the 5th of every month and available on the finance dashboard."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can file business travel reimbursements through the expense portal."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Employees must submit receipts within 15 days for expense claims."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Annual tax declarations must be uploaded to the HRMS by January 31."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Salary revisions are processed in March and reflected in April pay."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"All invoice-related queries should be addressed to [email protected]."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The company reimburses professional certification exam fees up to ₹10,000."</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"You can track investment proofs under the ‘My Tax’ section on the intranet."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Ingest documents into respective stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(hrDocs),<span style="color: #bbbbbb;"> </span>hrStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(itDocs),<span style="color: #bbbbbb;"> </span>itStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(financeDocs),<span style="color: #bbbbbb;"> </span>financeStore); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create content retrievers</span> <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>hrRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(hrStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"hrRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>itRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(itStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"itRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>financeRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(financeStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"financeRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>retrieverToDescription<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>hrRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Provides information on leave policies, benefits, onboarding, and other HR-related topics."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>itRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Handles technical queries such as VPN access, email issues, password resets, and software installations."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>financeRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Answers questions related to reimbursements, payslips, taxation, invoices, and financial approvals."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create LLM-based router</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter<span style="color: #bbbbbb;"> </span>router<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrieverToDescription</span>(retrieverToDescription) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Expand queries (optional step for better retrieval)</span> <span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer<span style="color: #bbbbbb;"> </span>expandingQueryTransformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer(chatModel,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">3</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create retrieval augmentor with dynamic contentRetriever via router</span> <span style="color: #bbbbbb;"> </span>RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryRouter</span>(router) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Build the assistant</span> <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Run a conversation</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>userQueries<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How do I reset my email password?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Where can I see my payslip for last month?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"What is the company policy on medical leave?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How to claim business travel reimbursement?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"I'm facing issues connecting to the VPN."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>userQueries)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"User: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>userQuery); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>answer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatAssistant.<span style="color: #0000cc;">chat</span>(userQuery); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Assistant: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>answer); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"-----------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>text<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(Document.<span style="color: #0000cc;">from</span>(text)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">return</span><span style="color: #bbbbbb;"> </span>documents; <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>User: How do I reset my email password? Assistant: Unfortunately, this information doesn't provide instructions on how to reset your email password specifically. However, I can infer that you can use the IT Helpdesk portal for assistance with resetting your email password. If you're having trouble accessing the portal or need help with the process, you may want to contact the IT department directly for support. ----------------------------------------------- User: Where can I see my payslip for last month? Assistant: According to the information provided, payslips for last month would be available on the finance dashboard, which is generated on the 5th of every month. This implies that if you're looking at your current month's payslip, it should be visible on the finance dashboard, but you'll need to wait until the 5th of the next month to see the previous month's payslip. ----------------------------------------------- User: What is the company policy on medical leave? Assistant: The company policy on medical leave is not explicitly stated, but it can be inferred that there is a provision for it as part of the "Our HR policies include flexible work hours, medical leave, and onboarding support" statement. However, the exact details of this policy are not provided in the given information. ----------------------------------------------- User: How to claim business travel reimbursement? Assistant: To claim business travel reimbursement, you need to use the expense portal. The exact steps or process for doing so are not provided in this information. However, it is mentioned that employees must submit receipts within 15 days for expense claims, suggesting that you will need to upload your receipts and follow any applicable procedures through the expense portal. ----------------------------------------------- User: I'm facing issues connecting to the VPN. Assistant: If you're facing issues connecting to the VPN, try restarting your system and then attempt to connect again. This may resolve the issue, but if not, further troubleshooting steps would be needed to identify and resolve the problem. ----------------------------------------------- </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/smart-query-routing-in-langchain4j-from.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/12/content-aggregation-in-langchain4j-from.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-70289506396136488962025-10-30T07:56:00.000-07:002025-10-30T07:56:56.913-07:00Apache Pinot vs. Druid: Which Real-Time Analytics Database Should You Choose?<p><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">If you need fast analytics on live data (like dashboards or real-time reports), two open-source databases stand out: Apache Pinot and Apache Druid. Both are built for low-latency queries at scale, but they have different strengths. </span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">1. What Are Pinot and Druid?</span></b></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Both are real-time OLAP databases, meaning:</span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoListParagraphCxSpFirst" style="mso-list: l9 level1 lfo1; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">They handle streaming data (e.g., clicks, transactions) + batch data (historical logs).</span></p> <p class="MsoListParagraphCxSpMiddle" style="mso-list: l9 level1 lfo1; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Optimized for fast aggregations (e.g., "How many users visited today?").</span></p> <p class="MsoListParagraphCxSpLast" style="mso-list: l9 level1 lfo1; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Support high concurrency (100s–1000s of queries per second).</span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">2. Performance: Which Is Faster?</span></b></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Pinot:</span></p> <p class="MsoListParagraphCxSpFirst" style="mso-list: l8 level1 lfo2; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Excels at high-concurrency queries (e.g., 100,000+ queries/sec).</span></p> <p class="MsoListParagraphCxSpMiddle" style="mso-list: l8 level1 lfo2; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Used by companies like Uber Eats and Stripe for real-time dashboards.</span></p> <p class="MsoListParagraphCxSpLast" style="mso-list: l8 level1 lfo2; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Requires manual tuning for best performance.</span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Druid:</span></p> <p class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo3; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Handles mixed workloads better (e.g., dashboards + ad-hoc queries).</span></p> <p class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo3; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Used by Netflix and Salesforce for analytics.</span></p> <p class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo3; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">May slow down under extreme concurrency.</span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Verdict:</span></p> <p class="MsoListParagraphCxSpFirst" style="mso-list: l4 level1 lfo4; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Need ultra-fast, predictable queries? Pinot might win.</span></p> <p class="MsoListParagraphCxSpLast" style="mso-list: l4 level1 lfo4; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Need flexibility + ease of use? Druid could be better.</span></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">3. Indexing (How Data Is Organized)</span></b></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Pinot:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l6 level1 lfo5; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">You choose indexes manually (like picking tools for a toolbox).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l6 level1 lfo5; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">More control but harder to set up.</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Druid:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l1 level1 lfo6; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Automatic indexing (it picks the best method for you).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l1 level1 lfo6; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Simpler but less customizable.</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Beginners might prefer Druid (less manual work), and experts might prefer Pinot (more tuning options).</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">4. Data Ingestion (Loading Data)</span></b></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Druid:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo7; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Supports SQL-based ingestion (transform data while loading).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo7; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Example: You can JOIN tables during ingestion.</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Pinot:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l2 level1 lfo8; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Needs pre-processed data (e.g., via Spark or Flink).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l2 level1 lfo8; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Less flexible for complex transformations.</span></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">5. Which Should You Choose?</span></b></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Pick Druid if you:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l7 level1 lfo9; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Want auto-indexing (less manual work).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l7 level1 lfo9; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Need SQL-based data transformations.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l7 level1 lfo9; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Have mixed workloads (dashboards + ad-hoc queries).</span></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Pick Pinot if you:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l5 level1 lfo10; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Need extreme speed (100K+ queries/sec).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l5 level1 lfo10; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Can manually optimize indexes.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l5 level1 lfo10; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">Don’t need complex transformations during ingestion.</span></p> <p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: &quot;Verdana&quot;,sans-serif; mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/querying-apache-druid-via-http-apis.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/querying-apache-druid-via-http-apis.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-85169319473825083452025-10-30T07:52:00.000-07:002025-10-30T07:52:55.155-07:00Designing for Scale: Inside Modern Distributed Databases<p><span face="&quot;Verdana&quot;,sans-serif">This post explains how modern databases handle large amounts of data while staying fast and reliable using methods like sharding, replication, and denormalization. It looks at how databases have evolved from traditional relational systems to modern NoSQL ones like MongoDB and Cassandra, describing how they work and the pros and cons of each.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">By the end, you’ll understand the main ideas behind distributed data design and how to make smart choices that balance consistency, availability, and scalability.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">1. The Need for Scalable Databases</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Modern applications from social media platforms to e-commerce giants and IoT networks deal with huge amounts of data and user activity. Every click, view, purchase, sensor signal, and recommendation translates into a database operation. As businesses grow, so does the need for databases that can scale seamlessly handling billions of records, millions of users, and continuous uptime expectations.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This section explains why scalability has become a first-class requirement for modern databases, where traditional relational models fall short, and how horizontal scaling and distributed systems changed the game.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.1 The Rise of Data Volume and Concurrent Users</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In the early 2000s, a typical enterprise database might have handled a few gigabytes of structured data and a few hundred concurrent users. Today, systems like Instagram, Netflix, and Amazon handle petabytes of data and millions of simultaneous users across the globe all expecting instant responses.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example 1: Social Media Growth</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l41 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">When Facebook launched in 2004, it served data from a single MySQL database.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l41 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Within a few years, user numbers exploded from thousands to millions.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l41 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Every user profile, post, comment, and reaction became a row in a database table.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l41 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The relational database couldn’t handle that level of read/write concurrency and data volume.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l41 level1 lfo1; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">This led Facebook to adopt MySQL sharding and later introduce TAO, their own distributed data store for social graphs.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example 2: E-commerce Traffic Spikes</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l14 level1 lfo2; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Consider an e-commerce site like Flipkart or Amazon during a "Big Billion Sale".</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l14 level1 lfo2; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The number of concurrent users might jump from 10,000 to 5 million within minutes.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l14 level1 lfo2; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">A single database server even a high-end one cannot handle such a surge in queries.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l14 level1 lfo2; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Without a scalable database, users would see "Site Down" errors or slow checkout experiences.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">The solution is to distribute both the data and load across multiple nodes, allowing the system to expand dynamically. These examples underline one truth that data growth is not linear, but exponential and databases must be designed to scale in step.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.2 Why Traditional Relational Databases Hit Limits</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Traditional relational databases like MySQL, PostgreSQL, and Oracle were designed in an era when data fit comfortably on a single machine. They emphasize ACID guarantees (Atomicity, Consistency, Isolation, Durability), which ensure data correctness but limit scalability.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Let’s understand their key bottlenecks:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.2.1 Single-Server Dependency</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">A typical RDBMS installation runs on a single server. You can make it faster by adding more CPU, memory, or faster disks but only up to a point. Eventually, you hit hardware and I/O limits.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.2.2 Locking and Transactions</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">When multiple users try to modify the same table or row, locks are used to maintain consistency. Under heavy load, this causes contention many transactions waiting for one to complete. For example, imagine 100000 users trying to update their shopping cart at the same time. The system must ensure each cart update is isolated and correct but this slows down the entire database because of locking overhead.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.2.3 Vertical Scaling Saturation</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">You can upgrade to a more powerful server but after a point, adding more hardware brings diminishing returns. The CPU may be idle while the disk is busy, or the memory may be underutilized while the I/O waits on locks.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Moreover, vertical scaling (buying bigger servers) is expensive and not fault-tolerant one machine failure can take the entire database down.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.2.4 Schema Rigidity</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Relational databases enforce strict schemas. If your data model changes frequently (like in modern apps where new features evolve rapidly), schema migrations can be slow and risky, blocking production systems.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.3 Horizontal vs Vertical Scaling</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">The two fundamental approaches to scaling databases are vertical scaling (scale up) and horizontal.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Horizontal Scaling</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l19 level1 lfo3; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Add more CPU, RAM, or faster storage to a single machine</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l19 level1 lfo3; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Example: Upgrading from 16-core to 64-core, 64GB to 512GB</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l19 level1 lfo3; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Pros: Simple to implement, minimal code changes sometimes no code changes at all</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l19 level1 lfo3; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Cons: Hardware limits, single point of failure and expensive</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Vertical Scaling</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l5 level1 lfo4; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Add more machines (nodes) and distribute data &amp; requests across them</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l5 level1 lfo4; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Example: Adding 10 commodity servers to share the load</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l5 level1 lfo4; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Pros: Scalable, fault-tolerant, cost-effective</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l5 level1 lfo4; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Cons: Complex coordination, consistency management</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">For example, suppose your MySQL server on one machine is overloaded.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l37 level1 lfo5; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Vertical scaling: upgrade the server to 32 cores and 512GB RAM. Works temporarily, but costs rise exponentially.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l37 level1 lfo5; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Horizontal scaling: split data across 10 smaller servers (shards), each handling a subset of data. Now you can add the 11th or 12th server as demand grows —this is true scalability.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Modern distributed databases like Cassandra, MongoDB, and CockroachDB are built natively for horizontal scaling, enabling near-infinite expansion.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.4 Characteristics of Modern Distributed Systems</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Modern databases are designed as distributed systems, a collection of independent machines working together to appear as one logical database. Let’s explore their key characteristics.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.4.1 Fault Tolerance</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Failures are inevitable like disks crash, nodes go offline, networks partition. A distributed database ensures no single point of failure. Data is replicated across nodes, so if one node goes down, another takes over seamlessly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In MongoDB, every shard has one primary and multiple secondaries. If the primary fails, the secondaries automatically elect a new primary all without manual intervention.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.4.2 Elasticity</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Modern systems can scale elastically meaning they can add or remove resources dynamically based on load.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Cloud-native databases like Amazon DynamoDB or Google Spanner automatically scale up during traffic spikes and scale down during idle hours.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">During peak shopping hours, DynamoDB might expand from 20 to 100 partitions. Once traffic drops, it automatically scales back to 20, saving cost while maintaining performance.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.4.3 Availability</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Distributed databases are built for high availability, ensuring that users can always read and write data even during failures. This is achieved by replication, automatic failover, and geo-distribution.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Cassandra replicates data across multiple nodes and even multiple data centers. If a node in Mumbai fails, requests can still be served from Delhi or Singapore replicas maintaining 24/7 uptime.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">1.4.4 Eventual Consistency</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">To maintain availability during network failures, distributed databases often relax immediate consistency, meaning data updates may take a few seconds to propagate globally. This trade-off, known as eventual consistency, is central to systems like Cassandra and DynamoDB.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">You might update your profile picture, and your friend in another region sees the old one for a few seconds that’s eventual consistency in action.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In summary, the demand for real-time, global, and large-scale applications has redefined what databases must deliver. Traditional relational databases prioritized data integrity, modern distributed systems prioritize availability, elasticity, and fault tolerance without compromising too much on consistency.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2. The Router–Shard–Replica Model</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">As applications grow and user requests flood in, a single database server no matter how powerful it is,<span style="mso-spacerun: yes;">&nbsp; </span>eventually becomes a bottleneck. The Router–Shard–Replica model is the architectural response that allows databases to distribute both data and workload intelligently across many machines. Let’s understand how this works, step by step.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2.1 Overview of How Client Requests Are Routed</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Imagine you run a global e-commerce platform where millions of customers browse, add to cart, and purchase simultaneously. When a client (say, the mobile app) sends a request to fetch a user’s order history, the system must know which server actually holds that user’s data. This is where the router or coordinator node steps in.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Instead of making every client aware of where each piece of data lives, the router acts as a traffic director:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l40 level1 lfo6; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The client connects to the router.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l40 level1 lfo6; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The router determines which shard (Shard holds subset of data) holds the relevant data (based on a shard key or hash function).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l40 level1 lfo6; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">It forwards the query to the correct shard and merges the results if needed.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">The client sees only one endpoint, but behind the scenes, the router orchestrates the query distribution.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In MongoDB, this router is known as mongos, while in Cassandra, any node can serve as the coordinator. Both serve the same purpose simplifying the client’s view of the cluster.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2.2 The Concept of a Router (or Coordinator) Node</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Think of the router as the "switchboard operator" (A switchboard operator is a person who manages incoming telephone calls, routing them to the correct person or department within an organization) of your database cluster. It doesn’t store actual data instead, it maintains metadata about where each chunk of data resides.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">In MongoDB:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo7; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The router consults config servers, which store mapping information about data chunks and shard locations.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo7; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">When a query arrives, the router checks this metadata to decide which shard(s) to contact.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo7; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">If data moves (due to rebalancing or new shard addition), the config servers update this metadata keeping the routing dynamic and consistent.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">In Cassandra:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l24 level1 lfo8; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">There’s no central router. Any node can act as a coordinator by knowing the token ring layout. Read this post for more details: https://self-learning-java-tutorial.blogspot.com/2024/05/consistent-hashing-scalable-approach-to.html</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l24 level1 lfo8; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The coordinator identifies which nodes are responsible for a given partition key and forwards the request accordingly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2.3 What a Shard Is: Horizontal Partitioning Explained</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">A shard is simply a subset of your total data, stored on a separate database server. Instead of one monolithic dataset living on one server, you divide it horizontally across multiple servers each responsible for a specific range or hash of data.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This is called horizontal partitioning, or sharding. Suppose an E-commerce company has 100 million customers.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo9; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 1 stores customers whose IDs start from 1–25 million</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo9; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 2 stores IDs from 25–50 million</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo9; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 3 stores IDs from 50–75 million</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo9; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 4 stores IDs from 75–100 million</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Each shard handles queries for its own range, so the load is spread evenly. Horizontal partitioning splits rows, which is more scalable for high-volume systems since it keeps schema consistent and allows parallelism.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2.3.1 Adding Shards for Capacity and Redundancy</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">One of the most powerful aspects of sharding is scaling by addition you don’t upgrade hardware, you just add another machine.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">When an e-commecrece company grows to 200 million users, you can:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l6 level1 lfo10; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Add new shards for new user ranges.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l6 level1 lfo10; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Redistribute existing data across shards (a process called resharding).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l6 level1 lfo10; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Automatically balance load so no single shard becomes a hotspot.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2.3.2 Shard Backups and Replication Strategies</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Each shard must also protect against hardware failures so shards are replicated. Replication means maintaining multiple copies of the same data across different servers (often in different zones or regions).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Usually, one node acts as the primary (handling writes), while others act as secondaries (handling reads or staying in sync).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example (MongoDB):</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo11; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Each shard is a replica set where Primary node handles all write operations and Secondary nodes replicate the data asynchronously. If the primary fails, one of the secondaries automatically becomes the new primary through an election process.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">This replication provides:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo11; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">High availability: Failover without downtime.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo11; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Disaster recovery: Even if one data center fails, another can continue serving.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo11; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Read scalability: Secondary replicas can handle read-heavy workloads.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2.3.3 Benefits: Scalability and Resilience</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">The router–shard–replica model brings two major benefits:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Scalability:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l11 level1 lfo12; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">By adding shards, you add both storage and processing capacity.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l11 level1 lfo12; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">More shards = more parallelism = higher throughput.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l11 level1 lfo12; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Horizontal scaling is near-linear when designed properly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Resilience:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l38 level1 lfo13; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Replicas ensure data durability and fault tolerance.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l38 level1 lfo13; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Even in node or rack failures, data remains accessible.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l38 level1 lfo13; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The system can self-heal via automatic failover and rebalancing.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In a replicaset of 3 nodes, if primary node crashes, a replica in another data center automatically takes over, and the router updates its routing metadata all in seconds, without user-visible downtime.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">2.3.4 Challenge: Cross-Shard Joins and Data Aggregation</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Distributed systems aren’t magic they trade simplicity for scale. One of the biggest trade-offs is cross-shard queries.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">When data relevant to a query lives across multiple shards:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l35 level1 lfo14; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The router must scatter the query to all shards.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l35 level1 lfo14; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Each shard processes its local part and returns results.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l35 level1 lfo14; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The router merges the results before sending them back to the client.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This is known as a scatter-gather operation, and it can be expensive. For example, if a report needs "total purchases across all users", every shard must contribute its partial total introducing latency and coordination overhead.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Mitigation Strategies</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l4 level1 lfo15; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Carefully design shard keys that localize related data together.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l4 level1 lfo15; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Pre-aggregate or cache computed results.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l4 level1 lfo15; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Use analytical systems like Spark or BigQuery for heavy aggregation workloads.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">The Router–Shard–Replica model unlocks true horizontal scalability — letting databases grow seamlessly as your data and users grow. However, scaling horizontally isn’t free: it introduces data distribution, query routing, and consistency challenges. Smart data modelling, thoughtful shard key selection, and robust replication strategies are what make this architecture both powerful and reliable in real-world systems.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">3. MongoDB: A Case Study in Sharded NoSQL Design</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">MongoDB is one of the most successful examples of a distributed database that prioritizes simplicity, scalability, and developer productivity. Its design elegantly demonstrates how the Router–Shard–Replica model works in practice, balancing high performance with fault tolerance.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Let’s explore MongoDB’s architecture piece by piece.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Introduction to MongoDB’s Distributed Architecture</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">At its core, MongoDB is built for horizontal scalability, meaning it can distribute data across multiple machines (shards) while keeping the application view consistent.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">A typical sharded MongoDB cluster has three major components:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">mongos: the query router</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Shard servers: the actual data-bearing nodes</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Config servers: the metadata managers</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Each shard itself is not just one server but a replica set, ensuring data redundancy and high availability. Let’s see how these parts work together to form a cohesive, resilient system.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">3.1 mongos: The Query Router</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">mongos is the entry point for all client applications. Think of it as MongoDB’s traffic controller, it knows where data resides and routes each request to the appropriate shard(s).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Here’s how it works:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l30 level1 lfo16; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">A client connects to a mongos instance instead of directly connecting to a shard.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l30 level1 lfo16; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The mongos consults the config servers to learn where the required data chunk resides.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l30 level1 lfo16; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">It forwards the query to the correct shard or, if necessary, to multiple shards (scatter–gather).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l30 level1 lfo16; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">It aggregates the results and sends them back to the client.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This means clients don’t need to worry about where their data lives, they just query MongoDB as if it were a single large database.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">If an e-comerce application stores user data sharded by userId, when a request for userId = 10234 arrives:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">mongos checks metadata in config servers.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l26 level1 lfo17; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Finds that userId 10234 is on Shard 2.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l26 level1 lfo17; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Sends the query to that shard and returns the results.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">3.2 Replica Sets: How MongoDB Ensures High Availability</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Each shard in MongoDB isn’t a single point of failure, it’s a replica set, a self-healing cluster of nodes that maintain copies of the same data.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">A replica set typically consists of:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l31 level1 lfo18; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">One primary node: Handles all write operations.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l31 level1 lfo18; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Multiple secondary nodes: Replicate the data from the primary asynchronously.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This structure gives MongoDB both high availability and read scalability. If the primary node fails, MongoDB’s built-in election mechanism automatically promotes a secondary to become the new primary usually within seconds.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">3.3 Primary vs Secondary Nodes</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Let’s look at how reads and writes behave across these nodes.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l3 level1 lfo19; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Writes: Always go to the primary node (to maintain a consistent order of operations).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l3 level1 lfo19; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Reads: By default, also go to the primary for the most up-to-date data. However, applications can choose to read from secondaries using read preferences for better performance and geographic locality.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">If application has a shard located in Singapore with:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l12 level1 lfo20; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Primary: Singapore</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l12 level1 lfo20; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Secondaries: Mumbai and London</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Then:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l8 level1 lfo21; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Users in India might read from Mumbai for lower latency.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l8 level1 lfo21; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Writes still go to the Singapore primary.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l8 level1 lfo21; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Data replication happens asynchronously, ensuring eventual consistency.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">3.4 Automatic Election Mechanism</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">MongoDB’s self-healing nature is one of its strongest features. If the primary node of a replica set goes down:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l43 level1 lfo22; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Secondaries detect the loss of heartbeat from the primary.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l43 level1 lfo22; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">They initiate an election process to choose a new primary.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l43 level1 lfo22; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The node with the most recent operations (highest replication log) is elected.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Once elected, the new primary starts accepting writes. This entire process happens automatically without manual intervention and ensure minimal downtime.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">If the Singapore primary crashes, the Mumbai secondary with the latest data becomes the new primary within ~10 seconds, and all traffic is rerouted accordingly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">3.5 Config Servers: Metadata and Routing Information</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Config servers are the brains of the sharded cluster they store the metadata that maps data chunks to shards.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">They maintain:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l25 level1 lfo23; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Which data ranges belong to which shards</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l25 level1 lfo23; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Cluster topology and sharding configuration</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l25 level1 lfo23; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Balancer state for redistributing chunks</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In a production setup, you’ll always find three config servers to ensure redundancy and quorum-based consistency. If a new shard is added or data is rebalanced, the config servers update this metadata, and mongos routers start using the new configuration almost instantly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">3.6 Shard Key Selection and Its Impact on Performance</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">The shard key is the single most important design decision in a MongoDB sharded cluster. It determines how data is distributed across shards and thus, how evenly your workload is balanced.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">A shard key can be:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l28 level1 lfo24; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Hashed (e.g., hash of userId): distributes data evenly but can make range queries slower.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l28 level1 lfo24; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Ranged (e.g., date or numeric range): supports efficient range queries but risks hotspotting if values are sequential.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In an e-commecre application, if you shard by region, and 80% of your traffic comes from Asia, your Asia shard will be overloaded and creating a hotspot. A better approach might be to shard by hash(userId) or (region, userId) composite key.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Always choose a shard key that:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l9 level1 lfo25; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Distributes data evenly</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l9 level1 lfo25; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Matches your most common query patterns</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Bad shard key selection is the #1 cause of performance issues in sharded MongoDB deployments.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">In summary, MongoDB is designed for a world where networks can fail. It prioritizes Availability (A) and Partition Tolerance (P), accepting eventually consistent reads from secondary nodes to achieve this. This isn't a weakness, it's a deliberate, powerful choice.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">However, MongoDB isn't designed for scenarios requiring strict, real-time cross-document transactions, for that, relational systems are better suited.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">4. Cassandra: A Ring-Based Approach to Distribution</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">While MongoDB uses a router–shard–replica hierarchy, Cassandra takes a very different route. It was designed from day one to handle massive, always-on, global-scale workloads with no single point of failure.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Let’s explore how it achieves that through its peer-to-peer ring architecture.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">The Peer-to-Peer Ring Architecture</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Cassandra’s core idea is very simple, every node in the cluster is equal there’s no master, router, or coordinator. All nodes form a ring, each responsible for a specific range of data determined by a partition key.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">How it works?</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l13 level1 lfo26; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Data is distributed across nodes using consistent hashing.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l13 level1 lfo26; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Each node is assigned a range of tokens (hash values).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l13 level1 lfo26; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">When a record is written, its partition key (say, user_id) is hashed to find which node owns it.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l13 level1 lfo26; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">That node (and its replicas) handle the read and write requests for that data.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l13 level1 lfo26; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Because every node knows the entire ring layout, any node can act as a coordinator, meaning the client can connect to any node, and it’ll route the request correctly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Let’s say we have four nodes with these token ranges:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Node A: 0 – 25</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Node B: 26 – 50</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Node C: 51 – 75</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Node D: 76 – 100</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">If a user with user_id = 43 writes data, it hashes to 43 </span><span face="&quot;Arial&quot;,sans-serif">→</span><span face="&quot;Verdana&quot;,sans-serif"> handled by Node B. Node B stores the data and replicates it to other nodes (as per replication strategy). Unlike MongoDB’s mongos, Cassandra doesn’t need a central router. The ring itself is the routing layer.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">4.1 How Cassandra Eliminates Single Points of Failure?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Cassandra’s masterless design is the cornerstone of its fault tolerance.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l42 level1 lfo28; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Every node can serve reads and writes.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l42 level1 lfo28; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">No node is special, removing any node doesn’t stop the cluster.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l42 level1 lfo28; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Metadata (cluster topology, ring ownership) is gossiped among nodes, so all stay synchronized.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">If one node fails:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l33 level1 lfo27; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Its data is still available from other replicas.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l33 level1 lfo27; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The system continues to operate without downtime.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l33 level1 lfo27; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">When the failed node recovers, it performs hinted handoff and read repair to catch up with missed writes.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example:</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l16 level1 lfo29; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">If Node B (responsible for user_id 43) goes down, Node C and Node D (replicas) still have copies of that user’s data.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l16 level1 lfo29; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Clients can still read and write, Cassandra automatically reroutes.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l16 level1 lfo29; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">When Node B comes back, it syncs missed updates from peers.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This design gives Cassandra continuous availability, even during network partitions or regional outages.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">4.2 Replication Strategies Across Nodes</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Cassandra doesn't just store one copy of data, it replicates it intelligently for fault tolerance and performance. Replication is controlled by the replication factor (RF) and strategy defined per keyspace (like a database).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Common Replication Strategies</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l32 level1 lfo30; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">SimpleStrategy (for single data centers): Data and its replicas are placed on the next N nodes clockwise in the ring.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l32 level1 lfo30; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">NetworkTopologyStrategy (for multiple data centers): You can specify how many replicas to keep per data center, enabling geo-redundancy.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">For a keyspace user_data:</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>CREATE KEYSPACE user_data WITH replication = { 'class': 'NetworkTopologyStrategy', 'us-east': 3, 'eu-west': 2 }; </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This keeps:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l18 level1 lfo31; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">3 replicas in the US-East region</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l18 level1 lfo31; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">2 replicas in EU-West</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">so even if one data center fails, another can continue serving.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">4.3 How Cassandra Handles Writes and Achieves Eventual Consistency</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Cassandra’s write path is one of its most efficient features. Writes are fast, sequential, and always accepted even during partial failures.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Here’s what happens step by step when a client writes data:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l36 level1 lfo32; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The client sends the write to any node (the coordinator).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l36 level1 lfo32; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The coordinator hashes the partition key to find the responsible node(s).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l36 level1 lfo32; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The coordinator forwards the write to all replica nodes.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Each replica:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l20 level1 lfo33; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Logs the write to its commit log (for durability),</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l20 level1 lfo33; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Writes it to an in-memory structure called a memtable.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l20 level1 lfo33; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The coordinator waits for acknowledgments from replicas (depending on consistency level).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l20 level1 lfo33; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Later, data is flushed to disk as an SSTable (sorted string table).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">This design makes writes append-only and non-blocking, which means Cassandra can sustain millions of writes per second.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">4.4 Consistency Levels and Eventual Consistency</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Cassandra is an AP (Available + Partition Tolerant) system in CAP terms. It sacrifices strict consistency in favor of availability, but allows you to tune consistency per query.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">You can specify consistency levels like:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l23 level1 lfo34; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">ONE: Wait for 1 replica acknowledgment (fastest, but weakest consistency)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l23 level1 lfo34; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">QUORUM: Wait for majority replicas (balanced)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l23 level1 lfo34; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">ALL: Wait for all replicas (strongest consistency, slower)</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">If replication factor = 3:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l17 level1 lfo35; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Write at QUORUM waits for 2 replicas to confirm.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l17 level1 lfo35; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Read at QUORUM ensures overlap with the write quorum, yields consistent results.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l17 level1 lfo35; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">This tunable model lets developers choose between speed and consistency per operation.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">How Cassandra achieves eventual consistency?</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l10 level1 lfo36; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Hinted handoff: Temporarily stores writes for unreachable nodes and replays later.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l10 level1 lfo36; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Read repair: During reads, if replicas have inconsistent data, Cassandra fixes them in the background.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l10 level1 lfo36; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Anti-entropy repair: Periodically syncs SSTables between replicas.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Together, these mechanisms guarantee that even if replicas temporarily diverge, they’ll eventually converge to a consistent state.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">5. Real-World Challenges in Scalable Databases</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Scaling databases horizontally sounds elegant in theory, add more nodes, distribute data, and handle more load. In practice, however distributed systems face unique operational challenges that impact performance, reliability, and cost efficiency.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">5.1 Resharding: Redistributing Data Safely When Scaling Out</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">When your data grows or your traffic spikes, you may need to add more shards (machines or partitions). But how do you move terabytes of data across the cluster without downtime or data loss?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Suppose you have 4 shards handling user data distributed by user_id:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l15 level1 lfo37; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 1 </span><span face="&quot;Arial&quot;,sans-serif">→</span><span face="&quot;Verdana&quot;,sans-serif"> Users 1–25M<span style="mso-spacerun: yes;">&nbsp; </span></span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l15 level1 lfo37; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 2 </span><span face="&quot;Arial&quot;,sans-serif">→</span><span face="&quot;Verdana&quot;,sans-serif"> Users 25M–50M<span style="mso-spacerun: yes;">&nbsp; </span></span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l15 level1 lfo37; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 3 </span><span face="&quot;Arial&quot;,sans-serif">→</span><span face="&quot;Verdana&quot;,sans-serif"> Users 50M–75M<span style="mso-spacerun: yes;">&nbsp; </span></span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l15 level1 lfo37; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Shard 4 </span><span face="&quot;Arial&quot;,sans-serif">→</span><span face="&quot;Verdana&quot;,sans-serif"> Users 75M–100M</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Now your user base doubles to 200M. You add 4 more shards. Resharding means repartitioning this range (e.g., 1–12.5M, 12.5–25M, etc.) and migrating chunks of data safely.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Challenges</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l7 level1 lfo38; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Data must move without blocking reads/writes.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l7 level1 lfo38; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Hash-based sharding is hard to rebalance evenly.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l7 level1 lfo38; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Range-based sharding can lead to hotspots if data isn’t evenly distributed.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">How Systems Handle It?</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l22 level1 lfo39; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">MongoDB uses a balancer process that moves chunks in the background.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l22 level1 lfo39; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Cassandra uses consistent hashing, which automatically redistributes data when new nodes join.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l22 level1 lfo39; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Spanner / Vitess use online resharding techniques with dual writes and data copy.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">5.2 Hotspots: The "Celebrity Problem" and Uneven Data Distribution</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Some data items become "celebrities", they receive disproportionate read/write traffic. Even in a well sharded system, that single record can overload one shard.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">For example, In a social media app</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">"@elonmusk" or "@cristiano" might get millions of hits per second.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">All requests for that username land on the same shard.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Impact</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l29 level1 lfo40; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">One shard becomes the bottleneck.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l29 level1 lfo40; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Latency increases.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l29 level1 lfo40; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">The rest of the cluster sits underutilized.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Solutions</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l21 level1 lfo41; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Key Salting: Add random suffixes/prefixes (e.g., “@elonmusk_1”, “@elonmusk_2”) to distribute traffic.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l21 level1 lfo41; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Read Replicas: Serve reads from multiple replicas instead of one.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l21 level1 lfo41; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Caching Layers: Use Redis or CDN caching to offload frequent reads.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l21 level1 lfo41; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Adaptive Load Balancing: Detect and redistribute "hot" keys dynamically.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Hotspots are not about lack of capacity, they’re about imbalanced demand on specific partitions.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">5.3 Smart Routing Algorithms and Adaptive Sharding Strategies</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Routing each query to the correct shard efficiently becomes tricky as the number of shards grows. </span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">For example, a router node (like mongos in MongoDB or a coordinator in Cassandra) must know where to find the document for user_id=73,459,182. With 100+ shards, a naive routing approach can become costly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Techniques Used</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l34 level1 lfo42; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Consistent Hashing: Ensures minimal data movement when nodes are added or removed.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l34 level1 lfo42; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Directory-Based Sharding: Maintain a metadata table that maps key ranges to the shard locations.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l34 level1 lfo42; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Adaptive Routing: Systems like CockroachDB monitor query latency and dynamically adjust routing paths.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">5.4 Balancing Traffic Across Shards Dynamically</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">Even with correct sharding, workloads change over time. Certain shards may become busier (due to regional traffic, new app features, or time-based events).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Example</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l39 level1 lfo43; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">An e-commerce site sees spikes in one country during a festival.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l39 level1 lfo43; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">All users from that region are mapped to a specific shard.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l39 level1 lfo43; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">That shard becomes overloaded while others stay idle.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">Solutions</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l27 level1 lfo44; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Auto-balancing: Monitor load and redistribute ranges or replicas dynamically.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l27 level1 lfo44; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Dynamic Shard Splitting: Split a heavily loaded shard into smaller sub-shards.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l27 level1 lfo44; text-indent: -18pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif">Traffic-aware Proxying: Route new sessions to less-loaded shards.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif">References</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif"><a href="https://engineering.fb.com/2013/06/25/core-infra/tao-the-power-of-the-graph/">https://engineering.fb.com/2013/06/25/core-infra/tao-the-power-of-the-graph/</a></span></p> <p class="MsoNoSpacing"><br /></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif">&nbsp;</span></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}a:link, span.MsoHyperlink {mso-style-priority:99; color:#467886; mso-themecolor:hyperlink; text-decoration:underline; text-underline:single;}a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:#96607D; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2023/10/system-design-questions.html"><b>System Design Questions</b></a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-75043985306618124692025-10-21T01:41:00.000-07:002025-10-30T07:57:46.101-07:00Querying Apache Druid via HTTP APIs<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Apache Druid supports both SQL and native query APIs. Understanding both is crucial for flexible and optimized querying depending on your use case. In this post, we'll walk through how to run both SQL and native queries using curl, leveraging a sample sales dataset.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For example, I onboarded following sales_data to Druid.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">sales_data.csv</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>timestamp,product,city,total_sales 2025-04-01T10:00:00Z,Laptop,Delhi,300 2025-04-01T10:00:00Z,Laptop,Delhi,200 2025-04-01T11:00:00Z,Tablet,Mumbai,150 2025-04-01T11:00:00Z,Tablet,Mumbai,50 2025-04-01T12:00:00Z,Mobile,Bengaluru,200 2025-04-01T13:00:00Z,Laptop,Hyderabad,250 2025-04-01T14:00:00Z,Tablet,Chennai,180 2025-04-01T15:00:00Z,Mobile,Pune,220 2025-04-01T15:00:00Z,Mobile,Pune,80 </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUA_CZ8RAS35kJBQhxW3KRZroq61aufCNOXtjcRtYPkPuy6BWcMDDTD5uBAIF-PDyl3hqyyqfM8le_MnJ7Imu-eziL2nC3ig3W9QZegq4_QwyxI8ZVkkWp7pftijlfniIS3KW3Pvx5q_MqeoG-KHc3x8FBUqqD8DSS961OZo3xbavx4IRrloVl-FQrEI/s1384/druid%20http%20api%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="980" data-original-width="1384" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUA_CZ8RAS35kJBQhxW3KRZroq61aufCNOXtjcRtYPkPuy6BWcMDDTD5uBAIF-PDyl3hqyyqfM8le_MnJ7Imu-eziL2nC3ig3W9QZegq4_QwyxI8ZVkkWp7pftijlfniIS3KW3Pvx5q_MqeoG-KHc3x8FBUqqD8DSS961OZo3xbavx4IRrloVl-FQrEI/w400-h284/druid%20http%20api%201.png" width="400" /></a></b></div><b><br />&nbsp;</b><p></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. SQL Query via /druid/v2/sql</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Druid’s SQL endpoint allows for familiar querying syntax:</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example SQL Query</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Get total sales per product</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">SELECT</span><span style="color: #bbbbbb;"> </span>product,<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">SUM</span>(total_sales)<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">AS</span><span style="color: #bbbbbb;"> </span>total_sales <span style="color: #008800; font-weight: bold;">FROM</span><span style="color: #bbbbbb;"> </span>sales_data <span style="color: #008800; font-weight: bold;">GROUP</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">BY</span><span style="color: #bbbbbb;"> </span>product <span style="color: #008800; font-weight: bold;">ORDER</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">BY</span><span style="color: #bbbbbb;"> </span>total_sales<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">DESC</span> </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi39-CU_LVA3EPBSE-4RO8dXXvW_77NacDtEfIZH6lL9dEjhM_2cYI_Vxuu_j2qGtT5k1Fd7zdnCLe8cv1CxGw2g2ynUkxIiU-GUyBIRfsZqZ9rmakm8VmZzv_nQ35aHpRHJ3V95KZCkuQ9mid_CvSEjd3DiVXOhKQTSIwwGSnb03Rbj2cxSXI7lLUFLjM/s1384/druid%20http%20api%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="638" data-original-width="1384" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi39-CU_LVA3EPBSE-4RO8dXXvW_77NacDtEfIZH6lL9dEjhM_2cYI_Vxuu_j2qGtT5k1Fd7zdnCLe8cv1CxGw2g2ynUkxIiU-GUyBIRfsZqZ9rmakm8VmZzv_nQ35aHpRHJ3V95KZCkuQ9mid_CvSEjd3DiVXOhKQTSIwwGSnb03Rbj2cxSXI7lLUFLjM/w400-h185/druid%20http%20api%202.png" width="400" /></a></b></div><b><br />&nbsp;</b><p></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Execute Using curl</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Save the following to a file sql_query.json.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p><p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">sql_query.json</span></b>&nbsp;</p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"query"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"SELECT product, SUM(total_sales) AS total_sales FROM sales_data GROUP BY product ORDER BY total_sales DESC"</span> } </pre></div> <p>&nbsp; </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Run the query</span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST http://localhost:8888/druid/v2/sql -H 'Content-Type:application/json' -d @sql_query.json </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$curl -X POST http://localhost:8888/druid/v2/sql -H 'Content-Type:application/json' -d @sql_query.json [{"product":"Laptop","total_sales":750.0},{"product":"Mobile","total_sales":500.0},{"product":"Tablet","total_sales":380.0}] </pre></div> <p> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You can pass this curl output to jq command to pretty print.</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$curl -X POST http://localhost:8888/druid/v2/sql -H 'Content-Type:application/json' -d @sql_query.json | jq % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 246 100 125 100 121 9939 9621 --:--:-- --:--:-- --:--:-- 20500 [ { "product": "Laptop", "total_sales": 750.0 }, { "product": "Mobile", "total_sales": 500.0 }, { "product": "Tablet", "total_sales": 380.0 } ] </pre></div> <p>&nbsp; </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You can even pass the payload directly to druid/v2/sql API.</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST http://localhost:8888/druid/v2/sql -H 'Content-Type:application/json' -d '{"query":"SELECT product, SUM(total_sales) AS total_sales FROM sales_data GROUP BY product ORDER BY total_sales DESC"}' </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$curl -X POST http://localhost:8888/druid/v2/sql -H 'Content-Type:application/json' -d '{"query":"SELECT product, SUM(total_sales) AS total_sales FROM sales_data GROUP BY product ORDER BY total_sales DESC"}' | jq % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 243 100 125 100 118 9806 9257 --:--:-- --:--:-- --:--:-- 20250 [ { "product": "Laptop", "total_sales": 750.0 }, { "product": "Mobile", "total_sales": 500.0 }, { "product": "Tablet", "total_sales": 380.0 } ] </pre></div> <p> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Native Query via /druid/v2</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Native queries are powerful, fine-grained JSON-based constructs used for more complex operations.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example Native Query</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Equivalent native groupBy query for total sales per product:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Save to native_query.json.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Execute Using curl</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">native_query.json </span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"groupBy"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"granularity"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"all"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dimensions"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"product"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"aggregations"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"longSum"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"fieldName"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span> <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T00:00:00.000Z/2025-04-02T00:00:00.000Z"</span>] } </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST http://localhost:8888/druid/v2/?pretty -H 'Content-Type:application/json' -d @native_query.json </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$curl -X POST http://localhost:8888/druid/v2/?pretty -H 'Content-Type:application/json' -d @native_query.json [ { "version" : "v1", "timestamp" : "2025-04-01T00:00:00.000Z", "event" : { "product" : "Laptop", "total_sales" : 750 } }, { "version" : "v1", "timestamp" : "2025-04-01T00:00:00.000Z", "event" : { "product" : "Mobile", "total_sales" : 500 } }, { "version" : "v1", "timestamp" : "2025-04-01T00:00:00.000Z", "event" : { "product" : "Tablet", "total_sales" : 380 } } ] </pre></div> <p>&nbsp; </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Passing Native Query payload inline</span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST http://localhost:8888/druid/v2/?pretty -H 'Content-Type:application/json' -d '{"queryType":"groupBy","dataSource":"sales_data","granularity":"all","dimensions":["product"],"aggregations":[{"type":"longSum","name":"total_sales","fieldName":"sales"}],"intervals":["2025-04-01T00:00:00.000Z/2025-04-02T00:00:00.000Z"]}' </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$ curl -X POST http://localhost:8888/druid/v2/?pretty -H 'Content-Type:application/json' -d '{"queryType":"groupBy","dataSource":"sales_data","granularity":"all","dimensions":["product"],"aggregations":[{"type":"longSum","name":"total_sales","fieldName":"sales"}],"intervals":["2025-04-01T00:00:00.000Z/2025-04-02T00:00:00.000Z"]}' [ { "version" : "v1", "timestamp" : "2025-04-01T00:00:00.000Z", "event" : { "product" : "Laptop", "total_sales" : null } }, { "version" : "v1", "timestamp" : "2025-04-01T00:00:00.000Z", "event" : { "product" : "Mobile", "total_sales" : null } }, { "version" : "v1", "timestamp" : "2025-04-01T00:00:00.000Z", "event" : { "product" : "Tablet", "total_sales" : null } } ] </pre></div> <p>&nbsp;</p><p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/exploring-apache-druid-native-queries.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/apache-pinot-vs-druid-which-real-time.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-67318816960427183592025-10-21T01:32:00.000-07:002025-10-30T08:20:12.870-07:00Smart Query Routing in Langchain4j: From Default Strategies to LLM-Powered Decisions<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In retrieval-augmented generation (RAG) systems, deciding where to send a user’s query is just as important as how to answer it. As applications scale to use multiple data sources like internal documents, product databases, chat history, or public knowledge, the system needs a smart way to route each query to the right data sources. That’s where QueryRouter in Langchain4j comes in.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This post helps you understand, how Langchain4j’s QueryRouter interface enables intelligent query routing, compares its built-in implementations, and explores how developers can use this routing logic to fit their applications.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. What is Query Routing in RAG Systems?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Query routing refers to the process of deciding which data sources a user's query should be sent to, especially when there are multiple potential sources of information. In the context of RAG (Retrieval-Augmented Generation) systems, this becomes critical because:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The system doesn't know the answer itself, it must retrieve supporting content from external sources before generating a response.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">These sources could be diverse, product FAQs, code documentation, user chat history, financial records, or even web search results.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Query routing ensures that each query is routed only to the most relevant source(s), rather than flooding all sources with every question.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example: Imagine you’re in a library that has sections for science, history, fiction, law, and art. If you ask a question like “What is Newton’s First Law?”, it would be wasteful (and confusing) if the librarian checks every section. Instead, the librarian should route your question directly to the science section. This is exactly what query routing does in a RAG system, it plays the role of that intelligent librarian.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2eSNYPmYY1rCUIVC5GU7AU_gh74zIurYwfO-sUbILZZiYZwMHlsefZNd3-PklYs6j-9-XaE-fvJf3QkUv2dee-p3CPExEJhw8D-H-jU_eYrEwZXxUlYHD67s6uYpuztJqUJaLkIFFZkoJ30NYreEpTvRxjuf_VKeI_4nm1_vpnGzXcxfnIUuC5ZOspFM/s1396/rag%20query%20routing%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1396" data-original-width="532" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2eSNYPmYY1rCUIVC5GU7AU_gh74zIurYwfO-sUbILZZiYZwMHlsefZNd3-PklYs6j-9-XaE-fvJf3QkUv2dee-p3CPExEJhw8D-H-jU_eYrEwZXxUlYHD67s6uYpuztJqUJaLkIFFZkoJ30NYreEpTvRxjuf_VKeI_4nm1_vpnGzXcxfnIUuC5ZOspFM/s320/rag%20query%20routing%201.png" width="122" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Why Irrelevant Data Retrieval is a Problem?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Without proper query routing, the system might send every query to all available retrievers or databases. This creates several issues:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Performance Overhead: More retrievers means more computation. Fetching irrelevant documents increases processing time and costs, especially if using embeddings or LLMs for retrieval.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Latency Increase: Retrieving from every source leads to slower response times, especially problematic in real-time chat applications.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Answer Quality Degradation" Including unrelated documents in the context window can confuse the language model, leading to hallucinations or diluted answers.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Wasted API/Infra Costs: Many retrieval services are usage-based. Querying unnecessary retrievers drives up costs without improving results.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3. Benefits of Effective Query Routing</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Smart query routing enables:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Higher Accuracy: By routing queries only to relevant sources, the retrieved content is more likely to be useful, improving the quality of the LLM’s response.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Lower Latency: Querying fewer retrievers leads to faster retrieval and quicker final responses.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Scalability: As you add more data sources (e.g., documents, APIs, databases), you can continue scaling without overwhelming the system.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Context Optimization: It avoids context window overflow and preserving space for genuinely helpful content.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Improved User Experience: Faster, more accurate, and less noisy responses directly improve user trust and satisfaction.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">4. QueryRouter Interface in Langchain4j</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The QueryRouter interface in Langchain4j is designed to route a Query object to one or more ContentRetriever instances. This decision is typically based on the nature of the query, user metadata, or semantic meaning.</span></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here is the contract:</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">QueryRouter</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;">&lt;</span>ContentRetriever<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">route</span>(Query<span style="color: #bbbbbb;"> </span>query); } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When a query arrives, the route() method decides which ContentRetrievers (e.g., vector stores, database retrievers, document retrievers) should handle the query. The goal is to avoid retrieving irrelevant content and optimize the downstream generation step.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Built-in Implementations of QueryRouter in Langchain4j</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Langchain4j provides two implementations of the QueryRouter interface, each designed for different stages of application complexity and scalability:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">DefaultQueryRouter: simple and suitable for most basic use cases.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LanguageModelQueryRouter: intelligent, LLM-powered routing for dynamic, content-aware decisions.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">4.1 DefaultQueryRouter: </span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">DefaultQueryRouter is the simplest and most straightforward implementation of the QueryRouter interface. It is also the default routing mechanism used internally by the DefaultRetrievalAugmentor.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">DefaultQueryRouter</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">implements</span><span style="color: #bbbbbb;"> </span>QueryRouter<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// routes to all configured ContentRetrievers</span> } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This router sends every query to all the retrievers that were provided to it during construction. It assumes all retrievers are relevant for any query, regardless of the query’s content or context.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This implementation is ideal when:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You have a small number of retrievers (e.g., 2–3).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">All retrievers are semantically similar or overlapping.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You are in the early stage of building your RAG system.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Performance and routing precision are not major concerns yet.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Limitations</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">May lead to performance degradation when the number of retrievers increases.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Fetches potentially irrelevant documents, which can confuse the language model.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Not suitable for use cases requiring domain-specific or context-aware routing.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The class documentation clearly mentions that while DefaultQueryRouter works for most use cases now, its default behavior may evolve over time if better routing logic becomes standard.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">4.2 LanguageModelQueryRouter</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LanguageModelQueryRouter brings intelligent, dynamic routing to the system. It uses an LLM (via a ChatModel) to decide which retriever(s) are most relevant for a given query.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">LanguageModelQueryRouter</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">implements</span><span style="color: #bbbbbb;"> </span>QueryRouter<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// uses an LLM to choose retrievers based on the query</span> } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How It Works?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each ContentRetriever is configured with a natural language description (e.g., “Handles queries related to HR policies.”). When a query arrives, the LLM is prompted with:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The query itself.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Descriptions of all available retrievers.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The model selects one or more retrievers based on semantic understanding.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This router use following prompt to find the suitable content retrievers.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">final</span><span style="color: #bbbbbb;"> </span>PromptTemplate<span style="color: #bbbbbb;"> </span>DEFAULT_PROMPT_TEMPLATE<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>PromptTemplate.<span style="color: #0000cc;">from</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Based on the user query, determine the most suitable data source(s) \</span> <span style="background-color: #fff0f0;"> to retrieve relevant information from the following options:</span> <span style="background-color: #fff0f0;"> {{options}}</span> <span style="background-color: #fff0f0;"> It is very important that your answer consists of either a single number \</span> <span style="background-color: #fff0f0;"> or multiple numbers separated by commas and nothing else!</span> <span style="background-color: #fff0f0;"> User query: {{query}}"""</span> <span style="color: #bbbbbb;"> </span>); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You can even configure a custom prompt template (promptTemplate) to control how the LLM interprets and decides routing.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This is ideal when:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Your application deals with various domains or topics.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You need semantic-level understanding to decide retriever relevance.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You have many retrievers, each tied to a specific dataset.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You want to minimize noise in the LLM’s input context.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For example, if your application has following retrievers:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">HR Retriever: "Provides info on employee benefits and leave policies."</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IT Retriever: "Handles technical issues like password resets and VPN."</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Finance Retriever: "Answers queries related to reimbursements and taxes."</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">And the user query is: "How do I file a reimbursement for a business trip?" The LanguageModelQueryRouter will intelligently route it only to the Finance Retriever, not HR or IT.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample Application</span></b></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Following program demonstrates how to dynamically route user queries to the most relevant content stores using LangChain4j’s LanguageModelQueryRouter. </span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">QueryRouterDemo.java</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.router</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.Query</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.router.LanguageModelQueryRouter</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Collection</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">QueryRouterDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model for routing</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Shared embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create embedding stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create content retrievers</span> <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>hrRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(hrStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"hrRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>itRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(itStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"itRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>financeRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(financeStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"financeRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>retrieverToDescription<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>hrRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Provides information on leave policies, benefits, onboarding, and other HR-related topics."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>itRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Handles technical queries such as VPN access, email issues, password resets, and software installations."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>financeRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Answers questions related to reimbursements, payslips, taxation, invoices, and financial approvals."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create LLM-based router</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter<span style="color: #bbbbbb;"> </span>router<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrieverToDescription</span>(retrieverToDescription) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Sample queries</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>queries<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How do I reset my email password?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Where can I see my payslip for last month?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"What is the company policy on medical leave?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How to claim business travel reimbursement?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"I'm facing issues connecting to the VPN."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>queries)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>Query<span style="color: #bbbbbb;"> </span>query<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Query.<span style="color: #0000cc;">from</span>(userQuery); <span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;">&lt;</span>ContentRetriever<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>retrievers<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>router.<span style="color: #0000cc;">route</span>(query); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Query: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>userQuery); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(ContentRetriever<span style="color: #bbbbbb;"> </span>retriever<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>retrievers)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"-&gt; Routed to: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>retriever); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"---------------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNormal"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Query: How do I reset my email password? -&gt; Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'} --------------------------------------------------- Query: Where can I see my payslip for last month? -&gt; Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'} -&gt; Routed to: EmbeddingStoreContentRetriever{displayName='financeRetriever'} --------------------------------------------------- Query: What is the company policy on medical leave? -&gt; Routed to: EmbeddingStoreContentRetriever{displayName='financeRetriever'} --------------------------------------------------- Query: How to claim business travel reimbursement? -&gt; Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'} -&gt; Routed to: EmbeddingStoreContentRetriever{displayName='financeRetriever'} --------------------------------------------------- Query: I'm facing issues connecting to the VPN. -&gt; Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'} --------------------------------------------------- </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below complete working application.</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">QueryRouterFullApp.java</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.router</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.chat.MessageWindowChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.DefaultRetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.RetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.router.LanguageModelQueryRouter</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.transformer.ExpandingQueryTransformer</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.AiServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">QueryRouterFullApp</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatAssistant</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">chat</span>(String<span style="color: #bbbbbb;"> </span>userMessage); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize LLM model for routing and chatting</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Shared embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create embedding stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Sample data for ingestion</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>hrDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Our HR policies include flexible work hours, medical leave, and onboarding support.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You can check your leave balance and benefits on the HR portal.</span> <span style="background-color: #fff0f0;"> """</span> <span style="color: #bbbbbb;"> </span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>itDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> If you're facing issues with VPN, restart your system and try again.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Password resets can be done via the IT Helpdesk portal.</span> <span style="background-color: #fff0f0;"> """</span> <span style="color: #bbbbbb;"> </span>); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>financeDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Payslips are generated on the 5th of every month and available on the finance dashboard.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> You can file business travel reimbursements through the expense portal.</span> <span style="background-color: #fff0f0;"> """</span> <span style="color: #bbbbbb;"> </span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Ingest documents into respective stores</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(hrDocs),<span style="color: #bbbbbb;"> </span>hrStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(itDocs),<span style="color: #bbbbbb;"> </span>itStore); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(convertToDocuments(financeDocs),<span style="color: #bbbbbb;"> </span>financeStore); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create content retrievers</span> <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>hrRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(hrStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"hrRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>itRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(itStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"itRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>financeRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(financeStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">displayName</span>(<span style="background-color: #fff0f0;">"financeRetriever"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>retrieverToDescription<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>hrRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Provides information on leave policies, benefits, onboarding, and other HR-related topics."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>itRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Handles technical queries such as VPN access, email issues, password resets, and software installations."</span>); <span style="color: #bbbbbb;"> </span>retrieverToDescription.<span style="color: #0000cc;">put</span>( <span style="color: #bbbbbb;"> </span>financeRetriever, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Answers questions related to reimbursements, payslips, taxation, invoices, and financial approvals."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create LLM-based router</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter<span style="color: #bbbbbb;"> </span>router<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>LanguageModelQueryRouter.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrieverToDescription</span>(retrieverToDescription) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Expand queries (optional step for better retrieval)</span> <span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer<span style="color: #bbbbbb;"> </span>expandingQueryTransformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer(chatModel,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">3</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Create retrieval augmentor with dynamic contentRetriever via router</span> <span style="color: #bbbbbb;"> </span>RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryRouter</span>(router) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Build the assistant</span> <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Run a conversation</span> <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>userQueries<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How do I reset my email password?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Where can I see my payslip for last month?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"What is the company policy on medical leave?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"How to claim business travel reimbursement?"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"I'm facing issues connecting to the VPN."</span> <span style="color: #bbbbbb;"> </span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>userQueries)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"User: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>userQuery); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>answer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatAssistant.<span style="color: #0000cc;">chat</span>(userQuery); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Assistant: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>answer); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"-----------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>text<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(Document.<span style="color: #0000cc;">from</span>(text)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">return</span><span style="color: #bbbbbb;"> </span>documents; <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNormal"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>User: How do I reset my email password? Assistant: To reset your email password, follow these steps: 1. Go to the IT Helpdesk portal. 2. Fill out the required details in the password reset form. 3. If you're experiencing issues with a Virtual Private Network (VPN), try restarting your system and then retrying the password reset process. That's it! ----------------------------------------------- User: Where can I see my payslip for last month? Assistant: To view your payslip for last month, follow these steps: 1. Go to the finance dashboard. 2. Check if the latest month's payslip has been generated (typically available on the 5th of every month). 3. If you're experiencing issues with a VPN, restart your system and try accessing the payslip again. Note: You can also check other HR-related information, such as leave balance and benefits, on the HR portal. ----------------------------------------------- User: What is the company policy on medical leave? Assistant: The company's policy on medical leave is stated in their HR policies, which include: * Flexible work hours * Medical leave (specific details not provided) For more information about your specific situation, including your leave balance and benefits, you can check these details on the HR portal. Note that none of this information provides direct guidance on the actual company policy, but rather informs where to find more information about it. ----------------------------------------------- User: How to claim business travel reimbursement? Assistant: To claim business travel reimbursement, follow these steps: 1. Go to the expense portal. 2. File your business travel reimbursements through this platform. That's it! This is where you can submit your expenses for reimbursement. ----------------------------------------------- User: I'm facing issues connecting to the VPN. Assistant: To resolve VPN connection issues: 1. Restart your system. 2. Try reconnecting to the VPN again. This may help resolve any temporary connectivity problems. If you continue to experience issues, you can also consider resetting your password using the IT Helpdesk portal. ----------------------------------------------- </pre></div> <p class="MsoNoSpacing"><br /></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/enhancing-rag-retrievals-in-langchain4j.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/content-retrievers-in-langchain4j.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-68312241931784966252025-10-13T07:45:00.000-07:002025-10-13T07:45:59.715-07:00Why Distributed Transactions Are Hard: The Hidden Cost of Scaling Relational Databases Horizontally<p><span style="font-family: &quot;Verdana&quot;,sans-serif;">As applications scale and demand increases, developers often look to horizontally scale their databases to handle larger workloads. While this approach helps with performance and availability, it introduces a less visible but critical challenge: managing transactions across multiple nodes.</span></p><p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In a traditional, single-node relational database, maintaining ACID properties is straightforward, everything happens in one place. But when data and operations span across distributed systems, transactions become complex, fragile, and costly to orchestrate.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">This post helps you to understand why distributed transactions are difficult, how they impact system performance under heavy load, and what tools or architectural patterns you might consider to overcome these limitations.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">1. Horizontal Scaling</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Horizontal scaling refers to adding more machines (nodes) to a system to distribute the load across multiple computing resources. Each node runs an instance of the application or database and participates in processing requests.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In the context of Databases,</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Vertical Scaling:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Increases capacity of a single database instance by upgrading hardware (CPU, RAM, IOPS), so it can serve more traffic/user requests. It is simpler to implement, and<span style="mso-spacerun: yes;">&nbsp; </span>minimal changes might be needed to the application code or DBMS configuration.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">But Vertical Scaling is subject to physical hardware constraints. High availability may still require replicas, adding more hardware/procuring high end servers always incurs cost.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Horizontal Scaling:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> It involves distributing data and queries across multiple database instances. Following are the some common approaches used widely.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Read Replicas: multiple read-only replicas handle read queries, and the primary node handles writes.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Sharding: dataset is partitioned by shard key (e.g., user ID ranges), each shard resides on a different node.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l1 level1 lfo1; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Federated Databases: A federated database system integrates several independent, often geographically distributed, databases into one virtual database. This unified view allows users and applications to query data as if it resided in a single database, without needing to be aware of the underlying complexities or physical locations of the individual databases. In this model, each node is responsible for a subset of data, with coordination at the application layer.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">1.1 Technical Challenges of Horizontal Scaling</span></b></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Data Partitioning (Sharding):</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> requires a shard key strategy that minimizes cross-shard queries. If the shard key is not desingned properly, then there is a risk of uneven data distribution (hot spots).</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Distributed Transactions:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> ACID properties guarantees across multiple nodes require protocols like 2PC (Two-Phase Commit) or saga patterns, which add latency and complexity.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Data Consistency:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Achieving strong consistency across replicas or shards is non-trivial. Here CAP Theorem applies, which states that consistency, availability, and partition tolerance cannot be fully achieved simultaneously in distributed systems.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Replication Lag:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> In asynchronous replication, data changes made to the primary database are not immediately reflected in the read replicas. As a result, applications reading from replicas might receive stale or outdated data. This can lead to inconsistencies, especially in systems that rely on real-time accuracy.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Joins are Expensive:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> When data is spread across multiple shards, performing operations like joins becomes challenging. Joins across shards are either very expensive in terms of performance or not supported natively by many databases. This limitation can slow down complex queries and affect the overall efficiency of the system.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">To handle these challenges, applications often require extra logic at the application level or need to use distributed query engines. These tools help coordinate data across shards and replicas, but they also add complexity to the system architecture.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">2. Distributed Transactions</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">A distributed transaction is a database transaction that spans multiple independent systems or databases (usually across different servers or nodes), and must be executed in a coordinated way so that either all operations succeed, or all fail, and ensures atomicity and consistency across systems.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">2.1 ACID Transactions in a Single Node vs Distributed Environment</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In a non-distributed relational database, all components reside within a single system. Write operations are typically handled by a primary node, while read operations can be offloaded to multiple replica (or "slave") nodes. The database engine centrally manages tables, indexes, logs, buffers, and locks.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">When a transaction spans multiple tables, it is coordinated internally using local ACID properties there is no need for external coordination.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">BEGIN;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;"><span style="mso-spacerun: yes;">&nbsp; </span>UPDATE accounts SET balance = balance - 500 WHERE id = 1;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;"><span style="mso-spacerun: yes;">&nbsp; </span>UPDATE accounts SET balance = balance + 500 WHERE id = 2;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">COMMIT;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">This entire transaction is atomic and isolated because it is executed within a single database engine on one machine.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Whereas in a distributed environment:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Atomicity: Every part of the transaction must either commit completely or not at all, spanning multiple nodes.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Consistency: All nodes must maintain a consistent state (Some systems support Eventual consistency), even in the event of failures.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Isolation: Concurrent transactions must be properly managed across distributed resources.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo2; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Durability: Once committed, a transaction’s changes must be permanently recorded across multiple systems.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">2.2 Why it is difficult to implement Distributed Transactions?</span></b></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Network Latency and Failures:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Implementing distributed transactions is difficult largely because they depend heavily on network communication between multiple, physically separate nodes. Unlike a single-server system where data and transaction coordination happen internally with minimal delay, distributed systems must send messages back and forth over a network. This introduces network latency, meaning every step in the transaction like preparing, committing, or rolling back changes on different nodes takes longer simply because of the time it takes for data to travel across the network. Moreover, networks are inherently unreliable, packets can be lost, delayed, duplicated, or nodes can become temporarily unreachable due to hardware failures, maintenance, or congestion. These uncertainties raise the risk of partial failures where some nodes successfully commit their part of the transaction, while others do not. Handling such inconsistencies requires complex coordination protocols and recovery mechanisms, which add overhead and further increase latency. Together, network delays and the possibility of failures make maintaining atomicity and consistency across distributed transactions a challenging problem in distributed systems.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Two-Phase Commit (2PC):</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> It is a classic protocol designed to ensure that distributed transactions maintain ACID properties (atomicity, consistency, isolation, and durability) across multiple database nodes. It works in two main stages: </span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l2 level1 lfo3; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">First, in the prepare phase, the coordinator sends a request to all participating nodes asking if they are ready to commit the transaction. Each node performs all necessary checks and writes the transaction changes to a temporary log but does not finalize the commit yet. They then respond with either a “yes” (ready to commit) or “no” (abort). Only if all nodes reply “yes” does the coordinator proceed to the second stage, </span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l2 level1 lfo3; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Second the commit phase, where it instructs all nodes to finalize and permanently commit the changes. If any node fails to commit, the coordinator tells all nodes to roll back the transaction or some manual intervention might be needed.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">While 2PC guarantees atomicity across nodes, it has some significant drawbacks. Because all nodes must wait for each other’s responses, the protocol can become slow under heavy load, as network communication and disk writes add latency. Moreover, 2PC is a blocking protocol, if any node or the coordinator crashes after the prepare phase but before sending the commit or rollback message, the other nodes remain locked in a waiting state, unable to proceed or release resources. This can cause the entire system to stall unless complex recovery mechanisms or timeouts are implemented, which adds further complexity to distributed transaction management.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Concurrency and Locking:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> When a database is distributed across multiple nodes, managing concurrency, the ability for multiple transactions to run simultaneously without interfering with each other becomes significantly more challenging. Each node must enforce locks on the data it manages to ensure transactions don’t overwrite or read inconsistent data. As the number of nodes increases, so does the total number of locks held across the system. This higher volume of locks raises the chances of deadlocks. Additionally, contention increases as multiple transactions compete for the same resources, causing some to wait longer before they can proceed. This waiting leads to blocking, where transactions are forced to pause until the necessary locks are released. Together, these issues reduce the system’s overall throughput (the number of transactions completed in a given time) and add complexity to concurrency control mechanisms. Distributed systems must implement efficient algorithms to detect and resolve deadlocks, manage lock timeouts, and optimize resource access, making concurrency control a major challenge as the system scales horizontally.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Consistency Models:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Maintaining strong consistency across distributed nodes means ensuring that every node always sees the same up-to-date data at any given time. Achieving this requires constant synchronization between all the nodes so that updates are immediately reflected everywhere. However, in a distributed system, network delays, failures, or partitions, where nodes become temporarily unreachable make perfect synchronization difficult. </span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">According to the CAP theorem, a distributed system can only guarantee two out of following three properties at the same time.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l0 level1 lfo4; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Consistency, </span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l0 level1 lfo4; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Availability, and </span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l0 level1 lfo4; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Partition tolerance. </span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Prioritizing strong consistency often means sacrificing availability because the system must wait for all nodes to synchronize before responding to requests. Alternatively, if the system remains available during network partitions, it may have to allow some nodes to operate on stale data, sacrificing strict consistency. This fundamental trade-off means that maintaining strong consistency in distributed systems is complex and often involves balancing synchronization overhead, response times, and fault tolerance.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In summary, we need an effective and robust distributed transaction manager (TM), which is a critical component for ensuring reliable coordination of transactions that span multiple nodes or services in a distributed system. The TM’s primary responsibility is to orchestrate the entire lifecycle of a distributed transaction, making sure it adheres to ACID properties across all participants. To do this, the TM communicates with all involved resource managers (such as different databases or microservices), coordinating their actions to prepare, commit, or roll back changes in a way that maintains global consistency.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">The TM must also handle failure recovery gracefully. This involves detecting and resolving partial failures where some nodes may have committed while others failed, as well as managing situations where the TM or participants crash during the transaction process. It typically uses durable logs to record transaction states and decisions, enabling it to resume or roll back incomplete transactions after a failure.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In addition, the TM often implements standard protocols like Two-Phase Commit (2PC) or more advanced consensus algorithms to ensure reliable communication and coordination. It abstracts the complexity of distributed coordination away from individual resource managers, providing a unified interface that guarantees transactional integrity, even in the case of network delays, node failures, and concurrent access conflicts.</span></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2023/10/system-design-questions.html"><b>System Design Questions</b></a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-14526030431259659632025-10-13T07:44:00.000-07:002025-10-13T07:44:14.194-07:00Understanding ACID Properties in Database Systems<p><span style="font-family: &quot;Verdana&quot;,sans-serif;">In database systems, maintaining the correctness and reliability of data during transactions is essential. The ACID properties (Atomicity, Consistency, Isolation, and Durability) define a set of standards that ensure transactions are processed accurately and reliably. This blog post explains each of these properties with clear definitions and examples to help you understand how they contribute to data integrity and system reliability in transactional databases.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">1. Atomicity</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Atomicity refers to the "all-or-nothing" nature of a database transaction. In simple terms, this means that a transaction must be fully completed or not executed at all. If any part of the transaction fails, the entire operation is rolled back, and the database remains unchanged.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">This property ensures that there is no partial execution of a transaction. It prevents scenarios where only some operations in a transaction are applied, leaving the database in an inconsistent or incomplete state.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">1.1 Why is Atomicity important?</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In real-world applications, a transaction often involves multiple steps or operations that are logically connected. These steps must be treated as a single unit of work. If one step fails, none of the steps should take effect. This guarantees that the system's state remains valid and predictable.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Consider a simple fund transfer between two bank accounts A and B:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l2 level1 lfo1; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Debit </span><span style="font-family: &quot;Arial&quot;,sans-serif;">₹</span><span style="font-family: &quot;Verdana&quot;,sans-serif;">5,000 from Account A.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l2 level1 lfo1; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Credit </span><span style="font-family: &quot;Arial&quot;,sans-serif;">₹</span><span style="font-family: &quot;Verdana&quot;,sans-serif;">5,000 to Account B.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">These two operations must occur together. If the system debits Account A but fails to credit Account B (due to a crash, network issue, or any error), the customer would lose money, and the bank records would be incorrect. With atomicity, such a transaction would be rolled back entirely if both operations cannot be completed successfully.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">1.2 How is Atomicity Achieved in Database Systems?</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">database systems use three core mechanisms to achieve Atomicity.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l11 level1 lfo2; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Transaction Logs</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l11 level1 lfo2; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Rollback</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l11 level1 lfo2; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Commit</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Let's understand this with a successful money transfer from Account A to Account B.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Let’s say a customer initiates a transaction to transfer </span><span style="font-family: &quot;Arial&quot;,sans-serif;">₹</span><span style="font-family: &quot;Verdana&quot;,sans-serif;">5,000 from Account A to Account B using a banking app. This transfer involves two critical updates.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l12 level1 lfo3; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Debit </span><span style="font-family: &quot;Arial&quot;,sans-serif;">₹</span><span style="font-family: &quot;Verdana&quot;,sans-serif;">5,000 from Account A</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l12 level1 lfo3; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Credit </span><span style="font-family: &quot;Arial&quot;,sans-serif;">₹</span><span style="font-family: &quot;Verdana&quot;,sans-serif;">5,000 to Account B</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Step 1: Transaction Begins</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">The database system starts a new transaction and assigns it a unique transaction ID (e.g., TX1234). This marks the beginning of the atomic unit of work. Nothing is changed in the actual database yet.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Step 2:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Validate the Operations</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">The database performs preliminary validations to avoid logging unnecessary or invalid transactions.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">It checks:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l9 level1 lfo5; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">If Account A has sufficient balance.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l9 level1 lfo5; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">If the accounts involved are valid and active.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l9 level1 lfo5; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">If the debit and credit operations are logically sound.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l9 level1 lfo5; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">If the transaction respects all integrity constraints.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Step 3:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Write-Ahead Logging (Transaction Log)</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Before any change is written to the database, the system writes detailed information about the transaction to a transaction log.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">This includes:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l4 level1 lfo4; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Transaction ID (TX1234)</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l4 level1 lfo4; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Operation types (DEBIT, CREDIT)</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l4 level1 lfo4; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Before and after values</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l4 level1 lfo4; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Current status (PENDING)</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">This is known as Write-Ahead Logging (WAL), means the changes must be logged before they are applied. This allows the system to recover if a failure occurs. For high reliability, some databases replicate this log to another disk or standby server. This protects against disk crashes and ensures durability.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Step 4:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Execute the Operations</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">After logging, the debit and credit operations are carried out in memory, no actual disk operation occurs yet.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Step 5:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> Commit</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">If all operations succeed:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l5 level1 lfo6; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">The changes are written from memory to the actual database (on disk).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l5 level1 lfo6; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">A COMMIT record is added to the transaction log. The transaction is marked as successfully completed.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">At this point, the updates are permanent and visible to other users. The atomicity principle is honored, both debit and credit happened together as a single unit.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">2. Consistent</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Consistency means that a database must always transition from one valid state to another valid state after any transaction completes. The data should never end up in a state that violates the defined rules, constraints, or logical relationships of the database.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">2.1 What Does Consistency Really Mean?</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Imagine the database as a system that follows strict rules about how data relates to each other. These rules include:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l7 level1 lfo7; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Data integrity constraints like primary keys, foreign keys, and unique constraints.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l7 level1 lfo7; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Business rules such as "an order must always belong to an existing customer."</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l7 level1 lfo7; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Validation rules ensuring data formats, ranges, or mandatory fields are correct.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">A consistent database means every transaction preserves all these rules.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Example: Deleting a Customer and Their Orders</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Suppose you have two tables:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l10 level1 lfo8; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Customers: stores customer information.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l10 level1 lfo8; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Orders: stores all orders placed by customers, linked by a foreign key to the Customers table.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">If a transaction deletes a customer record, consistency requires that:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo9; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">All their orders must also be deleted (cascading delete), or</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l3 level1 lfo9; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">The system must prevent the deletion if orders exist (restrict delete).</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">2.2 Why Is This Important?</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">If the system allowed deleting a customer but left behind orders that reference that now-nonexistent customer, the database would enter an inconsistent state:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Orders would have foreign keys pointing to a missing customer.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Applications reading these orders could crash or behave unpredictably.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">2.3 How Is Consistency Enforced?</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Database systems use several mechanisms to ensure consistency:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l13 level1 lfo10; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Constraints: Foreign keys, unique keys, check constraints.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l13 level1 lfo10; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Triggers: Automatically execute rules or actions to maintain consistency.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l13 level1 lfo10; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Transaction rules: The entire transaction must commit or rollback as a whole, so partial updates can’t leave data inconsistent.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In summary, Consistency means that after every transaction, the database stays correct and follows all the rules. It makes sure the database never shows wrong or confusing information to people or programs, so the data can be trusted and is reliable.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">3. Isolation</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Isolation means that when two or more transactions happen at the same time, they don’t get mixed up with each other. Each transaction works by itself, without interfering with others.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">For example, if two transactions try to change the same piece of data at the same time, one of them will wait until the other finishes. This way, the changes don’t cause mistakes.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Isolation keep the data accurate, even when many users are using the database at once.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">3.1 Why is Isolation Important?</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">When many people or programs use a database at the same time, they often try to read or change the same data simultaneously. Without isolation:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l1 level1 lfo11; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Changes made by one transaction could mix up or conflict with changes from another.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l1 level1 lfo11; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">This can cause errors, like incorrect balances, lost updates, or corrupted data.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">For example, if two people try to withdraw money from the same bank account at the same time, without isolation, both might see the old balance and withdraw too much.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Isolation keeps each transaction separate and protected, so they don’t interfere with each other. This helps the database stay accurate and reliable even when many users work at once.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">3.2 How is Isolation achieved?</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Databases use different techniques like Locking, Transaction Scheduling, Isolation Levels etc., to keep transactions isolated.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">3.2.1 Locking</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">When a transaction wants to read or write data, the database locks that data so others can’t change it at the same time.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">For example, if Transaction A locks a customer’s account to update the balance, Transaction B must wait until Transaction A finishes.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Locks can be:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l0 level1 lfo12; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Shared locks for reading (many can read at once).</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l0 level1 lfo12; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Exclusive locks for writing (only one can write at a time).</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">3.2.2 Transaction Scheduling</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">The database controls the order in which transactions run, making sure they don’t overlap in ways that cause conflicts. It may delay some transactions so that each one appears to run alone, even if they actually run at the same time.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">3.2.3 Isolation levels</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Isolation levels decide how strictly transactions are kept separate from each other when they run at the same time. The choice of level affects both the accuracy of data and the speed of the system.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Higher isolation levels keep transactions very separate and avoid almost all conflicts, but they can slow things down because transactions might have to wait longer.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Lower isolation levels let transactions overlap more, which can speed things up, but may sometimes allow incorrect or confusing data to appear temporarily.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Following are the some common isolation levels:</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l6 level1 lfo13; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Read Uncommitted</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l6 level1 lfo13; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Read Committed</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l6 level1 lfo13; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Repeatable Read</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l6 level1 lfo13; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Serializable</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Read Uncommitted</span></b></p> <p class="MsoNormal"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Transactions can see uncommitted changes made by other transactions ("dirty reads") No locking of read data. It offers the highest performance but lowest consistency</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">It is rarely used in practice except for approximate analytics where absolute accuracy isn't critical</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Read Committed</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Transactions can only see committed changes (no dirty reads). It internally use row level locks for writes. Each read operation sees only data committed before that specific read. Following are possible:</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l8 level1 lfo14; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Non-repeatable reads (a row read twice in same transaction may differ if another transaction committed changes). For example, you read an account balance twice during a transaction and see different amounts because another transaction updated it in between.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l8 level1 lfo14; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">Phantom reads (new rows may appear in subsequent reads)</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Repeatable Read</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">The Repeatable Read isolation level ensures that if a transaction reads a row once, it will see the same data if it reads that row again later during the same transaction. It uses locks to prevent other transactions from modifying data that has been read.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">It allows Phantom reads, like if a transaction runs a query like SELECT * FROM orders WHERE amount &gt; 100, and another transaction inserts a new matching row before the first one commits, the new row can appear in repeated queries.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Serializable (Highest Isolation)</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Transactions run so strictly that it looks like they run one after another, not at the same time. It prevents all types of conflicts, including dirty reads, non-repeatable reads, and phantom reads. It is most secure but slowest, because transactions often wait for others to finish.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">It is used when absolute accuracy is required, like in banking systems.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">4. Durability</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Durability means that once a transaction is successfully completed (committed), its changes are permanent, they will not be lost, even if the system crashes right after.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l14 level1 lfo15; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">The data is safely stored on disk.</span></p> <p class="MsoNoSpacing" style="margin-left: 36.0pt; mso-list: l14 level1 lfo15; text-indent: -18.0pt;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Verdana&quot;,sans-serif;">It will still be there if the server restarts, power goes out, or the database crashes.</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">Following core mechanisms helps to ensure Durability.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Write-Ahead Logging (WAL):</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"><span style="mso-spacerun: yes;">&nbsp; </span>Before applying any changes to the actual database, the database writes a log record describing the changes. In general, this log record is replicated accross multiple machines to ensure durability.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span style="font-family: &quot;Verdana&quot;,sans-serif;">Checkpointing:</span></b><span style="font-family: &quot;Verdana&quot;,sans-serif;"> A checkpoint is a snapshot operation that synchronizes in-memory data with disk storage.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">In Distributed systems, they have Quorum-Based approach, where the durability is achieved via replication. Here a write is only considered successful if multiple nodes acknowledge it.</span></p> <p class="MsoNoSpacing"><span style="font-family: &quot;Verdana&quot;,sans-serif;">&nbsp;</span></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2023/10/system-design-questions.html"><b>System Design Questions</b></a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-7816341805571775342025-09-16T08:21:00.000-07:002025-10-21T01:33:13.152-07:00Enhancing RAG Retrievals in Langchain4j with Query Transformers: Techniques & Best Practices<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When building Retrieval-Augmented Generation (RAG) systems, the quality of retrieved results heavily depends on how the input query is framed. Users may submit vague, ambiguous, or verbose queries, which can degrade retrieval performance. This is where Query Transformers in Langchain4j come into play, they help to transform and optimize queries to improve the relevance of retrieved documents before generating a response.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, we’ll explore what Query Transformers are in Langchain4j, why they matter, and dive into various strategies such as query compression, expansion, rewriting, step-back prompting, and hypothetical document embeddings (HyDE).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. Introduction to RAG</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">RAG (Retrieval-Augmented Generation) is a method that helps large language models (LLMs) to get better answers by first finding useful information from your data and adding it to the prompt before sending it to the model. This helps the model respond more accurately and reduces the chances of it making things up (called hallucinations).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">There are different ways to find this useful information:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Full-text (keyword) search: Looks for documents that match the words in your question. It uses methods like TF-IDF or BM25 to rank how well each document matches.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Vector (semantic) search: Converts documents and questions into numbers (vectors) and compares them to find the most similar meanings, not just matching words.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Hybrid search: Combines both full-text and vector search to get better results.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Right now, this guide mainly focuses on vector search.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. RAG Stages</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The Retrieval-Augmented Generation (RAG) process usually has two main steps: Indexing and Retrieval. LangChain4j provides helpful tools for both.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.1 Indexing Stage</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Indexing is the first step where documents are prepared so they can be quickly and accurately searched later. For vector-based search, this step includes:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Cleaning the content to remove unnecessary or irrelevant parts</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Adding extra context or metadata if needed</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Splitting large documents into smaller parts (called chunks)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Converting those chunks into numerical vectors using embeddings</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Saving them in a special database called an embedding store or vector database</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This step is usually done in the background, not while users are interacting with the app. For example, a scheduled job (like a weekly cron job) might update the data during non peak hours, such as weekends. Sometimes, a separate service takes care of managing the vector database.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In other cases, like when users upload their own documents, the indexing needs to happen right away (in real time) and be built into the app.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For this proof of concept (POC), documents related to the fictional company called ChronoCore Industries are stored in my computer and loaded into memory. This simple setup works well for the demo.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here is a simplified diagram of the indexing stage.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnP5GpjVhyphenhyphencjufA52Im6JklN4oaFyXOmPlvj0fn9Gg1RcIQbO-uY0EaicZclcH50hagSLUETIEbco1c3OYWNgBNdDCr88hJoTYNAMxbnkxRSQg5wVXBu5LxObldbSfeTnCwPWwqJU267uk7iJYBdDfo6Kh0fMvOEKtVc2t2ktl-JUGsQRnmRAfI2nQAsI/s904/rag%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="904" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnP5GpjVhyphenhyphencjufA52Im6JklN4oaFyXOmPlvj0fn9Gg1RcIQbO-uY0EaicZclcH50hagSLUETIEbco1c3OYWNgBNdDCr88hJoTYNAMxbnkxRSQg5wVXBu5LxObldbSfeTnCwPWwqJU267uk7iJYBdDfo6Kh0fMvOEKtVc2t2ktl-JUGsQRnmRAfI2nQAsI/w400-h156/rag%201.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.2 Retrieval Stage</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The retrieval stage begins when a user submits a question. The system then searches through pre-indexed documents to identify the most relevant information.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For vector search, the user's query is converted into an embedding, a numerical representation of the query. The system compares this embedding to others in the embedding store to find the most similar document segments. These relevant chunks are then included in the prompt provided to the language model to help generate an accurate response.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheA5uBAMYcC9p-LwCTfsq00nt_-NIaJjwubDO4oqg9cT3BnRC4vqILNPUC7Oq5NhxxQRESLahK-GG3N5r1CxoWBgh5fhKAwMR_2QrYs73ZyBL0tQe5dnweowdaM5J3GinubhNJrWgxSrc1sOT_1SVzAtYwKps75M1MhKF7Sb5_7Q-wjIARWXcEaqxDxMg/s904/rag%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="422" data-original-width="904" height="149" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheA5uBAMYcC9p-LwCTfsq00nt_-NIaJjwubDO4oqg9cT3BnRC4vqILNPUC7Oq5NhxxQRESLahK-GG3N5r1CxoWBgh5fhKAwMR_2QrYs73ZyBL0tQe5dnweowdaM5J3GinubhNJrWgxSrc1sOT_1SVzAtYwKps75M1MhKF7Sb5_7Q-wjIARWXcEaqxDxMg/s320/rag%202.png" width="320" /></a></div><br />&nbsp;<p></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Why to Transform User Queries?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In traditional RAG (Retrieval-Augmented Generation) systems, documents are typically split into chunks, embedded using a language model, and later retrieved based on their semantic similarity to a user’s query. While this naive RAG approach works in many cases, it has notable limitations that can make it difficult both the quality and relevance of retrieved information.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Key challenges include</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l3 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Irrelevant Chunk Content</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">: The chunking process often slices documents without understanding semantic boundaries. As a result, a single chunk might contain useful information along with unrelated or distracting content, reducing retrieval accuracy.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l3 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poorly Formulated User Queries:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Users may express their questions in vague, incomplete, or overly specific ways that don’t align well with the format or content of stored embeddings, leading to suboptimal matches.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l3 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Lack of Structured Query Support:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> In more advanced use cases, retrieval isn't just about matching free-text queries. It may involve generating structured queries, such as filtering vector search results based on metadata (e.g., date, author) or even translating natural language into SQL for querying relational databases.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">To overcome these limitations, a new class of techniques focuses on transforming user queries before they are sent to the retriever. These techniques improve retrieval quality by refining the intent, scope, or format of the question. </span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, we’ll explore some of the most effective query transformation strategies, including query rewriting, expansion, compression, and more advanced techniques like step-back prompting and hypothetical document embeddings (HyDE).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.1 Query Rewriting</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In Retrieval-Augmented Generation (RAG), a system tries to answer your question by first retrieving information (from documents or a database) and then reading it using an AI model like ChatGPT. In regular flow, the system just uses your question as-is to search for information.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">But here's the problem: Your original question might not be the best way to search for the right answer.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For example, imagine you asked, "What was the impact of the 2008 financial crisis on small businesses in rural areas?"</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">That's a complex question. If we use it directly to search, we might not get the best results. We might get the documents that talk about:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">"effects on small businesses"</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">"rural economic impact"</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">or just "2008 financial crisis"</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">So, what do we do?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">We rewrite the question into simpler or more useful versions before searching.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For example:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l4 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Impact of 2008 recession on rural small businesses</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l4 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2008 financial crisis effect on local economies</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l4 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How small businesses were affected by the 2008 downturn</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This rewritten query is more likely to match more appropriate documents.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The "Rewrite-Retrieve-Read" Framework</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here’s how the new method works step-by-step:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo4; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Rewrite the question: make it better for searching</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo4; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Retrieve documents using the rewritten version</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo4; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Read the documents + original question to give an answer</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In summary, Query rewriting means improving the user’s question before searching, so the AI can find better, more accurate information. It’s like turning a confusing search into a clearer one, and making it easier for the AI to help you.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample prompt template for this</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">References: </span><a href="https://arxiv.org/pdf/2305.14283"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://arxiv.org/pdf/2305.14283</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.2 Step Back Prompting</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">It's a technique used to help Large Language Models (LLMs) like GPT-4 think bigger/better when solving difficult problems, especially ones that require reasoning or connecting multiple ideas.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">It’s inspired by how humans solve tough problems. When we don’t know the answer right away, we step back, think about the bigger picture or the general rules, and then apply them to the specific question.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Core Idea: Two Steps</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo5; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step Back -&gt; Think Big</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo5; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Then Reason </span><span face="&quot;Arial&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">-&gt;</span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Apply to Solve</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1: Step Back</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Instead of jumping into the answer right away, the model asks a bigger, higher-level question that helps it think better.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Examples 1:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Original question: How does pressure change with temperature and volume?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step-back question: What physics principle explains this?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Answer: Ideal Gas Law (PV = nRT)</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 2:</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Original question: Where did Estella Leopold study in 1940s?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step-back question: What is Estella Leopold’s education history?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This gives a broader timeline that can help answer the specific time.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Goal of this step is to help the model to gather the right facts or rules before trying to answer.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2: </span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Then Reason</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Now that you have the high-level documents or principles, you use them to answer the original question.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this phase, you essentially combine the original question with all the documents or knowledge retrieved during the Step-Back (Abstraction) phase and then ask the model to reason and answer based on that combined context.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample prompt template for this</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You are an expert of world knowledge. I am going to ask you a question. Your response should be comprehensive and not contradicted with the following context if they are relevant. Otherwise, ignore them if they are not relevant.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;}a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:#96607D; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{normal_context} {step_back_context} Original Question: {question} Answer: </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Credit goes to </span><a href="https://smith.langchain.com/hub/langchain-ai/stepback-answer?ref=blog.langchain.dev&amp;__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&amp;__hssc=260096658.2.1749469580827&amp;__hsfp=601531394&amp;_gl=1*1gvdm1g*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzMwMDMkajYwJGwwJGgw"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://smith.langchain.com/hub/langchain-ai/stepback-answer?ref=blog.langchain.dev&amp;__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&amp;__hssc=260096658.2.1749469580827&amp;__hsfp=601531394&amp;_gl=1*1gvdm1g*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzMwMDMkajYwJGwwJGgw</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">References: </span><a href="https://arxiv.org/pdf/2310.06117"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://arxiv.org/pdf/2310.06117</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.3 Follow Up Questions</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s say you’re chatting with an assistant.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">User: Where should I go in Japan in April?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Assistant: You can visit Kyoto for cherry blossoms, Tokyo for city life, and Hokkaido for snow festivals.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Follow-up Question: What’s the weather like?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Problem Without Query Transformation</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">If the system only takes “What’s the weather like?” as the search query, it has no idea you’re talking about Japan in April. So it might give you weather for another country or a random time.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Solution Using Query Transformation</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Instead of embedding just the follow-up question, we use an LLM to rewrite it using the chat history.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Sample Prompt Template</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;}a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:#96607D; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Given the following conversation and a follow up question, rephrase the follow up \ question to be a standalone question. Chat History: {chat_history} Follow Up Input: {question} Standalone Question: </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Credit goes to </span><a href="https://smith.langchain.com/hub/langchain-ai/weblangchain-search-query?ref=blog.langchain.dev&amp;__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&amp;__hssc=260096658.2.1749469580827&amp;__hsfp=601531394&amp;_gl=1*oyvanp*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzQ2NzYkajYwJGwwJGgw"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://smith.langchain.com/hub/langchain-ai/weblangchain-search-query?ref=blog.langchain.dev&amp;__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&amp;__hssc=260096658.2.1749469580827&amp;__hsfp=601531394&amp;_gl=1*oyvanp*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzQ2NzYkajYwJGwwJGgw</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In summary, </span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Original follow-up: “What’s the weather like?”</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">After transformation: “What’s the weather like in Japan in April?”</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l2 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Benefit: More relevant results from search or retrieval</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.4 Multi-Query Retrieval Explained</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Multi-Query Retrieval is a strategy where a Large Language Model (LLM) generates multiple related search queries from a single complex question. Instead of issuing just one search query, the system creates several focused queries that cover different aspects or sub-questions contained in the original question.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">These multiple queries are then sent out in parallel to the search or retrieval system. The results from all these queries are collected together and used to provide a more comprehensive and accurate answer.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why is this useful?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Some questions are complex and consist of multiple parts or layers. Searching with just one query might miss the important details or return incomplete results. By breaking the question down into multiple smaller queries, the system can cover more ground and bring back richer information.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For example, imagine a user asks: "What are the health benefits of green tea, and how does it compare to black tea in terms of caffeine content and antioxidant levels?"</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This question has three distinct parts:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What are the health benefits of green tea?</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How much caffeine does green tea have compared to black tea?</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How do antioxidant levels compare between green tea and black tea?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Without Multi-Query Retrieval</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">If you searched with the entire question as a single query, the results might only partially cover these topics or emphasize one part more than the others.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">With Multi-Query Retrieval</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">An LLM can be prompted to generate multiple search queries such as:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">"Health benefits of green tea"</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">"Caffeine content in green tea vs black tea"</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo3; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">"Comparison of antioxidant levels in green tea and black tea"</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">These queries are then sent to the search system simultaneously. The results from all three are gathered, allowing the system to synthesize a complete, well-rounded answer that addresses each aspect thoroughly.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">As you've seen, there are various techniques for performing query transformation, each with its own approach and benefits. While query transformation itself is not a new concept, what is new and powerful is the ability to use Large Language Models (LLMs) to carry it out.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The key difference between these methods often lies in the prompt engineering, that is, how we frame our instructions to the LLM. Writing these prompts is easier than you might think, if you can imagine the kind of question, you want the model to ask or change, you can probably write the prompt for it too.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This gives you a lot of new and exciting opportunities, now you have the power to come up with your own prompt ideas. So the real question is:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l3 level1 lfo4; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What kinds of query transformations will you create?</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l3 level1 lfo4; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How will you use this ability in your own projects?</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3. QueryTransformer interface in Langchain4j</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">QueryTransformer is an interface that takes a single query and returns one or more transformed queries. These new queries are often better suited for fetching relevant results from your knowledge base or embedding store.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here’s the official definition in simple terms: QueryTransformer transforms the original user query into one or more enhanced queries to improve the quality of document retrieval.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;}a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:#96607D; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGbNjHHekK0dTIxpsGQqOnwKdJULGXkp-6PzaIv8f-4HA6kXe9sifrgkFzW7JE5vMQg_6aS-5lqG_57IxQQQKPHqVX_VCSzqXYK3ekutzIG6Q38Fm-oMcd5lUSeh_sAqQUO4mR8jEjFI0DstUDw-ORJ5zz4RF6EKUAUJqpljm9urDvHisGa4K4fuFqL8M/s1396/rag%203.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1396" data-original-width="532" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGbNjHHekK0dTIxpsGQqOnwKdJULGXkp-6PzaIv8f-4HA6kXe9sifrgkFzW7JE5vMQg_6aS-5lqG_57IxQQQKPHqVX_VCSzqXYK3ekutzIG6Q38Fm-oMcd5lUSeh_sAqQUO4mR8jEjFI0DstUDw-ORJ5zz4RF6EKUAUJqpljm9urDvHisGa4K4fuFqL8M/w153-h400/rag%203.png" width="153" /></a></span></div><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span><p></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.1 Built-in QueryTransformer Implementations in LangChain4j</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LangChain4j offers three powerful implementations of the QueryTransformer interface, each one has its own different needs in enhancing retrieval quality. </span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.1.1 DefaultQueryTransformer:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> This is the most straightforward implementation. It simply returns the original query as-is, without making any changes or enhancements.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When to use it?</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You're just getting started and want a baseline retrieval setup.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You don’t need any kind of transformation logic.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l1 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Your queries are already well-structured and specific.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.2.2. CompressingQueryTransformer</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This transformer uses a ChatModel (like a language model) to compress or shorten the original query, often by removing irrelevant details or summarizing it. It also takes into account the chat memory (past interactions) to make the transformation more context-aware.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When to use it:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The original query contains too much detail or redundant information.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You want to refine the query to focus on what really matters.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo2; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You’re working in a conversational context where prior interactions should influence the current query.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Prompt used by this transformer</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>""" Generate {{n}} different versions of a provided user query. \ Each version should be worded differently, using synonyms or alternative sentence structures, \ but they should all retain the original meaning. \ These versions will be used to retrieve relevant documents. \ It is very important to provide each query version on a separate line, \ without enumerations, hyphens, or any additional formatting! \ User query: {{query}} """ </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">CompressingQueryTransformerDemo.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Collection</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.AiMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.ChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.chat.MessageWindowChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.Metadata</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.Query</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.transformer.CompressingQueryTransformer</span>; <span style="color: #888888;">/**</span> <span style="color: #888888;"> * Demonstrates the use of {@link CompressingQueryTransformer} in Langchain4j</span> <span style="color: #888888;"> * with an Ollama LLM to compress verbose user queries based on prior</span> <span style="color: #888888;"> * conversation context.</span> <span style="color: #888888;"> *</span> <span style="color: #888888;"> * &lt;p&gt;</span> <span style="color: #888888;"> * This example sets up:</span> <span style="color: #888888;"> * &lt;ul&gt;</span> <span style="color: #888888;"> * &lt;li&gt;A basic Ollama LLM chat model using llama3.2&lt;/li&gt;</span> <span style="color: #888888;"> * &lt;li&gt;A short chat history (ChatMemory)&lt;/li&gt;</span> <span style="color: #888888;"> * &lt;li&gt;A verbose user query with historical context&lt;/li&gt;</span> <span style="color: #888888;"> * &lt;li&gt;A query transformation step to compress the query&lt;/li&gt;</span> <span style="color: #888888;"> * &lt;/ul&gt;</span> <span style="color: #888888;"> *</span> <span style="color: #888888;"> * &lt;p&gt;</span> <span style="color: #888888;"> * Use case: Helps improve retrieval in RAG by compressing verbose or redundant</span> <span style="color: #888888;"> * queries.</span> <span style="color: #888888;"> */</span> <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">CompressingQueryTransformerDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 1: Initialize the chat model (Ollama running locally)</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 2: Initialize chat memory with a windowed message history (up to 5</span> <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// messages)</span> <span style="color: #bbbbbb;"> </span>ChatMemory<span style="color: #bbbbbb;"> </span>chatMemory<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>MessageWindowChatMemory.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">id</span>(<span style="background-color: #fff0f0;">"12345"</span>).<span style="color: #0000cc;">maxMessages</span>(<span style="color: #0000dd; font-weight: bold;">5</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Add previous user and AI messages to simulate conversation context</span> <span style="color: #bbbbbb;"> </span>chatMemory.<span style="color: #0000cc;">add</span>(UserMessage.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"I'm researching electric vehicles."</span>)); <span style="color: #bbbbbb;"> </span>chatMemory.<span style="color: #0000cc;">add</span>(AiMessage.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Sure! What aspect of EVs are you interested in?"</span>)); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 3: Create the verbose user query</span> <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Can you help me find battery performance comparisons for EVs released after 2022?"</span>; <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Attach metadata including user message and chat history</span> <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>metadata<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(UserMessage.<span style="color: #0000cc;">from</span>(userQuery),<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #bbbbbb;"> </span>chatMemory.<span style="color: #0000cc;">messages</span>()); <span style="color: #bbbbbb;"> </span>Query<span style="color: #bbbbbb;"> </span>originalQuery<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Query.<span style="color: #0000cc;">from</span>(userQuery,<span style="color: #bbbbbb;"> </span>metadata); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 4: Initialize the query transformer with the chat model</span> <span style="color: #bbbbbb;"> </span>CompressingQueryTransformer<span style="color: #bbbbbb;"> </span>transformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>CompressingQueryTransformer(chatModel); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 5: Transform the query using prior chat context</span> <span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;">&lt;</span>Query<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>compressedQueries<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>transformer.<span style="color: #0000cc;">transform</span>(originalQuery); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 6: Output the compressed query (may be 1 or more if multi-query support</span> <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// is enabled)</span> <span style="color: #bbbbbb;"> </span>compressedQueries.<span style="color: #0000cc;">forEach</span>(compressedQuery<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Compressed Query: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>compressedQuery.<span style="color: #0000cc;">text</span>())); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Compressed Query: Battery performance comparisons for electric vehicles (EVs) released after 2022. </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.2.3 ExpandingQueryTransformer</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In contrast to compression, this transformer expands the query. It uses a ChatModel to enrich the original query. For example, by adding related terms, inferred context, or clarifying details, making it more likely to retrieve relevant documents.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When to use it:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The original query is too vague or under-specified.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You want to improve by making the query broader and more inclusive.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You're dealing with open-ended or exploratory queries.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Prompt used by this transformer</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>""" Read and understand the conversation between the User and the AI. \ Then, analyze the new query from the User. \ Identify all relevant details, terms, and context from both the conversation and the new query. \ Reformulate this query into a clear, concise, and self-contained format suitable for information retrieval. Conversation: {{chatMemory}} User query: {{query}} It is very important that you provide only reformulated query and nothing else! \ Do not prepend a query with anything! """ </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">ExpandingQueryTransformerDemo.java</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Collection</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.AiMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.message.UserMessage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.ChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.chat.MessageWindowChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.Metadata</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.Query</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.transformer.ExpandingQueryTransformer</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">ExpandingQueryTransformerDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">final</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">int</span><span style="color: #bbbbbb;"> </span>EXPECTED_QUERIES<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">5</span>; <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 1: Initialize the chat model (Ollama running locally)</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 2: Initialize chat memory with a windowed message history (up to 5 messages)</span> <span style="color: #bbbbbb;"> </span>ChatMemory<span style="color: #bbbbbb;"> </span>chatMemory<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>MessageWindowChatMemory.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">id</span>(<span style="background-color: #fff0f0;">"12345"</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxMessages</span>(<span style="color: #0000dd; font-weight: bold;">5</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Add previous user and AI messages to simulate conversation context</span> <span style="color: #bbbbbb;"> </span>chatMemory.<span style="color: #0000cc;">add</span>(UserMessage.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"I'm researching electric vehicles."</span>)); <span style="color: #bbbbbb;"> </span>chatMemory.<span style="color: #0000cc;">add</span>(AiMessage.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Sure! What aspect of EVs are you interested in?"</span>)); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 3: Create the verbose user query</span> <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>userQuery<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Can you help me find battery performance comparisons for EVs released after 2022?"</span>; <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Attach metadata including user message and chat history</span> <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>metadata<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(UserMessage.<span style="color: #0000cc;">from</span>(userQuery),<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #bbbbbb;"> </span>chatMemory.<span style="color: #0000cc;">messages</span>()); <span style="color: #bbbbbb;"> </span>Query<span style="color: #bbbbbb;"> </span>originalQuery<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Query.<span style="color: #0000cc;">from</span>(userQuery,<span style="color: #bbbbbb;"> </span>metadata); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 4: Create ExpandingQueryTransformer with expected number of queries</span> <span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer<span style="color: #bbbbbb;"> </span>transformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer(chatModel,<span style="color: #bbbbbb;"> </span>EXPECTED_QUERIES); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 5: Transform the original query</span> <span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;">&lt;</span>Query<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>expandedQueries<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>transformer.<span style="color: #0000cc;">transform</span>(originalQuery); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 6: Output the results</span> <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Total Queries generated: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>expandedQueries.<span style="color: #0000cc;">size</span>()); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(Query<span style="color: #bbbbbb;"> </span>query<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>expandedQueries)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(query.<span style="color: #0000cc;">text</span>()); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Total Queries generated: 5 I can help you find information on battery performance comparisons for electric vehicles released in the last few years Can you provide more details about the type of comparison you're looking for regarding electric vehicle batteries? Is there a particular aspect of battery performance you'd like to know more about, such as charging speed or range? Can you give me an idea of what kind of information would be helpful to you when it comes to comparing different electric vehicle battery types? Would you prefer to see comparisons between specific brands or models of electric vehicles? </pre></div> <p class="MsoNoSpacing"> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Here’s how you can use ExpandingQueryTransformer inside a RAG pipeline by attaching it to a RetrievalAugmentor, which is then plugged into the ChatAssistant:</span> <style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); ContentRetriever<span style="color: #bbbbbb;"> </span>contentRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(embeddingStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); ExpandingQueryTransformer<span style="color: #bbbbbb;"> </span>expandingQueryTransformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer(chatModel,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">3</span>); RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentRetriever</span>(contentRetriever) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How It Works?</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ExpandingQueryTransformer generates multiple reworded versions of the user’s query using the LLM.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">These versions are passed to the ContentRetriever, improving document recall.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The RetrievalAugmentor ties this transformation + retrieval together.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ChatAssistant uses this full pipeline for better RAG-based answering.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">QueryTransformerDemo.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.transformer</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.memory.chat.MessageWindowChatMemory</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.DefaultRetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.RetrievalAugmentor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.query.transformer.ExpandingQueryTransformer</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.AiServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">QueryTransformerDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatAssistant</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">chat</span>(String<span style="color: #bbbbbb;"> </span>userMessage); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>indiaDocs<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>( <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India, officially the Republic of India, is a country in South Asia. It is the seventh-largest country by area,</span> <span style="background-color: #fff0f0;"> the most populous country as of 2023, and the most populous democracy in the world. Bounded by the Himalayas in</span> <span style="background-color: #fff0f0;"> the north and surrounded by the Indian Ocean, Arabian Sea, and Bay of Bengal, India has a rich cultural and</span> <span style="background-color: #fff0f0;"> historical heritage.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> The Indian economy is the fifth-largest in the world by nominal GDP and the third-largest by purchasing power parity.</span> <span style="background-color: #fff0f0;"> It is classified as a newly industrialized country and one of the world's fastest-growing major economies. Major</span> <span style="background-color: #fff0f0;"> industries include IT services, textiles, pharmaceuticals, and agriculture.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India's political system is a federal parliamentary democratic republic. The President of India is the head of state,</span> <span style="background-color: #fff0f0;"> while the Prime Minister is the head of government. The Indian Parliament consists of the Lok Sabha (House of the People)</span> <span style="background-color: #fff0f0;"> and the Rajya Sabha (Council of States).</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Indian culture is renowned for its diversity and depth. It includes a wide variety of languages, religions, music,</span> <span style="background-color: #fff0f0;"> dance forms, cuisine, and traditions. Major religions born in India include Hinduism, Buddhism, Jainism, and Sikhism.</span> <span style="background-color: #fff0f0;"> Festivals such as Diwali, Eid, Christmas, and Pongal are celebrated across the country.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India is home to 40 UNESCO World Heritage Sites, including the Taj Mahal, Qutub Minar, and the Western Ghats. The country</span> <span style="background-color: #fff0f0;"> offers a wide variety of landscapes ranging from deserts in Rajasthan, the Himalayan mountain range, tropical rainforests</span> <span style="background-color: #fff0f0;"> in the northeast, to coastal plains and fertile river valleys.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> The Indian education system has seen significant progress, with institutes like the IITs, IIMs, and AIIMS gaining global</span> <span style="background-color: #fff0f0;"> recognition. India also has a growing startup ecosystem, particularly in tech hubs such as Bengaluru, Hyderabad, and Pune.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> India has a vibrant film industry, notably Bollywood, which produces the largest number of films in the world. Indian music</span> <span style="background-color: #fff0f0;"> and dance forms such as Bharatanatyam, Kathak, Carnatic music, and Bollywood songs are famous worldwide.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Indian cuisine is known for its rich flavors and diverse ingredients. Each region has its own distinct dishes –</span> <span style="background-color: #fff0f0;"> from butter chicken and biryani in the north, to dosa and sambar in the south, to seafood delicacies in the coastal regions.</span> <span style="background-color: #fff0f0;"> Spices like turmeric, cumin, coriander, and cardamom are integral to Indian cooking.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> The Indian space program, led by ISRO, has made remarkable achievements including the Chandrayaan lunar missions and the</span> <span style="background-color: #fff0f0;"> Mars Orbiter Mission (Mangalyaan), which made India the first Asian nation to reach Mars orbit and the first in the world</span> <span style="background-color: #fff0f0;"> to do so in its maiden attempt.</span> <span style="background-color: #fff0f0;"> """</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Indian sports are dominated by cricket, but other sports like hockey, badminton, wrestling, and kabaddi are also popular.</span> <span style="background-color: #fff0f0;"> India has produced world-class athletes including Sachin Tendulkar, P.V. Sindhu, Neeraj Chopra, and Mary Kom. The country</span> <span style="background-color: #fff0f0;"> has hosted major sporting events like the Commonwealth Games and the Cricket World Cup.</span> <span style="background-color: #fff0f0;"> """</span>); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">prepareDocuments</span>()<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>doc<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>indiaDocs)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(Document.<span style="color: #0000cc;">from</span>(doc)); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>prepareDocuments(); <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>embeddingStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(documents,<span style="color: #bbbbbb;"> </span>embeddingStore); <span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer<span style="color: #bbbbbb;"> </span>expandingQueryTransformer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ExpandingQueryTransformer(chatModel,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">3</span>); <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>contentRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(embeddingStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel)<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// same chat model for embeddings</span> <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">3</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.7</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>RetrievalAugmentor<span style="color: #bbbbbb;"> </span>retrievalAugmentor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>DefaultRetrievalAugmentor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">queryTransformer</span>(expandingQueryTransformer) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentRetriever</span>(contentRetriever) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>prompt<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"""</span> <span style="background-color: #fff0f0;"> Hey, I was reading about how countries manage their political systems and got curious — can you tell me how India runs its government, who’s in charge, and what kind of structure they follow politically?</span> <span style="background-color: #fff0f0;"> """</span>; <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>chatAssistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">retrievalAugmentor</span>(retrievalAugmentor) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatMemory</span>(MessageWindowChatMemory.<span style="color: #0000cc;">withMaxMessages</span>(<span style="color: #0000dd; font-weight: bold;">10</span>)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>response<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>chatAssistant.<span style="color: #0000cc;">chat</span>(prompt); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(response); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>India's government structure is a federal parliamentary democratic republic. Here's an overview of who's in charge and the kind of structure they follow: **Head of State:** The President of India serves as the head of state. They are elected by an electoral college consisting of the members of both houses of Parliament (Lok Sabha and Rajya Sabha) and the governors of all states. **Head of Government:** The Prime Minister is the head of government, but they do not serve as a separate executive branch. Instead, they are responsible for advising the President on matters of national importance and forming a cabinet to implement policies. **Government Structure:** India's federal system divides power between the central government and the states (called "units"). The central government has control over areas such as defense, foreign policy, and interstate relations, while the states have autonomy over local issues like healthcare, education, and law enforcement. **Legislative Branch:** The Indian Parliament is bicameral, consisting of two houses: 1. **Lok Sabha (House of the People):** This is the lower house of Parliament, comprising 543 elected members who serve a term of five years. 2. **Rajya Sabha (Council of States):** This is the upper house of Parliament, with 245 members who are either directly or indirectly elected by the state legislatures. The Lok Sabha has the power to pass laws and elect the President, while the Rajya Sabha provides a check on the Lok Sabha's decisions and can also initiate legislation. </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">References</span></b></p> <p class="MsoNoSpacing"><a href="https://blog.langchain.dev/query-transformations/"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://blog.langchain.dev/query-transformations/</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p class="MsoNoSpacing"><br /></p><p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/customizing-content-retrieval-in-rag.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/smart-query-routing-in-langchain4j-from.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-433731816523230912025-09-16T08:10:00.000-07:002025-10-21T01:42:06.192-07:00Exploring Apache Druid Native Queries <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Apache Druid is a real-time analytics database designed for fast slice-and-dice analytics on large datasets. While SQL is a convenient way to query data in Druid, native queries provide greater flexibility, control, and performance tuning.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this blog post, we’ll explore how to use Druid’s scan native query to extract raw event-level data from a sales_data datasource. We'll walk through examples using real-world sales data.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample Data: sales_data</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">I ingested the following CSV into Druid with the name sales_data.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>timestamp,product,city,total_sales 2025-04-01T10:00:00Z,Laptop,Delhi,300 2025-04-01T10:00:00Z,Laptop,Delhi,200 2025-04-01T11:00:00Z,Tablet,Mumbai,150 2025-04-01T11:00:00Z,Tablet,Mumbai,50 2025-04-01T12:00:00Z,Mobile,Bengaluru,200 2025-04-01T13:00:00Z,Laptop,Hyderabad,250 2025-04-01T14:00:00Z,Tablet,Chennai,180 2025-04-01T15:00:00Z,Mobile,Pune,220 2025-04-01T15:00:00Z,Mobile,Pune,80 </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each row represents a product sale at a specific timestamp, city, and quantity.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. Scan Query in Druid</span></b></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The scan query in Druid is used to fetch raw data from your datasource. Unlike groupBy or timeseries queries that aggregate data, scan queries return unprocessed rows in a customizable format.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Here’s a basic scan query that fetches all data from the sales_data datasource between two timestamps.</span> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"scan"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"resultFormat"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"compactedList"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"columns"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"__time"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"product"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"city"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T10:00:00Z/2025-04-01T16:00:00Z"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"batchSize"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">35575</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"limit"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">100</span> } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpLormRbeBCIG8WWpizI9NoOxsL14-DtYDokr_6_nS9ajeArYhubNUPKgpdrJqBVbNZLfPb0YoYkI7-L458l8cQLiHhIkreRgk9aA2hIEmwq-pWxm4Z4mFNd_VgvitpJns9tJbvnoMIoEi9b-3BmdJIQr3f2BbNQNjpy_MHRt3MOLqBELV4owLdQNluKU/s1384/druid%20native%20queries%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="956" data-original-width="1384" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpLormRbeBCIG8WWpizI9NoOxsL14-DtYDokr_6_nS9ajeArYhubNUPKgpdrJqBVbNZLfPb0YoYkI7-L458l8cQLiHhIkreRgk9aA2hIEmwq-pWxm4Z4mFNd_VgvitpJns9tJbvnoMIoEi9b-3BmdJIQr3f2BbNQNjpy_MHRt3MOLqBELV4owLdQNluKU/w400-h276/druid%20native%20queries%201.png" width="400" /></a></div><br />&nbsp;<p></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Following table summarizes the native query payload.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: medium; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"> <tbody><tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"> <td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Field</span></b></p> </td> <td style="border-left: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Purpose</span></b></p> </td> </tr> <tr style="mso-yfti-irow: 1;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">queryType</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Specifies the query type. In this case, scan</span></p> </td> </tr> <tr style="mso-yfti-irow: 2;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">dataSource<span style="mso-spacerun: yes;">&nbsp; </span></span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The name of the Druid datasource (your table)</span></p> </td> </tr> <tr style="mso-yfti-irow: 3;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">resultFormat<span style="mso-spacerun: yes;">&nbsp; </span></span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Format of the result: compactedList, list, or valueVector</span></p> </td> </tr> <tr style="mso-yfti-irow: 4;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">columns</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">List of columns to include in the response</span></p> </td> </tr> <tr style="mso-yfti-irow: 5;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">intervals</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Time interval filter, ISO 8601 format</span></p> </td> </tr> <tr style="mso-yfti-irow: 6;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">batchSize</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Number of rows fetched internally per scan</span></p> </td> </tr> <tr style="mso-yfti-irow: 7; mso-yfti-lastrow: yes;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 77.75pt;" valign="top" width="104"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">limit</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 373.05pt;" valign="top" width="497"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Maximum number of rows returned in the result</span></p> </td> </tr> </tbody></table> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output json looks like below.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Output</span></b>&nbsp;</p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>[ <span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"segmentId"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data_2025-04-01T00:00:00.000Z_2025-04-02T00:00:00.000Z_2025-04-18T08:18:17.761Z"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"columns"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"__time"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"product"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"city"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"events"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743501600000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Laptop"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Delhi"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">300</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743501600000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Laptop"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Delhi"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">200</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743505200000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Tablet"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Mumbai"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">150</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743505200000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Tablet"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Mumbai"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">50</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743508800000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Mobile"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Bengaluru"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">200</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743512400000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Laptop"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Hyderabad"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">250</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743516000000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Tablet"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Chennai"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">180</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743519600000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Mobile"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Pune"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">220</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">1743519600000</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Mobile"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Pune"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">80</span> <span style="color: #bbbbbb;"> </span>] <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"rowSignature"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"__time"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"LONG"</span> <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"product"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"STRING"</span> <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"city"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"STRING"</span> <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"DOUBLE"</span> <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>] <span style="color: #bbbbbb;"> </span>} ] </pre></div> <p>&nbsp; <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Example 1: <span style="mso-spacerun: yes;">&nbsp;</span>Retrieve all rows where sales happened in a specific hour</span></b> <style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p>&nbsp;</p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"scan"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"resultFormat"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"compactedList"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"columns"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"__time"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"product"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"city"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T11:00:00Z/2025-04-01T12:00:00Z"</span>] } </pre></div> <p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJjFmOHK_nHk3pYzOGCdCq3B-8d7Ie7Gt6zIohmsYd5CNZIvCRMDQHY7BOdmfym0x2StWSffdM2if2fc7uSNdUTC5ri8WPAxnXp2jvNg1WkaUPJvms8wqcDgm-rfdcGc6j-1gEk6z30mboHjorL3kOMMWbQWk-5tjOmmXP-1Qi1EXbYB2hD81gwQp1lXk/s1384/druid%20native%20queries%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="589" data-original-width="1384" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJjFmOHK_nHk3pYzOGCdCq3B-8d7Ie7Gt6zIohmsYd5CNZIvCRMDQHY7BOdmfym0x2StWSffdM2if2fc7uSNdUTC5ri8WPAxnXp2jvNg1WkaUPJvms8wqcDgm-rfdcGc6j-1gEk6z30mboHjorL3kOMMWbQWk-5tjOmmXP-1Qi1EXbYB2hD81gwQp1lXk/w400-h170/druid%20native%20queries%202.png" width="400" /></a></div>&nbsp;<p></p><p><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Example 2:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;"> Filter specific columns only (e.g., product, city and total_sales)</span>&nbsp;</p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"scan"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"resultFormat"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"list"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"columns"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"product"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"city"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T11:00:00Z/2025-04-01T12:00:00Z"</span>] } </pre></div> <p>&nbsp; </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 3:</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Limit the number of records returned.</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"scan"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"resultFormat"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"compactedList"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"columns"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"__time"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"product"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T10:00:00Z/2025-04-01T16:00:00Z"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"limit"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">3</span> } </pre></div> <p>&nbsp; </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 4: </span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Using resultFormat as list.</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"scan"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"resultFormat"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"list"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"columns"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"__time"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"city"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T13:00:00Z/2025-04-01T16:00:00Z"</span>] } </pre></div> <p> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Druid GroupBy Native Queries with Filters</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">While scan queries in Druid return raw data, groupBy queries are used to aggregate data much like SQL GROUP BY. This is useful when you want to answer questions like:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is the total sales per product?</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is the sales count by city per hour?</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How much did each city sell after 2 PM?</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 1: Total Sales by Product</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"groupBy"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T10:00:00Z/2025-04-01T16:00:00Z"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"granularity"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"all"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dimensions"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"product"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"aggregations"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span>{<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"longSum"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_by_product"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"fieldName"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span><span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>] } </pre></div> <p>&nbsp; </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEqH2YPr-6p42yznTBFcjU5KpCqafufq8-m8ZkvMSC8EMwL7pxaX_AGMYWcwEiCRecH0zImSqhyphenhyphen0IyauBYSLQWNQvbYGdx8QgC5tfTSJ8wZqwsnztDmfmaDPkTDDwwVsdUJne0BYiXkp0NdYMiivf_6QQ99_yFXxyKzbzT_WiQIG4SFynaha98RUZ7Fng/s1384/druid%20native%20queries%203.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="626" data-original-width="1384" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEqH2YPr-6p42yznTBFcjU5KpCqafufq8-m8ZkvMSC8EMwL7pxaX_AGMYWcwEiCRecH0zImSqhyphenhyphen0IyauBYSLQWNQvbYGdx8QgC5tfTSJ8wZqwsnztDmfmaDPkTDDwwVsdUJne0BYiXkp0NdYMiivf_6QQ99_yFXxyKzbzT_WiQIG4SFynaha98RUZ7Fng/w400-h181/druid%20native%20queries%203.png" width="400" /></a></div><br /> <p></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 2: Sales per City after 1 PM</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"groupBy"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T13:00:00Z/2025-04-01T16:00:00Z"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"granularity"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"all"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dimensions"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"city"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"aggregations"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span>{<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"longSum"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_per_city"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"fieldName"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span><span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>] } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 3: Add a WHERE Clause (Filter by product = 'Laptop')</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryType"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"groupBy"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"sales_data"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"intervals"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"2025-04-01T10:00:00Z/2025-04-01T16:00:00Z"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"granularity"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"all"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"filter"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"selector"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dimension"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"product"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"value"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Laptop"</span> <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dimensions"</span>:<span style="color: #bbbbbb;"> </span>[<span style="background-color: #fff0f0;">"city"</span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"aggregations"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span>{<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"longSum"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"name"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #007700;">"fieldName"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"total_sales"</span><span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>] } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiemT7tU5vT9Zw9r3tFeK2atIts5QF7pXtJkwRCZewqxfBZVpwfn0-vfA01_3Ieakv78WBNpbohZw6Ki4uherLZUk_L-O4cOOJYfgKkDs9s2FlJ3Xgkz34ejWo4XdKDhTWaDaUuhz55DyigvqYQX8F0Mic2-BAd_bbB9-XeuHOVrKFdTn8lso0aCjZit88/s1384/druid%20native%20queries%204.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="565" data-original-width="1384" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiemT7tU5vT9Zw9r3tFeK2atIts5QF7pXtJkwRCZewqxfBZVpwfn0-vfA01_3Ieakv78WBNpbohZw6Ki4uherLZUk_L-O4cOOJYfgKkDs9s2FlJ3Xgkz34ejWo4XdKDhTWaDaUuhz55DyigvqYQX8F0Mic2-BAd_bbB9-XeuHOVrKFdTn8lso0aCjZit88/w400-h164/druid%20native%20queries%204.png" width="400" /></a></span></div><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span><p></p><p class="MsoNoSpacing"><br /></p><br /> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-load-data-from-orc-file-into.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/10/querying-apache-druid-via-http-apis.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-57382481808991475382025-09-12T23:57:00.000-07:002025-09-16T08:11:11.724-07:00How to load data from ORC file into Druid?<p><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is ORC file format?</span></b></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ORC stands for Optimized Row Columnar. It's a highly efficient columnar storage format used primarily in the Hadoop ecosystem, especially with Apache Hive and Apache Spark.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Enable ORC format in Apache Druid</span></b></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ORC support is not enabled by default in Apache Druid. To enable ORC format support and load ORC files into Druid, you need to manually add the ORC extension to the common.runtime.properties file and restart the Druid instance.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step-by-Step: Enable ORC Format in Apache Druid</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. Locate the common.runtime.properties file</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">If you're using the Druid single-server micro-quickstart, the file path is typically:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">{DRUID_HOME}/conf/druid/single-server/micro-quickstart/_common/common.runtime.properties</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">f you're using other modes like small, nano-quickstart, large, medium, or xlarge, locate the appropriate folder under:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">{DRUID_HOME}/conf/druid/single-server/</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Then navigate into the respective _common/common.runtime.properties.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Edit the druid.extensions.loadList property</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the following line:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><i>druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-multi-stage-query", "druid-parquet-extensions"]</i></span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You need to add "druid-orc-extensions" to the list like this:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><i>druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-multi-stage-query", "druid-parquet-extensions", "druid-orc-extensions"]</i></span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3. Restart your Druid instance</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">After saving the file, restart Druid using:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">bin/start-micro-quickstart</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This ensures Druid loads the ORC extension during startup.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Preparing orc file</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">sales_data.csv</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>timestamp,product,city,sales 2025-04-01T10:00:00Z,Laptop,Delhi,300 2025-04-01T10:00:00Z,Laptop,Delhi,200 2025-04-01T11:00:00Z,Tablet,Mumbai,150 2025-04-01T11:00:00Z,Tablet,Mumbai,50 2025-04-01T12:00:00Z,Mobile,Bengaluru,200 2025-04-01T13:00:00Z,Laptop,Hyderabad,250 2025-04-01T14:00:00Z,Tablet,Chennai,180 2025-04-01T15:00:00Z,Mobile,Pune,220 2025-04-01T15:00:00Z,Mobile,Pune,80 </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Navigate to the url </span><a href="https://dataconverter.io/convert/csv-to-orc"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://dataconverter.io/convert/csv-to-orc</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> and convert the csv to orc file, and save it as ‘sales_data.orc’.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Loading orc file</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Once Druid is running, go to the Druid Web Console </span><a href="http://localhost:8888"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">http://localhost:8888</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Load data -&gt; Batch-SQL multi-stage-query</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQqv5T2d2nqJyKhLi22LR9vdbocMKc1x44ORlp0Q0APLFSUUuqWFeDKH3IHmfVuR-lVZ2AEitrUaM8r9O-P3DmNFCDLWCkyZJhLzdIpGkkvRUmBzU2vq50CBFn6FmE-hIsYrG51BJry-qtayvCB4q3sZ-lBxHptwRo7Mh3bnPTW5cbATOgZTlFKy_n1o0/s1384/load%20orc%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="195" data-original-width="1384" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQqv5T2d2nqJyKhLi22LR9vdbocMKc1x44ORlp0Q0APLFSUUuqWFeDKH3IHmfVuR-lVZ2AEitrUaM8r9O-P3DmNFCDLWCkyZJhLzdIpGkkvRUmBzU2vq50CBFn6FmE-hIsYrG51BJry-qtayvCB4q3sZ-lBxHptwRo7Mh3bnPTW5cbATOgZTlFKy_n1o0/w400-h56/load%20orc%201.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Select Input type as ‘Local disk’.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpcxSFtKHADL7MbfFOVHSUSCM5WkoccjePk0g7kj0-BvkNaE_jRqstA7Y6Vuev2P1OlZNpxkE1ab58fKlu4LICopVD0-1rD4_IlAN1BpsUYtSVo9oHg8QK8mDQzriR4FK8r38ztsZ_gtLmtGeAyNFcnKAwNmkwH-n2aQaDQ_f3vr3wM9lQ5uMzyy0gi0/s1384/load%20orc%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="1384" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpcxSFtKHADL7MbfFOVHSUSCM5WkoccjePk0g7kj0-BvkNaE_jRqstA7Y6Vuev2P1OlZNpxkE1ab58fKlu4LICopVD0-1rD4_IlAN1BpsUYtSVo9oHg8QK8mDQzriR4FK8r38ztsZ_gtLmtGeAyNFcnKAwNmkwH-n2aQaDQ_f3vr3wM9lQ5uMzyy0gi0/w400-h231/load%20orc%202.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Set the Base directory to the parent directory of orc file.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Give the file name as sales_data.orc and click on Connect data button.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You will be taken to Load data / Parse page.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe7-qWNadajHpgIL5QFXDMw7jN_8L_3oovrggw7elDyqw0IrnOUKuT1lIeRDmjLIxytr6IUkUBGrWhm6HwcK5rtzjRRusc02cB_A-NxAGRn8u_cGX5da47HXgQBsC5T-vU7v1kBYaEeicy2bF21P1kNzQJfvr1qCwfqi3Ez3HwymjeNlxVyoQB6XH9ARE/s1384/load%20orc%203.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="803" data-original-width="1384" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe7-qWNadajHpgIL5QFXDMw7jN_8L_3oovrggw7elDyqw0IrnOUKuT1lIeRDmjLIxytr6IUkUBGrWhm6HwcK5rtzjRRusc02cB_A-NxAGRn8u_cGX5da47HXgQBsC5T-vU7v1kBYaEeicy2bF21P1kNzQJfvr1qCwfqi3Ez3HwymjeNlxVyoQB6XH9ARE/w400-h233/load%20orc%203.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Next button. You will be taken to ‘Load data / Configure schema’ tab</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-QvStK86M5bpdP4rzSAuhfiZ-isC1I7wqC9hCM86GF9LSG3rMRDfbuQ8hlw10AU5PDhLYF-qx2clERQD9CNXZxK2KBGFi0m6TnDCkwX9fiQH8feny-649r5TC0fiZFjmjCm_j2OaKDNCNGqcCTLkqoCMNo5DbaKqi96dfVz25Ot9DAHNP-oinRWiwh9A/s1384/load%20orc%204.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="809" data-original-width="1384" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-QvStK86M5bpdP4rzSAuhfiZ-isC1I7wqC9hCM86GF9LSG3rMRDfbuQ8hlw10AU5PDhLYF-qx2clERQD9CNXZxK2KBGFi0m6TnDCkwX9fiQH8feny-649r5TC0fiZFjmjCm_j2OaKDNCNGqcCTLkqoCMNo5DbaKqi96dfVz25Ot9DAHNP-oinRWiwh9A/w400-h234/load%20orc%204.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on SQL tab.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Give the table name as ‘sales_data_orc’.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZOZF3D4YgNmshFQni8pPWxs9PAv8N9MShZ9W0MACyMH4q85ahyWT02jy71jyqA4KshISl1aAQ-B9RC3X2lnb-Z8tDX2Clt6ZVyjaNC7UWkCmq8M5nfbDJC4F6Uzo4Z3Gm-BQ0ECSSDHmOxb67GLqRj32xEzEtfFfngzeTDtmI6p-CwYyhC7HOUwcUGnM/s1384/load%20orc%205.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="574" data-original-width="1384" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZOZF3D4YgNmshFQni8pPWxs9PAv8N9MShZ9W0MACyMH4q85ahyWT02jy71jyqA4KshISl1aAQ-B9RC3X2lnb-Z8tDX2Clt6ZVyjaNC7UWkCmq8M5nfbDJC4F6Uzo4Z3Gm-BQ0ECSSDHmOxb67GLqRj32xEzEtfFfngzeTDtmI6p-CwYyhC7HOUwcUGnM/w400-h166/load%20orc%205.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on ‘Start loading data’ button.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Upon Ingestion is successful, you will see successful message like below.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXUYVdNO0pxkM9Q78GWOjXaB0bKT-vhaUcOnhwq0RonmlUbO_pQuZ2MTfvt3mmN9I18jea7kW2Jh1mnM040xiDvGaElCmsu-nNqHoTgZoKqYvWkqEZaX6jlI0KmC336yqwf66Y8WkioAqwJn-FNftlsbcK2we_ld_aqxop20Z3TuYSMPJbDyL0b2eFCQw/s904/load%20orc%206.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="518" data-original-width="904" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXUYVdNO0pxkM9Q78GWOjXaB0bKT-vhaUcOnhwq0RonmlUbO_pQuZ2MTfvt3mmN9I18jea7kW2Jh1mnM040xiDvGaElCmsu-nNqHoTgZoKqYvWkqEZaX6jlI0KmC336yqwf66Y8WkioAqwJn-FNftlsbcK2we_ld_aqxop20Z3TuYSMPJbDyL0b2eFCQw/w400-h229/load%20orc%206.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Navigate to Query tab by clicking on ‘Query: sales_data_orc’ button.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Type following sql statement, and run the query.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">SELECT * FROM "sales_data_orc"</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAEusZ2qSIhcPsOjYRmfbVxApJsRzqYLzgUerpX8TtH0s40B5BLF03O53o2vwv2qHr5Czi7Nk3-1u2oAZNZbpFUEtXeCTnXUmBZbdlpbp4MX1pl8F5QiQggIhiKOIjoJO33DfH3Ea1eXOosM3ZvA30CRQHNIo8-5xwvhsA49qp3Wzy4l86ylFRqdj4o8s/s1384/load%20orc%207.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="672" data-original-width="1384" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAEusZ2qSIhcPsOjYRmfbVxApJsRzqYLzgUerpX8TtH0s40B5BLF03O53o2vwv2qHr5Czi7Nk3-1u2oAZNZbpFUEtXeCTnXUmBZbdlpbp4MX1pl8F5QiQggIhiKOIjoJO33DfH3Ea1eXOosM3ZvA30CRQHNIo8-5xwvhsA49qp3Wzy4l86ylFRqdj4o8s/w400-h194/load%20orc%207.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">That’s it you are done…</span><span lang="EN-US" style="font-family: Wingdings; mso-ansi-language: EN-US; mso-ascii-font-family: Verdana; mso-char-type: symbol; mso-hansi-font-family: Verdana; mso-symbol-font-family: Wingdings;"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;"></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">, Happy learning…</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-ingest-data-from-https-endpoint.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/exploring-apache-druid-native-queries.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-86961513808411416102025-09-12T23:53:00.000-07:002025-09-12T23:58:19.523-07:00How to Ingest Data from an HTTPS Endpoint into Apache Druid?<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Are you working with real-time or batch data that's accessible over HTTPS and wondering how to bring it into Apache Druid for fast analytics? You're in the right place!&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Apache Druid is a high-performance analytics database designed for rapid, ad-hoc queries on large datasets. While it's commonly used with Kafka, local files, or cloud storage systems like S3 or GCS, you can also pull data from an HTTPS endpoint such as a public API or your internal service and ingest it into Druid.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this blog post, I’ll Walk through how to ingest data from an HTTPS source using Druid’s HTTPs input type.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Open the url ‘http://localhost:8888’ in browser, you will be taken Druid console.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIC3ebSgZykV1Uz0PZAKjiIpvGxbXuOPd9Yc3EmQENY2s8JIi2XMBEOlrQFSz0uvj7hd6E5Mc1SYyKZxjjNUX7U8RWqbbM04oLN664i-iGMZS6jSaMxencmjRUP9geqLdWja3mScRJM-ttd_zjs8YItlOfjR2bawWzr0ZobjPbNFTovBsNowtgBOqhV4Q/s904/ingest%20data%20from%20https.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="298" data-original-width="904" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIC3ebSgZykV1Uz0PZAKjiIpvGxbXuOPd9Yc3EmQENY2s8JIi2XMBEOlrQFSz0uvj7hd6E5Mc1SYyKZxjjNUX7U8RWqbbM04oLN664i-iGMZS6jSaMxencmjRUP9geqLdWja3mScRJM-ttd_zjs8YItlOfjR2bawWzr0ZobjPbNFTovBsNowtgBOqhV4Q/w400-h131/ingest%20data%20from%20https.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Load data -&gt; Batch – SQL (multi-stage-query) button.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSjcMjWuCoe6wOGPqrcxb2fXz6sbj__q7oZzGyJi8-2gsdunRYp6j6JGa_L6ixBzEqSfwEJntiv-Zh2SIDCfzkOmmiPyxCxGGFGSzR8fHNIkqvM6AHgJPFH9H9pKw9aWUGhl9N_11gCTtOHYzElP_5INiPaMQW930lq0_ePe_i6Ztl5hhDavjslNBkaXs/s1384/ingest%20from%20https%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="812" data-original-width="1384" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSjcMjWuCoe6wOGPqrcxb2fXz6sbj__q7oZzGyJi8-2gsdunRYp6j6JGa_L6ixBzEqSfwEJntiv-Zh2SIDCfzkOmmiPyxCxGGFGSzR8fHNIkqvM6AHgJPFH9H9pKw9aWUGhl9N_11gCTtOHYzElP_5INiPaMQW930lq0_ePe_i6Ztl5hhDavjslNBkaXs/w400-h235/ingest%20from%20https%202.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">On the “Load Data / Select Input Type” page in Druid, choose HTTP(s) as your input type. This option allows you to provide one or more HTTPS URLs, separated by commas. For example, I used the following URL to ingest data into the Druid ecosystem:</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNormal"><a href="https://raw.githubusercontent.com/MainakRepositor/Datasets/refs/heads/master/Weather%20Data/pressure.csv"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://raw.githubusercontent.com/MainakRepositor/Datasets/refs/heads/master/Weather%20Data/pressure.csv</span></a></p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjumOjiuhRUBexZliiESrZU4LHw3xzWB2tGj_nJ6VEZnuUVCQZhVbRStg9sCChaFgTqv-0w-JYiSBBqBomuwS9KIeDoq88Lb4DZraSXet-Lu2ONsmSl99krUMWDA0dJzetJ5XNegIyhGJTVj4Hbv744icWzC9HGI0KG8ayCljHh8ZWwJj-j-AJ-0paqq7s/s1378/ingest%20from%20https%203.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1378" data-original-width="904" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjumOjiuhRUBexZliiESrZU4LHw3xzWB2tGj_nJ6VEZnuUVCQZhVbRStg9sCChaFgTqv-0w-JYiSBBqBomuwS9KIeDoq88Lb4DZraSXet-Lu2ONsmSl99krUMWDA0dJzetJ5XNegIyhGJTVj4Hbv744icWzC9HGI0KG8ayCljHh8ZWwJj-j-AJ-0paqq7s/w263-h400/ingest%20from%20https%203.png" width="263" /></a></div><br /><p></p><p class="MsoNormal"> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Connect data button.</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">You will be taken to ‘Load data / Parse’ page.</span>&nbsp;</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVGzaukgF52zT3gz_RSBBqaQNJDEHJTKECaQOhif3w_an1wOcgo5OPAxPbmrJ9bZtcX6qTs8cLx9IGii9E6ddFV1AtzyQ-hAsPCJdyzyNEZPWLOvCTxiHu2_x3uatoiDSAKv99Eqtr0DsMgCB92iKFqRJErcVDOd-3oVSjfj7KkbveG0F-vK2bYcjBl34/s1384/ingest%20from%20https%204.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="806" data-original-width="1384" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVGzaukgF52zT3gz_RSBBqaQNJDEHJTKECaQOhif3w_an1wOcgo5OPAxPbmrJ9bZtcX6qTs8cLx9IGii9E6ddFV1AtzyQ-hAsPCJdyzyNEZPWLOvCTxiHu2_x3uatoiDSAKv99Eqtr0DsMgCB92iKFqRJErcVDOd-3oVSjfj7KkbveG0F-vK2bYcjBl34/w400-h233/ingest%20from%20https%204.png" width="400" /></a></div><br />&nbsp;<p></p><p> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Next button.</span></p> <p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">You will be taken to ‘Load data / Configure schema’ page. You can observe __time column is generated from the datetime values of the dataset.</span>&nbsp;</p><p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibTAjMmR3O7OBnvutq91NknfKeQ9054myUgW8TyyC0Zcljjj0TGzNH_be2wFms5JKWAafaiewoU-eQR29sxHRSXauFa2J7tmjOtj73e3_sBvk7cMZLONiK-S05raVWD4BzoMrcegS1PzTcQ_j1ItM6kXB389iOSEDrFVBU4MsYc3xZqAqoKHBffNPeMfU/s1384/ingest%20from%20https%206.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="733" data-original-width="1384" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibTAjMmR3O7OBnvutq91NknfKeQ9054myUgW8TyyC0Zcljjj0TGzNH_be2wFms5JKWAafaiewoU-eQR29sxHRSXauFa2J7tmjOtj73e3_sBvk7cMZLONiK-S05raVWD4BzoMrcegS1PzTcQ_j1ItM6kXB389iOSEDrFVBU4MsYc3xZqAqoKHBffNPeMfU/w400-h211/ingest%20from%20https%206.png" width="400" /></a></div><br /><p></p><p> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on ‘Start loading data’ button.</span></p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTQmIkGAyMdZ_1IIJJNR6fU4Usy4ob7M72KJCzzh4nP1twRZ5b41MCRM_vlv5Jm38ov9y9UWIZyImAcFdLHR9atTuFXjc3OeRoCU8Vd8mOfcH-E6fCumRYCL1I4p7T3XH_XDSvAnk-4TpfLxYHwmAwEIXsTjHlKj4fLw29iapRMIfdcNwcshyphenhypheng4gXOwv4/s1384/ingest%20from%20https%207.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="418" data-original-width="1384" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTQmIkGAyMdZ_1IIJJNR6fU4Usy4ob7M72KJCzzh4nP1twRZ5b41MCRM_vlv5Jm38ov9y9UWIZyImAcFdLHR9atTuFXjc3OeRoCU8Vd8mOfcH-E6fCumRYCL1I4p7T3XH_XDSvAnk-4TpfLxYHwmAwEIXsTjHlKj4fLw29iapRMIfdcNwcshyphenhypheng4gXOwv4/w400-h121/ingest%20from%20https%207.png" width="400" /></a></div><br /><p></p><p class="MsoNormal"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Upon ingesting successful, navigate to Query tab and execute following sql statement.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">SELECT * FROM "pressure"</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7KsPnXnO25jwvuunCVz3EBeb5nhF0jAXDIPMRUXLn9uzbL3J0pHs0p9qt4JvTMO8dKtuDUwr2Zql-VWHiJxHVWBJ1t3tEiJVTJqc0z7PUBh3c2rRV3nwUTW1YEG6Rt1HmvrwzwhcdoTZ_Dvfr_PFX_C4wHZ5v1rbUsU3I5rSqpHm8KHhzZEG1yMRNX8U/s1384/ingest%20from%20https%208.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="791" data-original-width="1384" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7KsPnXnO25jwvuunCVz3EBeb5nhF0jAXDIPMRUXLn9uzbL3J0pHs0p9qt4JvTMO8dKtuDUwr2Zql-VWHiJxHVWBJ1t3tEiJVTJqc0z7PUBh3c2rRV3nwUTW1YEG6Rt1HmvrwzwhcdoTZ_Dvfr_PFX_C4wHZ5v1rbUsU3I5rSqpHm8KHhzZEG1yMRNX8U/w400-h229/ingest%20from%20https%208.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">That’s it, you are done….</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;&nbsp;</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/loading-data-from-kafka-into-apache.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-load-data-from-orc-file-into.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-17166476565778702152025-09-12T23:48:00.000-07:002025-09-16T08:21:52.833-07:00Customizing Content Retrieval in RAG with EmbeddingStoreContentRetriever for Smarter Responses<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Retrieval-Augmented Generation (RAG) models enhance AI's capabilities by feeding responses from external knowledge sources. However, effective RAG systems depend heavily on how documents are retrieved. In this post, I demonstrate how to customize the retrieval process using EmbeddingStoreContentRetriever by fine-tuning parameters like maxResults and minScore, and seamlessly integrating it with a chat assistant powered by a language model.</span></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why to customize the Retriever?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When fetching documents for a query, we may want to</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Limit the number of returned results (maxResults)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Filter out irrelevant results using a minimum similarity score (minScore)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Using custom embedding models</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This allows the system to return only the most relevant knowledge for response generation, reducing noise and improving trustworthiness.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>ContentRetriever<span style="color: #bbbbbb;"> </span>contentRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(embeddingStore)<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Your store (e.g., in-memory or persistent)</span> <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel)<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// BGE, OpenAI, etc.</span> <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">5</span>)<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Only return top 5 similar docs</span> <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.75</span>)<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Filter out documents below this similarity score</span> <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); ChatAssistant<span style="color: #bbbbbb;"> </span>assistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel)<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Your LLM (OpenAI, HuggingFace, etc.)</span> <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentRetriever</span>(contentRetriever)<span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Inject customized retriever</span> <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">ChatAssistant.java</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.assistants</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatAssistant</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">chat</span>(String<span style="color: #bbbbbb;"> </span>userMessage); } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">InMemoryRagWithContentRetriever.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.assistants.ChatAssistant</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.loader.FileSystemDocumentLoader</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.ContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.AiServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">InMemoryRagWithContentRetriever</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Initialize local embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>embeddingModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Load all the Documents</span> <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>resourcesFolderPath<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"/Users/Shared/llm_docs"</span>; <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Resources Folder Path is "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>resourcesFolderPath); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>FileSystemDocumentLoader.<span style="color: #0000cc;">loadDocuments</span>(resourcesFolderPath); <span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>embeddingStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">ingest</span>(documents,<span style="color: #bbbbbb;"> </span>embeddingStore); <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ContentRetriever<span style="color: #bbbbbb;"> </span>contentRetriever<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreContentRetriever.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(embeddingStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(embeddingModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">5</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.75</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>assistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentRetriever</span>(contentRetriever) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>questionsToAsk<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>questionsToAsk.<span style="color: #0000cc;">add</span>(<span style="background-color: #fff0f0;">"What is the tag line of ChronoCore Industries?"</span>); <span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">long</span><span style="color: #bbbbbb;"> </span>time1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">currentTimeMillis</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>question<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>questionsToAsk)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>answer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>assistant.<span style="color: #0000cc;">chat</span>(question); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"----------------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Q: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>question); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"A : "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>answer); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"----------------------------------------------------\n"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">long</span><span style="color: #bbbbbb;"> </span>time2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">currentTimeMillis</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Total time taken is "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>(time2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-</span><span style="color: #bbbbbb;"> </span>time1)); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Resources Folder Path is /Users/Shared/llm_docs ---------------------------------------------------- Q: What is the tag line of ChronoCore Industries? A : I couldn't find the tagline explicitly stated in the provided information. However, I can provide you with a possible tagline based on the company's mission and values: "Preserving Yesterday. Shaping Tomorrow." This tagline is consistent with the company's mission to "unlock the fabric of time itself — responsibly, ethically, and with profound respect for the continuum that binds reality." ---------------------------------------------------- Total time taken is 4012 </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/document-ingestion-with-langchain4j.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/enhancing-rag-retrievals-in-langchain4j.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-45301692896917096632025-09-12T23:44:00.000-07:002025-09-12T23:48:45.089-07:00Document Ingestion with LangChain4j using EmbeddingStoreIngestor<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this blog post, we'll explore how LangChain4j’s EmbeddingStoreIngestor works under the hood and how you can configure it to transform, split, and embed documents into an EmbeddingStore. If you're building LLM-based applications and need to semantically search or analyze documents, mastering this ingestion pipeline is a must.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The EmbeddingStoreIngestor is a utility that</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Takes in Documents</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Transforms and optionally splits them</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Embeds them using an EmbeddingModel</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Stores them in an EmbeddingStore</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This modular pipeline enables efficient vectorization and storage of text data, laying the foundation for semantic search, recommendations, and knowledge retrieval in your applications.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor<span style="color: #bbbbbb;"> </span>ingestor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">documentTransformer</span>( <span style="color: #bbbbbb;"> </span>document<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>Document.<span style="color: #0000cc;">from</span>(document.<span style="color: #0000cc;">text</span>().<span style="color: #0000cc;">toUpperCase</span>(),<span style="color: #bbbbbb;"> </span>document.<span style="color: #0000cc;">metadata</span>())) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">textSegmentTransformer</span>( <span style="color: #bbbbbb;"> </span>segment<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(segment.<span style="color: #0000cc;">text</span>().<span style="color: #0000cc;">toUpperCase</span>(),<span style="color: #bbbbbb;"> </span>segment.<span style="color: #0000cc;">metadata</span>())) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(embeddingStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">EmbeddingStoreIngestorDemo.java</span></b> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.embeddings</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Document</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.ollama.OllamaChatModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.output.TokenUsage</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.service.AiServices</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStoreIngestor</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.IngestionResult</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.ArrayList</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">EmbeddingStoreIngestorDemo</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">interface</span> <span style="color: #bb0066; font-weight: bold;">ChatAssistant</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">chat</span>(String<span style="color: #bbbbbb;"> </span>userMessage); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>Document<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>documents<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>Document<span style="color: #bbbbbb;"> </span>doc1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>Document.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"The stock market surged as tech companies reported strong earnings."</span>); <span style="color: #bbbbbb;"> </span>Document<span style="color: #bbbbbb;"> </span>doc2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>Document.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Tech giants like Apple and Amazon saw record profits this quarter."</span>); <span style="color: #bbbbbb;"> </span>Document<span style="color: #bbbbbb;"> </span>doc3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Document.<span style="color: #0000cc;">from</span>(<span style="background-color: #fff0f0;">"Heavy rain caused flooding in coastal towns yesterday."</span>); <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(doc1); <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(doc2); <span style="color: #bbbbbb;"> </span>documents.<span style="color: #0000cc;">add</span>(doc3); <span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>embeddingStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor<span style="color: #bbbbbb;"> </span>ingestor<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>EmbeddingStoreIngestor.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingModel</span>(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel()) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">documentTransformer</span>( <span style="color: #bbbbbb;"> </span>document<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>Document.<span style="color: #0000cc;">from</span>(document.<span style="color: #0000cc;">text</span>().<span style="color: #0000cc;">toUpperCase</span>(),<span style="color: #bbbbbb;"> </span>document.<span style="color: #0000cc;">metadata</span>())) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">textSegmentTransformer</span>( <span style="color: #bbbbbb;"> </span>segment<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(segment.<span style="color: #0000cc;">text</span>().<span style="color: #0000cc;">toUpperCase</span>(),<span style="color: #bbbbbb;"> </span>segment.<span style="color: #0000cc;">metadata</span>())) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embeddingStore</span>(embeddingStore) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>IngestionResult<span style="color: #bbbbbb;"> </span>ingestionResult<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>ingestor.<span style="color: #0000cc;">ingest</span>(documents); <span style="color: #bbbbbb;"> </span>TokenUsage<span style="color: #bbbbbb;"> </span>tokenUsage<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>ingestionResult.<span style="color: #0000cc;">tokenUsage</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Input Token Count : "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>tokenUsage.<span style="color: #0000cc;">inputTokenCount</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Output Token Count : "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>tokenUsage.<span style="color: #0000cc;">outputTokenCount</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Total Token Count : "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>tokenUsage.<span style="color: #0000cc;">totalTokenCount</span>()); <span style="color: #bbbbbb;"> </span>OllamaChatModel<span style="color: #bbbbbb;"> </span>chatModel<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>OllamaChatModel.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">baseUrl</span>(<span style="background-color: #fff0f0;">"http://localhost:11434"</span>).<span style="color: #0000cc;">modelName</span>(<span style="background-color: #fff0f0;">"llama3.2"</span>).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>ChatAssistant<span style="color: #bbbbbb;"> </span>assistant<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span> <span style="color: #bbbbbb;"> </span>AiServices.<span style="color: #0000cc;">builder</span>(ChatAssistant.<span style="color: #0000cc;">class</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">chatModel</span>(chatModel) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">contentRetriever</span>(EmbeddingStoreContentRetriever.<span style="color: #0000cc;">from</span>(embeddingStore)) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span>List<span style="color: #333333;">&lt;</span>String<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>questionsToAsk<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>ArrayList<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>questionsToAsk.<span style="color: #0000cc;">add</span>(<span style="background-color: #fff0f0;">"Is tech companies stocks surged?"</span>); <span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">long</span><span style="color: #bbbbbb;"> </span>time1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">currentTimeMillis</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(String<span style="color: #bbbbbb;"> </span>question<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>questionsToAsk)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>answer<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>assistant.<span style="color: #0000cc;">chat</span>(question); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"----------------------------------------------------"</span>); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Q: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>question); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"A : "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>answer); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"----------------------------------------------------\n"</span>); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">long</span><span style="color: #bbbbbb;"> </span>time2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">currentTimeMillis</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Total time taken is "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>(time2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-</span><span style="color: #bbbbbb;"> </span>time1)); <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Input Token Count : 32 Output Token Count : null Total Token Count : 32 ---------------------------------------------------- Q: Is tech companies stocks surged? A : Yes, tech companies' stocks surged due to the strong earnings reported by these companies. ---------------------------------------------------- Total time taken is 1984 </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;&nbsp;</span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/understanding-embeddingsearchresult-and.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/customizing-content-retrieval-in-rag.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-44479159431181256502025-09-11T06:15:00.000-07:002025-09-12T23:44:38.998-07:00Understanding EmbeddingSearchResult and EmbeddingMatch in LangChain4j<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The EmbeddingSearchResult class represents the result of a semantic search in an EmbeddingStore. It holds a list of the most relevant matches to your query, each represented by an EmbeddingMatch.</span></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>EmbeddingSearchResult<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>result<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">search</span>(request); </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is EmbeddingMatch?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each result inside EmbeddingSearchResult is an instance of EmbeddingMatch.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">EmbeddingMatch</span><span style="color: #333333;">&lt;</span>Embedded<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">final</span><span style="color: #bbbbbb;"> </span>Double<span style="color: #bbbbbb;"> </span>score; <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">final</span><span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>embeddingId; <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">final</span><span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>embedding; <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">private</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">final</span><span style="color: #bbbbbb;"> </span>Embedded<span style="color: #bbbbbb;"> </span>embedded; } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here:</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">score: A relevance score (derived from cosine similarity). Higher means more relevant.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">embeddingId: The unique identifier of the embedding in the store.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">embedding: The vector representation that matched the query.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">embedded: The original content that was embedded (like a paragraph, chunk, or TextSegment).</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Example</span></b><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>EmbeddingSearchRequest<span style="color: #bbbbbb;"> </span>request<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>EmbeddingSearchRequest.<span style="color: #0000cc;">builder</span>() <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">embedding</span>(myQueryEmbedding) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">2</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.5</span>) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">build</span>(); EmbeddingSearchResult<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>result<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">search</span>(request); <span style="color: #008800; font-weight: bold;">for</span><span style="color: #bbbbbb;"> </span>(EmbeddingMatch<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>match<span style="color: #bbbbbb;"> </span>:<span style="color: #bbbbbb;"> </span>result.<span style="color: #0000cc;">matches</span>())<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Score: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>match.<span style="color: #0000cc;">score</span>()); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Original content: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>match.<span style="color: #0000cc;">embedded</span>().<span style="color: #0000cc;">text</span>()); } </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">EmbeddingSearchWithFilters.java</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.embeddings</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Metadata</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.embedding.Embedding</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingSearchRequest</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingSearchResult</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.Filter</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.comparison.IsEqualTo</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.comparison.IsGreaterThanOrEqualTo</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.comparison.IsIn</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.logical.And</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">EmbeddingSearchWithFilters</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 1: Initialize embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>model<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 2: Prepare text data with metadata</span> <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>sentence1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The stock market surged as tech companies reported strong earnings."</span>; <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>metaMap1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>metaMap1.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"finance"</span>); <span style="color: #bbbbbb;"> </span>metaMap1.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"news"</span>); <span style="color: #bbbbbb;"> </span>metaMap1.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">9</span>); <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>meta1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(metaMap1); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>sentence2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Tech giants like Apple and Amazon saw record profits this quarter."</span>; <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>metaMap2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>metaMap2.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"technology"</span>); <span style="color: #bbbbbb;"> </span>metaMap2.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"news"</span>); <span style="color: #bbbbbb;"> </span>metaMap2.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">10</span>); <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>meta2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(metaMap2); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>sentence3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Heavy rain caused flooding in coastal towns yesterday."</span>; <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>metaMap3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>metaMap3.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"weather"</span>); <span style="color: #bbbbbb;"> </span>metaMap3.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"alert"</span>); <span style="color: #bbbbbb;"> </span>metaMap3.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">5</span>); <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>meta3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(metaMap3); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">try</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 3: Generate embeddings</span> <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>embedding1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(sentence1).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>embedding2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(sentence2).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>embedding3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(sentence3).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 4: Initialize in-memory embedding store</span> <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>embeddingStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 5: Add embeddings to the store with metadata</span> <span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">add</span>(embedding1,<span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(sentence1,<span style="color: #bbbbbb;"> </span>meta1)); <span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">add</span>(embedding2,<span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(sentence2,<span style="color: #bbbbbb;"> </span>meta2)); <span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">add</span>(embedding3,<span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(sentence3,<span style="color: #bbbbbb;"> </span>meta3)); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Embeddings with metadata added to the store successfully."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 6: Prepare a query embedding</span> <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>queryEmbedding<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(<span style="background-color: #fff0f0;">"Which tech companies had profits?"</span>).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span>Filter<span style="color: #bbbbbb;"> </span>filter<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>And( <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>And(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsEqualTo(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"news"</span>),<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsIn(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"technology"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"finance"</span>))), <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsGreaterThanOrEqualTo(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span>Integer.<span style="color: #0000cc;">valueOf</span>(<span style="color: #0000dd; font-weight: bold;">9</span>))); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 8: Build search request with filter</span> <span style="color: #bbbbbb;"> </span>EmbeddingSearchRequest<span style="color: #bbbbbb;"> </span>request<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>EmbeddingSearchRequest.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">queryEmbedding</span>(queryEmbedding) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">2</span>).<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.5</span>).<span style="color: #0000cc;">filter</span>(filter).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 9: Perform search</span> <span style="color: #bbbbbb;"> </span>EmbeddingSearchResult<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>result<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">search</span>(request); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 10: Display results</span> <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\nFiltered &amp; Ranked Results:"</span>); <span style="color: #bbbbbb;"> </span>result.<span style="color: #0000cc;">matches</span>().<span style="color: #0000cc;">forEach</span>(match<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>TextSegment<span style="color: #bbbbbb;"> </span>segment<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>match.<span style="color: #0000cc;">embedded</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">printf</span>(<span style="background-color: #fff0f0;">"Score: %.3f | Text: %s | Metadata: %s%n"</span>,<span style="color: #bbbbbb;"> </span>match.<span style="color: #0000cc;">score</span>(),<span style="color: #bbbbbb;"> </span>segment.<span style="color: #0000cc;">text</span>(), <span style="color: #bbbbbb;"> </span>segment.<span style="color: #0000cc;">metadata</span>()); <span style="color: #bbbbbb;"> </span>}); <span style="color: #bbbbbb;"> </span>}<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">catch</span><span style="color: #bbbbbb;"> </span>(Exception<span style="color: #bbbbbb;"> </span>e)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">err</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"An error occurred: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>e.<span style="color: #0000cc;">getMessage</span>()); <span style="color: #bbbbbb;"> </span>e.<span style="color: #0000cc;">printStackTrace</span>(); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Embeddings with metadata added to the store successfully. Filtered &amp; Ranked Results: Score: 0.883 | Text: Tech giants like Apple and Amazon saw record profits this quarter. | Metadata: Metadata { metadata = {category=technology, relevance=10, source=news} } Score: 0.882 | Text: The stock market surged as tech companies reported strong earnings. | Metadata: Metadata { metadata = {category=finance, relevance=9, source=news} } </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/filtering-embedding-searches-in.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/document-ingestion-with-langchain4j.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-960002841829838292025-09-11T06:04:00.000-07:002025-09-12T23:53:33.727-07:00Loading Data from Kafka into Apache Druid<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In the world of big data, real-time analytics is becoming very important. Apache Druid is a high-performance analytics database designed for fast slice-and-dice analytics on large datasets. Apache Kafka is a widely used distributed event streaming platform.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, I will walk you through the concepts, setup, and step-by-step instructions to get your Kafka data flowing into Druid for real-time querying.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><br /></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. Setup Kafka</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Apache Kafka is a powerful tool for building real-time data pipelines. It works like a high-speed messaging system, collecting data from various sources and passing it along to systems that process or analyze it.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Think of Kafka as a post office for data:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Producers drop off messages (e.g., a user clicked a button).</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Kafka stores and delivers these messages.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Consumers pick up the messages and do something with them, like store them in a database, trigger alerts, or update dashboards.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Kafka is used by companies like LinkedIn, Netflix, and Uber to handle millions of messages per second, making it a perfect fit for real-time data streaming.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Follow step-by-step procedure to setup Kafka.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1: </span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Go to the following link and setup Kafka.</span></p> <p class="MsoNoSpacing"><a href="https://kafka.apache.org/downloads"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://kafka.apache.org/downloads</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">At the time of writing this post, 4.0.0 is the latest version.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2: </span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Generate a Cluster UUID by executing following statement.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Navigate to Kafka home directory and execute below command.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)" </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)" $ $echo $KAFKA_CLUSTER_ID ImA96y2CTJGN-HzF3GSFWg </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 3: </span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Format log directories.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>bin/kafka-storage.sh format --standalone -t $KAFKA_CLUSTER_ID -c config/server.properties </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$bin/kafka-storage.sh format --standalone -t $KAFKA_CLUSTER_ID -c config/server.properties Formatting dynamic metadata voter directory /tmp/kraft-combined-logs with metadata.version 4.0-IV3. </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 4: </span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Start the Kafka Server</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>bin/kafka-server-start.sh config/server.properties </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Once the Kafka server has successfully launched, you will have a basic Kafka environment running and ready to use.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 5: Create a Kafka Topic for Order Events</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s create a Kafka topic to hold incoming order events from our e-commerce platform. These could be events like a customer placing an order, the order being shipped, or the order getting canceled.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Run the following command to create a topic named ecommerce-orders:</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>bin/kafka-topics.sh --create --topic ecommerce-orders --bootstrap-server localhost:9092 </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$ bin/kafka-topics.sh --create --topic ecommerce-orders --bootstrap-server localhost:9092 Created topic ecommerce-orders. </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 6: Produce Some Sample Order Events</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Now let’s simulate a few order events using kafka-console-producer.sh. These JSON messages represent individual e-commerce transactions.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each message includes:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">order_id: Unique ID for the order</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">user_id: ID of the customer</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">product_id: ID of the product purchased</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">amount: Order total in USD</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">order_status: Current status (e.g., placed, shipped, delivered)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">timestamp: Order time in epoch milliseconds (used by Druid for ingestion)</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Send a sample order to Kafka</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>echo '{"order_id":"ORD12345", "user_id":"U001", "product_id":"P1001", "amount":49.99, "order_status":"placed", "timestamp":1714567890123}' | bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic ecommerce-orders </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">You can send few more.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>echo '{"order_id":"ORD12346", "user_id":"U002", "product_id":"P1002", "amount":89.50, "order_status":"shipped", "timestamp":1714567900000}' | bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic ecommerce-orders echo '{"order_id":"ORD12347", "user_id":"U001", "product_id":"P1003", "amount":15.75, "order_status":"delivered", "timestamp":1714567910000}' | bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic ecommerce-orders </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 7: Consume the Messages from the Topic</span></b></p> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Let’s verify that Kafka is receiving these messages. Use the consumer to read from the topic:</span> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>bin/kafka-console-consumer.sh --topic ecommerce-orders --from-beginning --bootstrap-server localhost:9092 </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$ bin/kafka-console-consumer.sh --topic ecommerce-orders --from-beginning --bootstrap-server localhost:9092 {"order_id":"ORD12345", "user_id":"U001", "product_id":"P1001", "amount":49.99, "order_status":"placed", "timestamp":1714567890123} {"order_id":"ORD12346", "user_id":"U002", "product_id":"P1002", "amount":89.50, "order_status":"shipped", "timestamp":1714567900000} {"order_id":"ORD12347", "user_id":"U001", "product_id":"P1003", "amount":15.75, "order_status":"delivered", "timestamp":1714567910000} </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Configure Druid to consume from ecommerce-orders topic</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Login to Druid console (</span><a href="http://localhost:8888/"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">http://localhost:8888/</span></a><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">).</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}a:link, span.MsoHyperlink {mso-style-priority:99; color:#467886; mso-themecolor:hyperlink; text-decoration:underline; text-underline:single;}a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:#96607D; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxewleGvwpMNM9NI4PbiA_sF9dA2Q56ngjwAEuEnBzpMC2zBy8oixM3W1NVGpaJof9CK8EPlBz2BIZbiArYfrjC8LgT19d8RyTvCd2LHgpjuJSwP8bzO4D4_pTDNOYJ00rDWjyWSRxmJem-6H53hX4RMv6uY3aHUgY1m9iEYJrmzeDxr32FeFrdDKA-yU/s1384/druid%20from%20kafka.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="531" data-original-width="1384" height="154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxewleGvwpMNM9NI4PbiA_sF9dA2Q56ngjwAEuEnBzpMC2zBy8oixM3W1NVGpaJof9CK8EPlBz2BIZbiArYfrjC8LgT19d8RyTvCd2LHgpjuJSwP8bzO4D4_pTDNOYJ00rDWjyWSRxmJem-6H53hX4RMv6uY3aHUgY1m9iEYJrmzeDxr32FeFrdDKA-yU/w400-h154/druid%20from%20kafka.png" width="400" /></a></span></div><p></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Load data -&gt; Streaming</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDocA1hhQqbtKRonDiM9A4pxqYViGPdO0BcchFuhmx-rxXY9Rnd-6Cn1ITtRmfOp2Q2JlEI_BPUtMIZJMS689e98tVif0q5WhBxfzMfSBL0R09TfDqOvHP3XS91vyllJyuq1mMaL-CizxZV_N36WERUBZLmTc6T_nAP6uenbnxuIRAXHhz2ZNj6ifkTUg/s1384/druid%20from%20kafka%202.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="213" data-original-width="1384" height="61" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDocA1hhQqbtKRonDiM9A4pxqYViGPdO0BcchFuhmx-rxXY9Rnd-6Cn1ITtRmfOp2Q2JlEI_BPUtMIZJMS689e98tVif0q5WhBxfzMfSBL0R09TfDqOvHP3XS91vyllJyuq1mMaL-CizxZV_N36WERUBZLmTc6T_nAP6uenbnxuIRAXHhz2ZNj6ifkTUg/w400-h61/druid%20from%20kafka%202.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Select ‘Apache Kafka’ and click on Connect data button.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKtk9r4wilf0_zCXPOWCc_N0h88Ot8bV6ozAfN3NJ2LokuV8aLBXg_5fL_1KzoLxRbNUomMcNVMmpNvLec7e03nqM8lAgP00AiMJG76WwS49lib7pciHNdIbdveFWa7xmAxH9QuNfJ9A4qRTYz2KIJHcor5KrxlMbt7NjkpEIdXGmJHlsG8QZF1Jxg1Zc/s1384/druid%20from%20kafka%203.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="281" data-original-width="1384" height="81" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKtk9r4wilf0_zCXPOWCc_N0h88Ot8bV6ozAfN3NJ2LokuV8aLBXg_5fL_1KzoLxRbNUomMcNVMmpNvLec7e03nqM8lAgP00AiMJG76WwS49lib7pciHNdIbdveFWa7xmAxH9QuNfJ9A4qRTYz2KIJHcor5KrxlMbt7NjkpEIdXGmJHlsG8QZF1Jxg1Zc/w400-h81/druid%20from%20kafka%203.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Give Bootstrap server as localhost:9092, topic name as ecommerce-orders and click on Apply button.</span></p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xploOuGl8bIfWcwDnR8H1fHmPsX3OPFDWqYXOokAIb9LblgTvTFKnDPExmHm5kZidqUPyVCJj7XyLrGqBt9DUGbuWolYcrIkoDQw30SN7fPm_haA1PEodW5pvGCdbk-cJP6VXEFwITug7AGg03xJ2JlQJ0GvBPQH6Y5a_mCUxWdO-4rYcBnexSpUdnA/s1396/druid%20from%20kafka%204.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1396" data-original-width="778" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xploOuGl8bIfWcwDnR8H1fHmPsX3OPFDWqYXOokAIb9LblgTvTFKnDPExmHm5kZidqUPyVCJj7XyLrGqBt9DUGbuWolYcrIkoDQw30SN7fPm_haA1PEodW5pvGCdbk-cJP6VXEFwITug7AGg03xJ2JlQJ0GvBPQH6Y5a_mCUxWdO-4rYcBnexSpUdnA/w223-h400/druid%20from%20kafka%204.png" width="223" /></a></div><br /><p></p><p class="MsoNormal"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Once you click on Apply button, Druid start polling the data from Kafka topic.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRb6rS2A2KCtSAR8k2Zb1sRLxKRuksh3HYKAzuH25HuSRDTk3dKv5E3eJ4WiBHZ4kkawB7ZmARGFHVigNoFZnYkrYIUr7S1pcghGx3V9GRP2uikjQQZrTTK0ZPJv4yDkL4EAjBXbeTWhbwuiZ607EtONVRoQ_5ri4ysLFcvF5OfArhqXD4Rd4WH_SU0yk/s1384/druid%20from%20kafka%205.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="803" data-original-width="1384" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRb6rS2A2KCtSAR8k2Zb1sRLxKRuksh3HYKAzuH25HuSRDTk3dKv5E3eJ4WiBHZ4kkawB7ZmARGFHVigNoFZnYkrYIUr7S1pcghGx3V9GRP2uikjQQZrTTK0ZPJv4yDkL4EAjBXbeTWhbwuiZ607EtONVRoQ_5ri4ysLFcvF5OfArhqXD4Rd4WH_SU0yk/w400-h233/druid%20from%20kafka%205.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Parse data button available at bottom right corner.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEganMCHBOmkIONUc3VnuwVM4_SIQEDQiG25mb6tt3qFZh2Y_FyU1VZlfT1wngNnvAPzLGI9TYgMQoaAaazuN9mekZGPuZz_-Wt825BXEY49_Kco_2FLP8dLa5VcmwTN9dbOAY37q2oNkELaKj2hyJcU0E-xMlk2UkXhaOyLVuBwKA5kURaoAotU_Jo-hSE/s1384/druid%20from%20kafka%207.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="803" data-original-width="1384" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEganMCHBOmkIONUc3VnuwVM4_SIQEDQiG25mb6tt3qFZh2Y_FyU1VZlfT1wngNnvAPzLGI9TYgMQoaAaazuN9mekZGPuZz_-Wt825BXEY49_Kco_2FLP8dLa5VcmwTN9dbOAY37q2oNkELaKj2hyJcU0E-xMlk2UkXhaOyLVuBwKA5kURaoAotU_Jo-hSE/w400-h233/druid%20from%20kafka%207.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Parse time button.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_sVNBlEad9wSC871qis8AHtv9_j-nIwylkP5VGJ8LaDXdokvCE-2cdx7eX3HzdBmUYd_SHZJSknPL1Wm7kdSD5rRJuAAGp0L4f9QC2pu0ttX3zlRuanfFgzF2IMJXPDS4VN27OUbr84w9g2Ij3xJB6_I4BbvqEScSJQucNK0nd5U87vFBH4OuF5mAv0/s1384/druid%20from%20kafka%208.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="1384" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji_sVNBlEad9wSC871qis8AHtv9_j-nIwylkP5VGJ8LaDXdokvCE-2cdx7eX3HzdBmUYd_SHZJSknPL1Wm7kdSD5rRJuAAGp0L4f9QC2pu0ttX3zlRuanfFgzF2IMJXPDS4VN27OUbr84w9g2Ij3xJB6_I4BbvqEScSJQucNK0nd5U87vFBH4OuF5mAv0/w400-h231/druid%20from%20kafka%208.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Here you can observe __time column took timestamp field of the records to segment the data.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Subsequently click on Transform, Filter, Configure Schema, Partition buttons.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">In the Partition tab, select Segment granularity as day.</span>&nbsp;</p><p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8N8X95vPhfI9m5LuTb9-O1GnmhO6hVHvx5gLGujnN_J1yv7t67eKmi0iI7UdbEyRw5DaH_5HTFnnhXJZPlkNl_cSg23kXi4zdSTQ0V3VrRvSEA3AzqlSEGzYXTFx5PEk-8_-lcLyzue8h4HwORKswLejyx3FknLaW-Cx7_PIihXQtUBlPBumb5HlrT4U/s1384/druid%20from%20kafka%209.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="803" data-original-width="1384" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8N8X95vPhfI9m5LuTb9-O1GnmhO6hVHvx5gLGujnN_J1yv7t67eKmi0iI7UdbEyRw5DaH_5HTFnnhXJZPlkNl_cSg23kXi4zdSTQ0V3VrRvSEA3AzqlSEGzYXTFx5PEk-8_-lcLyzue8h4HwORKswLejyx3FknLaW-Cx7_PIihXQtUBlPBumb5HlrT4U/w400-h233/druid%20from%20kafka%209.png" width="400" /></a></div><br /><p></p><p> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Tune button. In the Tune tab, set ‘Use earliest offset’ as True.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNAGEKsrha2O-Fk3nOe30izCXi3dZOkgGhvk8N0QRJrkxXGnCeH__8Ws_0GNnOClDeVRy0k7jRFQR5qI-NPDmdIHetBz2xWMGqM1hnUMeOTQ0u0_isJdjf8r5iO7C5qoiFgv8Yq5O9WP4eDIGLN8AgQGvIrfyK2ZsJpekKxQfhF64LNO6hYvKMARSLmfQ/s1384/druid%20from%20kafka%2010.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="745" data-original-width="1384" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNAGEKsrha2O-Fk3nOe30izCXi3dZOkgGhvk8N0QRJrkxXGnCeH__8Ws_0GNnOClDeVRy0k7jRFQR5qI-NPDmdIHetBz2xWMGqM1hnUMeOTQ0u0_isJdjf8r5iO7C5qoiFgv8Yq5O9WP4eDIGLN8AgQGvIrfyK2ZsJpekKxQfhF64LNO6hYvKMARSLmfQ/w400-h215/druid%20from%20kafka%2010.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Publish button, followed by Edit spec.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In the Edit spec tab, click on Submit supervisor (running) button.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3gKgGefWGxI8Ao_-x04xESwb4hd_yHqBIQS4W6vqt4k20E8bbgD6lMjqQwVOORYkBJK07CGGTgO1SjLH_m2fgEYleov6GCfEbuNUXDo9vo39L5ZMKqIMGpp9sWA-xfpfhtnCF7FdGsSp8XjUtlCEeuT9FKoNckLNtbeYqnj-pPC074RDC1NnCsuJCYg0/s1384/druid%20from%20kafka%2011.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="797" data-original-width="1384" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3gKgGefWGxI8Ao_-x04xESwb4hd_yHqBIQS4W6vqt4k20E8bbgD6lMjqQwVOORYkBJK07CGGTgO1SjLH_m2fgEYleov6GCfEbuNUXDo9vo39L5ZMKqIMGpp9sWA-xfpfhtnCF7FdGsSp8XjUtlCEeuT9FKoNckLNtbeYqnj-pPC074RDC1NnCsuJCYg0/w400-h230/druid%20from%20kafka%2011.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">You can observe ecommerce-order task is submitted and in PENDING state.</span> <style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5qZzkCtKMscy3UXTUR8gcPvHdgUyhYlj7Q3Tgc_11ruvm5Z5KJdp95FkXJ6OkuW-5HZrr2LBu9y_c1OTQYrRw93289DLM7hL0nSvQ9d4E9dJLlPXQZiI4hp6E9whiONmS-Hkq9QT1yMyh78pMvAzQJVFIDc_Ao6PJIAHidbZMSoo_tSivyZaexH8pVk/s1384/druid%20from%20kafka%2012.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="323" data-original-width="1384" height="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5qZzkCtKMscy3UXTUR8gcPvHdgUyhYlj7Q3Tgc_11ruvm5Z5KJdp95FkXJ6OkuW-5HZrr2LBu9y_c1OTQYrRw93289DLM7hL0nSvQ9d4E9dJLlPXQZiI4hp6E9whiONmS-Hkq9QT1yMyh78pMvAzQJVFIDc_Ao6PJIAHidbZMSoo_tSivyZaexH8pVk/w400-h94/druid%20from%20kafka%2012.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Wait for some time and click on Refresh button. You can observe that the task is moved to RUNNING state.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9f5B386Ji1s3BC34kRZIHc2GDUJldIoHI8F5O-XlK4eMSayFeod5j_wRI1Y9pB4s8mXVuAOWcbwGxZsuP_8z9AvIZJDRaa6AzSLdB88EKTATmHPsz2CuBmR1-gnoY-DNgs75mEwSc1xZIthuCH7JZW6E1ZpeETkZb6Pu3KmLt1SIvmNXrmpyLhJ9OuGY/s1384/druid%20from%20kafka%2013.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="326" data-original-width="1384" height="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9f5B386Ji1s3BC34kRZIHc2GDUJldIoHI8F5O-XlK4eMSayFeod5j_wRI1Y9pB4s8mXVuAOWcbwGxZsuP_8z9AvIZJDRaa6AzSLdB88EKTATmHPsz2CuBmR1-gnoY-DNgs75mEwSc1xZIthuCH7JZW6E1ZpeETkZb6Pu3KmLt1SIvmNXrmpyLhJ9OuGY/w400-h94/druid%20from%20kafka%2013.png" width="400" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Navigate to Druid Query tab and execute following query to print all the records of the datasource ecommerce-orders</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">SELECT</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">*</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">FROM</span><span style="color: #bbbbbb;"> </span><span style="color: #aa6600;">"ecommerce-orders"</span> </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGBICGYkNsWrgV27EAp_Tl3ZTQfB8r4M_jLxMBL3HoUYzlmRQ7ZwdQV8MfnUtKdmkDfigFYzkcc36tLuxQLlLVoyUgKXkVPsYwMM8Mt8EKK4hwBsWcU1ovTxu7xdJFFn7wsa5E6Cp47GGEax8ImDaWSo-cHyoynHka2IaTYkhh2-KnqzvxLNq_Z-t6zeM/s1384/druid%20from%20kafka%2015.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="571" data-original-width="1384" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGBICGYkNsWrgV27EAp_Tl3ZTQfB8r4M_jLxMBL3HoUYzlmRQ7ZwdQV8MfnUtKdmkDfigFYzkcc36tLuxQLlLVoyUgKXkVPsYwMM8Mt8EKK4hwBsWcU1ovTxu7xdJFFn7wsa5E6Cp47GGEax8ImDaWSo-cHyoynHka2IaTYkhh2-KnqzvxLNq_Z-t6zeM/w400-h165/druid%20from%20kafka%2015.png" width="400" /></a></div><br />&nbsp;<p></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s add one more event to the ecommerce-orders topic.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>echo '{"order_id":"ORD12347", "user_id":"U003", "product_id":"P1004", "amount":99.50, "order_status":"shipped", "timestamp":1714567990900}' | bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic ecommerce-orders </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Navigate to Druid Query tab and rerune the sql query, you can see new event is pulled by Druid.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM05Deq7TsBPQJD6nI_K3V3Y9aHgHdiuOH-n-lKP-Vg4598LMy_am2Vfw6BSAenPRC646P7l1ccZoBrXW8INmMg8UI7-fc8j8Wf3r3OKvs3utt45x2zIiUsny1C3JULXqC4XyBgwgx7qWXGeowwxHtUkm79T7VAfx4X6j3KmL_GVCFBfVHVuPrIb-iSn0/s1384/druid%201.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="534" data-original-width="1384" height="154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM05Deq7TsBPQJD6nI_K3V3Y9aHgHdiuOH-n-lKP-Vg4598LMy_am2Vfw6BSAenPRC646P7l1ccZoBrXW8INmMg8UI7-fc8j8Wf3r3OKvs3utt45x2zIiUsny1C3JULXqC4XyBgwgx7qWXGeowwxHtUkm79T7VAfx4X6j3KmL_GVCFBfVHVuPrIb-iSn0/w400-h154/druid%201.png" width="400" /></a></div><br /> <p></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">That’s it, Happy learning….:)</span></p> <p class="MsoNoSpacing"><br /></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}a:link, span.MsoHyperlink {mso-style-priority:99; color:#467886; mso-themecolor:hyperlink; text-decoration:underline; text-underline:single;}a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:#96607D; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-delete-segments-in-druid.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-ingest-data-from-https-endpoint.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-73633632382344813062025-09-09T06:46:00.000-07:002025-09-11T06:05:06.609-07:00How to delete segments in Druid?<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This is continuation to my previous post. I would recommend you to go through my previous post and understand segements.&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why to Delete a Segment?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sometimes, you might want to:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Delete old data (e.g., logs from 3 months ago)</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Fix corrupted or incorrect data</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Reingest data for a given time range</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How to delete a segment permanently?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">To delete a segment permanently, you must first mark it as unused, and then delete it from storage.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">There are multiple ways to mark the segments as unused. To demonstrate the examples, I am using blog_visits datasource, which has 11 segments.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfOY_UTUsbaw65Cp8XLbTUywqSuWa1v507p1kHUaWFYqm2IM9x0HucjEId0zY8qdoJAhVX-QxbvxKCIaz8hqUII2axLoxzIsoo0bpAf3xBNRYb7CMPify1shuSh9HNxhrkZehK7ywOGOXSqLaFrDRLKQfHbdGJbjyS0MY6NiIgetK3Bw2HOhtKxRCq94w/s1384/delete%20segment.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="681" data-original-width="1384" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfOY_UTUsbaw65Cp8XLbTUywqSuWa1v507p1kHUaWFYqm2IM9x0HucjEId0zY8qdoJAhVX-QxbvxKCIaz8hqUII2axLoxzIsoo0bpAf3xBNRYb7CMPify1shuSh9HNxhrkZehK7ywOGOXSqLaFrDRLKQfHbdGJbjyS0MY6NiIgetK3Bw2HOhtKxRCq94w/s320/delete%20segment.png" width="320" /></a></div><br /><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Option 1: Mark Specific Segment IDs as Unused</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">If you know the exact segment IDs, you can pass them in the payload:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Syntax</span></b></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></b></p><pre class="hljs" style="background: rgb(240, 240, 240); color: #444444; display: block; overflow-x: auto; padding: 0.5em;">curl -X POST "http://&lt;COORDINATOR_HOST&gt;:&lt;PORT&gt;/druid/coordinator/v1/datasources/&lt;DATASOURCE&gt;/markUnused" <span class="hljs-tag">\<span class="hljs-name" style="font-weight: 700;"> </span></span> -H 'Content-Type: application/json' <span class="hljs-tag">\<span class="hljs-name" style="font-weight: 700;"> </span></span> -d '{ "segmentIds": [ "blog_visits_2025-04-18T01:00:00.000Z_2025-04-18T02:00:00.000Z_2024-07-01T10:00:00.000Z" ] }' </pre><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">For example, following snippet mark two segments as unused.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><pre class="hljs" style="background: rgb(240, 240, 240); color: #444444; display: block; overflow-x: auto; padding: 0.5em;"><span class="hljs-formula">$curl -X POST "http://localhost:8888/druid/coordinator/v1/datasources/blog_visits/markUnused" <span class="hljs-tag">\<span class="hljs-name" style="font-weight: 700;"> </span></span>&gt; -H 'Content-Type: application/json' <span class="hljs-tag">\<span class="hljs-name" style="font-weight: 700;"> </span></span>&gt; -d '{ &gt; "segmentIds": [ &gt; "blog_visits_2025-04-18T10:00:00.000Z_2025-04-18T11:00:00.000Z_2025-04-18T16:53:25.204Z", &gt; "blog_visits_2025-04-18T09:00:00.000Z_2025-04-18T10:00:00.000Z_2025-04-18T16:53:25.204Z" &gt; ] &gt; }' {"numChangedSegments":2,"segmentStateChanged":true} </span></pre><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">After deletion of 2 segments, you can observe we left with 9 segments.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p><div class="separator" style="clear: both; text-align: center;"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidTOFGYCz5SMFbHPg_YWylnKUqzEzu0lYuxRhjQhfaHRNMezUUOHz1BpHFlSqIt24PIctSAbnHoUZYuwAkeFP5LPPldFjMbq-sO9eNyifwGfhtDWvMBgfjaqFK0DNe94CICegFrSVKtYZA-D6CaVE6RGIrAdqou8ZyDxmUHl5SX58czP7L3cLm2J5ClpQ/s1384/delete%20segements.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="605" data-original-width="1384" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidTOFGYCz5SMFbHPg_YWylnKUqzEzu0lYuxRhjQhfaHRNMezUUOHz1BpHFlSqIt24PIctSAbnHoUZYuwAkeFP5LPPldFjMbq-sO9eNyifwGfhtDWvMBgfjaqFK0DNe94CICegFrSVKtYZA-D6CaVE6RGIrAdqou8ZyDxmUHl5SX58czP7L3cLm2J5ClpQ/w400-h175/delete%20segements.png" width="400" /></a></span></b></div><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span></b><p></p><p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Option 2: Mark Segments as Unused by Time Interval</span></b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Use the markUnused endpoint with a time interval:</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Syntax</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST "http://&lt;COORDINATOR_HOST&gt;:&lt;PORT&gt;/druid/coordinator/v1/datasources/&lt;DATASOURCE&gt;/markUnused" \ -H 'Content-Type: application/json' \ -d '{ "interval": "START_INTERVAL/END_INTERVAL" }' </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> <span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">For example following statement mark the segments between intervals 2025-04-18T05:00:00.000Z and 2025-04-18T07:00:00.000Z as unused.</span> <style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST "http://localhost:8888/druid/coordinator/v1/datasources/blog_visits/markUnused" \ -H 'Content-Type: application/json' \ -d '{ "interval": "2025-04-18T05:00:00.000Z/2025-04-18T07:00:00.000Z" }' </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$curl -X POST "http://localhost:8888/druid/coordinator/v1/datasources/blog_visits/markUnused" \ &gt; -H 'Content-Type: application/json' \ &gt; -d '{ &gt; "interval": "2025-04-18T05:00:00.000Z/2025-04-18T07:00:00.000Z" &gt; }' {"numChangedSegments":2,"segmentStateChanged":true} </pre></div> <p class="MsoNoSpacing"> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">After marking another 2 segments as unused, we left with 7 segments.</span></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p><div class="separator" style="clear: both; text-align: center;"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHghHAZJfXB9EGES1-GgfLepg_CWJh946rCEw5hb694q6JYQSbS_y4pSEwcWd-zeeB5Hw4Nh4DBWAmHoSW53pyqTNvCxwpaOANSMkVrPViVFuu9o3vWJksKIqwGGK69Z7TUwNRkLtlyqKXP_rsnXpiaUMKAcsoe9zMyrIwunV3d7vaw6f6cvkUvmTowmk/s1384/delete%20segment%204.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="550" data-original-width="1384" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHghHAZJfXB9EGES1-GgfLepg_CWJh946rCEw5hb694q6JYQSbS_y4pSEwcWd-zeeB5Hw4Nh4DBWAmHoSW53pyqTNvCxwpaOANSMkVrPViVFuu9o3vWJksKIqwGGK69Z7TUwNRkLtlyqKXP_rsnXpiaUMKAcsoe9zMyrIwunV3d7vaw6f6cvkUvmTowmk/w400-h159/delete%20segment%204.png" width="400" /></a></span></b></div><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span></b><p></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Delete Segments Using a Kill Task</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Now that the segments are marked as unused, they are ignored in queries but still live in deep storage. To permanently delete them, submit a kill task:</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Syntax</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST http://&lt;OVERLORD_HOST&gt;:&lt;PORT&gt;/druid/indexer/v1/task \ -H 'Content-Type: application/json' \ -d ' { "type": "kill", "dataSource": "DATA_SOURCE", "interval": "START_INTERVAL/END_INTERVAL" } ' </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST http://localhost:8888/druid/indexer/v1/task \ -H 'Content-Type: application/json' \ -d ' { "type": "kill", "dataSource": "blog_visits", "interval": "2025-04-18T00:00:00.000Z/2025-04-18T11:00:00.000Z" } ' </pre></div> <br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>$curl -X POST http://localhost:8888/druid/indexer/v1/task \ &gt; -H 'Content-Type: application/json' \ &gt; -d ' &gt; { &gt; "type": "kill", &gt; "dataSource": "blog_visits", &gt; "interval": "2025-04-18T00:00:00.000Z/2025-04-18T11:00:00.000Z" &gt; } &gt; ' {"task":"kill_blog_visits_hacplbld_2025-04-18T00:00:00.000Z_2025-04-18T11:00:00.000Z_2025-04-18T17:27:15.828Z"} </pre></div> <p class="MsoNoSpacing"><br /></p><p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/understanding-segments-in-apache-druid.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/loading-data-from-kafka-into-apache.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-17504949999633368822025-09-09T06:33:00.000-07:002025-09-09T06:47:01.388-07:00Understanding Segments in Apache Druid<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When you ingest data into Apache Druid, it's stored in segments. Segments are optimized, compressed data blocks that enable fast querying and efficient storage. Understanding how segmentation works is essential for designing performant Druid setups.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this blog, we’ll explore what segments are, how Druid creates them based on your data and configurations and walk through an example.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Segments in Apache Druid</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In Apache Druid, a segment is a chunk of data that covers a specific time interval, like an hour or a day.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Segments are the basic unit of storage and query execution.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">They are compressed, column-oriented, and distributed across Druid nodes for parallel querying.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">By controlling segment granularity, you can optimize your ingestion and query performance.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s simulate blog visit logs where each entry represents a visit to a blog post at a specific timestamp. We’ll segment the data hourly, so if your data spans 10 different hours, Druid will create 10 separate segments.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Let’s create blog_visits.csv file.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">blog_visits.csv&nbsp;</span></b></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>timestamp,post_id,user_id 2025-04-18T00:10:00Z,101,u1 2025-04-18T01:05:00Z,101,u2 2025-04-18T02:15:00Z,102,u3 2025-04-18T03:30:00Z,103,u4 2025-04-18T04:25:00Z,104,u5 2025-04-18T05:55:00Z,105,u6 2025-04-18T06:45:00Z,106,u7 2025-04-18T07:20:00Z,107,u8 2025-04-18T08:10:00Z,108,u9 2025-04-18T09:40:00Z,109,u10 2025-04-18T10:01:00Z,110,u11 </pre></div> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span> </p><p class="MsoNormal"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">This dataset spans 11 hours, which will generate 11 segments when using hourly segment granularity.</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Ingestion Spec</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">blog_visits_spec.json </span></b></p> <p class="MsoNoSpacing"><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></b></p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"index"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"spec"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSchema"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dataSource"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"blog_visits"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"timestampSpec"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"column"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"timestamp"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"format"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"iso"</span> <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dimensionsSpec"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"dimensions"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"post_id"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"user_id"</span> <span style="color: #bbbbbb;"> </span>] <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"metricsSpec"</span>:<span style="color: #bbbbbb;"> </span>[], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"granularitySpec"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"uniform"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"segmentGranularity"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"HOUR"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"queryGranularity"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"NONE"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"rollup"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">false</span> <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"ioConfig"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"index"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"inputSource"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"local"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"baseDir"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"/Users/Shared/druid_samples"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"filter"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"blog_visits.csv"</span> <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"inputFormat"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"csv"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"columns"</span>:<span style="color: #bbbbbb;"> </span>[ <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"timestamp"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"post_id"</span>, <span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"user_id"</span> <span style="color: #bbbbbb;"> </span>], <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"findColumnsFromHeader"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">false</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"delimiter"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">","</span> <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>}, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"tuningConfig"</span>:<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"type"</span>:<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"index"</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"maxRowsInMemory"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">10000</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"maxBytesInMemory"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">0</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"maxRowsPerSegment"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">5000000</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"maxTotalRows"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">20000000</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"forceExtendableShardSpecs"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">true</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"logParseExceptions"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">true</span>, <span style="color: #bbbbbb;"> </span><span style="color: #007700;">"resetOffsetAutomatically"</span>:<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">true</span> <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Execute following curl statement to onboard above spec.</span></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>curl -X POST http://localhost:8081/druid/indexer/v1/task \ -H 'Content-Type: application/json' \ -d @blog_visits_spec.json </pre></div> <p> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Upon successful onboarding of blog_visits data, navigate to Druid console -&gt; Segments tab.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Filter by blog_visits datasource, you can see all the segments.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfqzQGNKJF0N1uA_bBR2cbizRZ8kHJXI0fq0keKdgA4WzeqWYoZCjoaxx7H57KWwsqgIfaGJORoD2ka8Yhv07EjT6YeaixWno_DewR02dN4MpfRc92yoRe7bKjWFBbragM_Lc1AM9DHwyb6qBXP0DxwGovE-gpTSeUKyPOUaTCzexFPjrRhi5tk7f2Mhg/s1384/segments.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="690" data-original-width="1384" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfqzQGNKJF0N1uA_bBR2cbizRZ8kHJXI0fq0keKdgA4WzeqWYoZCjoaxx7H57KWwsqgIfaGJORoD2ka8Yhv07EjT6YeaixWno_DewR02dN4MpfRc92yoRe7bKjWFBbragM_Lc1AM9DHwyb6qBXP0DxwGovE-gpTSeUKyPOUaTCzexFPjrRhi5tk7f2Mhg/w400-h200/segments.png" width="400" /></a></div><br />&nbsp;<p></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Best Practices to choose segment granularity</span></b></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Choose segment granularity based on data volume and query patterns.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Use hourly for high-volume, high-frequency data like logs or metrics.</span></p> <p class="MsoNoSpacing" style="margin-left: 36pt; mso-list: l0 level1 lfo1; text-indent: -18pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Use daily or coarser granularity for less frequent data.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span>&nbsp;</p><p><style>@font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:77; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 -2147483647 0;}@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/understanding-roll-up-in-druid.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-delete-segments-in-druid.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/08/apache-druid-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0tag:blogger.com,1999:blog-3062500619105519975.post-32357108942702123592025-09-09T06:24:00.000-07:002025-09-11T06:15:37.852-07:00Filtering Embedding Searches in LangChain4j<p><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">When working with large-scale vector databases like Pinecone, Milvus, or Qdrant, semantic search isn't just about finding similar embeddings, it's about finding the right similar items. Just like SQL how we can filter rows using WHERE clauses, modern vector databases also support metadata based filtering. LangChain4j abstracts over multiple vector stores, and its Filter API enables a consistent way to define these filters.</span></p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">In this post, we’ll explore how to use Filter in LangChain4j to refine your embedding searches using rich metadata, and the types of filters available.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why Filtering Matters in Vector Search?</span></b></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Imagine a movie recommendation system. You don't just want "similar" movies, you want similar comedies, released after 2010, and with a rating above 7. That’s where metadata filtering becomes essential.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">LangChain4j provides an expressive API to define filters that work across multiple embedding store implementations. These filters operate on metadata fields associated with each embedding.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Following table summarizes the list of filters available in LangChain4j.</span></p> <table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: medium; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"> <tbody><tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0;"> <td style="border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Filter Type</span></b></p> </td> <td style="border-left: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Description</span></b></p> </td> </tr> <tr style="mso-yfti-irow: 1;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsEqualTo</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Checks if metadata key equals a given value</span></p> </td> </tr> <tr style="mso-yfti-irow: 2;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsNotEqualTo</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Opposite of IsEqualTo</span></p> </td> </tr> <tr style="mso-yfti-irow: 3;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsGreaterThan</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Numerical comparison</span></p> </td> </tr> <tr style="mso-yfti-irow: 4;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsGreaterThanOrEqualTo</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Numerical comparison</span></p> </td> </tr> <tr style="mso-yfti-irow: 5;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsLessThan</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Numerical comparison</span></p> </td> </tr> <tr style="mso-yfti-irow: 6;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsLessThanOrEqualTo</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Numerical comparison</span></p> </td> </tr> <tr style="mso-yfti-irow: 7;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsIn</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Checks if a value is in a given set/list</span></p> </td> </tr> <tr style="mso-yfti-irow: 8;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">IsNotIn</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Checks if a value is not in a given set/list</span></p> </td> </tr> <tr style="mso-yfti-irow: 9;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContainsString</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Checks if string contains a substring (limited support)</span></p> </td> </tr> <tr style="mso-yfti-irow: 10; mso-yfti-lastrow: yes;"> <td style="border-top: none; border: 1pt solid windowtext; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 160.1pt;" valign="top" width="213"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">And, Or, Not</span></p> </td> <td style="border-bottom: solid windowtext 1.0pt; border-color: currentcolor windowtext windowtext currentcolor; border-left: none; border-right: solid windowtext 1.0pt; border-style: none solid solid none; border-top: none; border-width: medium 1pt 1pt medium; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt; width: 290.7pt;" valign="top" width="388"> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Logical combinators to build complex expressions</span></p> </td> </tr> </tbody></table> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p><p> <b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Aptos; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">Example</span></b>&nbsp;</p><p></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Filter<span style="color: #bbbbbb;"> </span>filter<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>And( <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>And( <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsEqualTo(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"news"</span>), <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsIn(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"technology"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"finance"</span>)) <span style="color: #bbbbbb;"> </span>), <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsGreaterThanOrEqualTo(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span>Integer.<span style="color: #0000cc;">valueOf</span>(<span style="color: #0000dd; font-weight: bold;">9</span>)) <span style="color: #bbbbbb;"> </span>); </pre></div> <p> </p><p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p> <p class="MsoNoSpacing"><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">&nbsp;</span></p> <p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">EmbeddingSearchWithFilters.java</span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #008800; font-weight: bold;">package</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">com.sample.app.embeddings</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.HashMap</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.List</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">java.util.Map</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.document.Metadata</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.embedding.Embedding</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.data.segment.TextSegment</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.EmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.model.embedding.onnx.bgesmallenv15q.BgeSmallEnV15QuantizedEmbeddingModel</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingSearchRequest</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingSearchResult</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.EmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.Filter</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.comparison.IsEqualTo</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.comparison.IsGreaterThanOrEqualTo</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.comparison.IsIn</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.filter.logical.And</span>; <span style="color: #008800; font-weight: bold;">import</span><span style="color: #bbbbbb;"> </span><span style="color: #0e84b5; font-weight: bold;">dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore</span>; <span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">class</span> <span style="color: #bb0066; font-weight: bold;">EmbeddingSearchWithFilters</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">public</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">static</span><span style="color: #bbbbbb;"> </span><span style="color: #333399; font-weight: bold;">void</span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">main</span>(String<span style="color: #333333;">[]</span><span style="color: #bbbbbb;"> </span>args)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 1: Initialize embedding model</span> <span style="color: #bbbbbb;"> </span>EmbeddingModel<span style="color: #bbbbbb;"> </span>model<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>BgeSmallEnV15QuantizedEmbeddingModel(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 2: Prepare text data with metadata</span> <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>sentence1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"The stock market surged as tech companies reported strong earnings."</span>; <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>metaMap1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>metaMap1.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"finance"</span>); <span style="color: #bbbbbb;"> </span>metaMap1.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"news"</span>); <span style="color: #bbbbbb;"> </span>metaMap1.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">9</span>); <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>meta1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(metaMap1); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>sentence2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Tech giants like Apple and Amazon saw record profits this quarter."</span>; <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>metaMap2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>metaMap2.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"technology"</span>); <span style="color: #bbbbbb;"> </span>metaMap2.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"news"</span>); <span style="color: #bbbbbb;"> </span>metaMap2.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">10</span>); <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>meta2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(metaMap2); <span style="color: #bbbbbb;"> </span>String<span style="color: #bbbbbb;"> </span>sentence3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"Heavy rain caused flooding in coastal towns yesterday."</span>; <span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;">&lt;</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>metaMap3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>HashMap<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span>metaMap3.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"weather"</span>); <span style="color: #bbbbbb;"> </span>metaMap3.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"alert"</span>); <span style="color: #bbbbbb;"> </span>metaMap3.<span style="color: #0000cc;">put</span>(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span><span style="color: #0000dd; font-weight: bold;">5</span>); <span style="color: #bbbbbb;"> </span>Metadata<span style="color: #bbbbbb;"> </span>meta3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>Metadata.<span style="color: #0000cc;">from</span>(metaMap3); <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">try</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 3: Generate embeddings</span> <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>embedding1<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(sentence1).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>embedding2<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(sentence2).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>embedding3<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(sentence3).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 4: Initialize in-memory embedding store</span> <span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>embeddingStore<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>InMemoryEmbeddingStore<span style="color: #333333;">&lt;&gt;</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 5: Add embeddings to the store with metadata</span> <span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">add</span>(embedding1,<span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(sentence1,<span style="color: #bbbbbb;"> </span>meta1)); <span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">add</span>(embedding2,<span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(sentence2,<span style="color: #bbbbbb;"> </span>meta2)); <span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">add</span>(embedding3,<span style="color: #bbbbbb;"> </span>TextSegment.<span style="color: #0000cc;">from</span>(sentence3,<span style="color: #bbbbbb;"> </span>meta3)); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"Embeddings with metadata added to the store successfully."</span>); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 6: Prepare a query embedding</span> <span style="color: #bbbbbb;"> </span>Embedding<span style="color: #bbbbbb;"> </span>queryEmbedding<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>model.<span style="color: #0000cc;">embed</span>(<span style="background-color: #fff0f0;">"Which tech companies had profits?"</span>).<span style="color: #0000cc;">content</span>(); <span style="color: #bbbbbb;"> </span>Filter<span style="color: #bbbbbb;"> </span>filter<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>And( <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>And(<span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsEqualTo(<span style="background-color: #fff0f0;">"source"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"news"</span>),<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsIn(<span style="background-color: #fff0f0;">"category"</span>,<span style="color: #bbbbbb;"> </span>List.<span style="color: #0000cc;">of</span>(<span style="background-color: #fff0f0;">"technology"</span>,<span style="color: #bbbbbb;"> </span><span style="background-color: #fff0f0;">"finance"</span>))), <span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">new</span><span style="color: #bbbbbb;"> </span>IsGreaterThanOrEqualTo(<span style="background-color: #fff0f0;">"relevance"</span>,<span style="color: #bbbbbb;"> </span>Integer.<span style="color: #0000cc;">valueOf</span>(<span style="color: #0000dd; font-weight: bold;">9</span>))); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 8: Build search request with filter</span> <span style="color: #bbbbbb;"> </span>EmbeddingSearchRequest<span style="color: #bbbbbb;"> </span>request<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>EmbeddingSearchRequest.<span style="color: #0000cc;">builder</span>().<span style="color: #0000cc;">queryEmbedding</span>(queryEmbedding) <span style="color: #bbbbbb;"> </span>.<span style="color: #0000cc;">maxResults</span>(<span style="color: #0000dd; font-weight: bold;">2</span>).<span style="color: #0000cc;">minScore</span>(<span style="color: #6600ee; font-weight: bold;">0.5</span>).<span style="color: #0000cc;">filter</span>(filter).<span style="color: #0000cc;">build</span>(); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 9: Perform search</span> <span style="color: #bbbbbb;"> </span>EmbeddingSearchResult<span style="color: #333333;">&lt;</span>TextSegment<span style="color: #333333;">&gt;</span><span style="color: #bbbbbb;"> </span>result<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>embeddingStore.<span style="color: #0000cc;">search</span>(request); <span style="color: #bbbbbb;"> </span><span style="color: #888888;">// Step 10: Display results</span> <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"\nFiltered &amp; Ranked Results:"</span>); <span style="color: #bbbbbb;"> </span>result.<span style="color: #0000cc;">matches</span>().<span style="color: #0000cc;">forEach</span>(match<span style="color: #bbbbbb;"> </span><span style="color: #333333;">-&gt;</span><span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>TextSegment<span style="color: #bbbbbb;"> </span>segment<span style="color: #bbbbbb;"> </span><span style="color: #333333;">=</span><span style="color: #bbbbbb;"> </span>match.<span style="color: #0000cc;">embedded</span>(); <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">out</span>.<span style="color: #0000cc;">printf</span>(<span style="background-color: #fff0f0;">"Score: %.3f | Text: %s | Metadata: %s%n"</span>,<span style="color: #bbbbbb;"> </span>match.<span style="color: #0000cc;">score</span>(),<span style="color: #bbbbbb;"> </span>segment.<span style="color: #0000cc;">text</span>(), <span style="color: #bbbbbb;"> </span>segment.<span style="color: #0000cc;">metadata</span>()); <span style="color: #bbbbbb;"> </span>}); <span style="color: #bbbbbb;"> </span>}<span style="color: #bbbbbb;"> </span><span style="color: #008800; font-weight: bold;">catch</span><span style="color: #bbbbbb;"> </span>(Exception<span style="color: #bbbbbb;"> </span>e)<span style="color: #bbbbbb;"> </span>{ <span style="color: #bbbbbb;"> </span>System.<span style="color: #0000cc;">err</span>.<span style="color: #0000cc;">println</span>(<span style="background-color: #fff0f0;">"An error occurred: "</span><span style="color: #bbbbbb;"> </span><span style="color: #333333;">+</span><span style="color: #bbbbbb;"> </span>e.<span style="color: #0000cc;">getMessage</span>()); <span style="color: #bbbbbb;"> </span>e.<span style="color: #0000cc;">printStackTrace</span>(); <span style="color: #bbbbbb;"> </span>} <span style="color: #bbbbbb;"> </span>} } </pre></div> <p> </p><p class="MsoNoSpacing"><b><span face="&quot;Verdana&quot;,sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p> <p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span>Embeddings with metadata added to the store successfully. Filtered &amp; Ranked Results: Score: 0.883 | Text: Tech giants like Apple and Amazon saw record profits this quarter. | Metadata: Metadata { metadata = {category=technology, relevance=10, source=news} } Score: 0.882 | Text: The stock market surged as tech companies reported strong earnings. | Metadata: Metadata { metadata = {category=finance, relevance=9, source=news} } </pre></div> <p>&nbsp;</p><p><style>@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870145 1107305727 0 0 415 0;}@font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1593833729 1073750107 16 0 415 0;}@font-face {font-family:Aptos; panose-1:2 11 0 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 3 0 0 415 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Aptos",sans-serif; mso-ascii-font-family:Aptos; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Aptos; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Aptos; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;}</style></p> <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/embedding-store-in-langchain4j.html">Previous</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/09/understanding-embeddingsearchresult-and.html">Next</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://self-learning-java-tutorial.blogspot.com/2025/06/langchain4j-tutorial.html">Home</a>Krishnahttp://www.blogger.com/profile/13933852587023194622[email protected]0