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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The AgenticScope Interface:</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example in Action</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemInUppercase: makes it all uppercase</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1:</span></b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Define Agents.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poet.java</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2:</span></b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Define AgenticScopeDemo class.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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> </p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/sequential-workflow-in-genai-building.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is a Sequential Workflow?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1:</span></b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Let's define three agents.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poet.java</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2:</span></b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing">
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">PoemInUppercase</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/understanding-agenticscope-in.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is an Agent?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example: A Poet Agent</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNormal"><span face=""Verdana",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 "Times New Roman";"> </span></span></span><span face=""Verdana",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 "Times New Roman";"> </span></span></span><span face=""Verdana",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 "Times New Roman";"> </span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why Provide a Description?</span></b></p>
<p class="MsoNormal"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Naming Your Agent</span></b></p>
<p class="MsoNormal"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";"> </span></span></span><span face=""Verdana",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 "Times New Roman";"> </span></span></span><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p>
<p class="MsoNormal"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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="MsoNormal"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/enhancing-llm-observability-with.html">Previous</a>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/sequential-workflow-in-genai-building.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Tracking errors systematically</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Understanding the Events</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Introduction to ChatModelListener interface</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">onRequest(ChatModelRequestContext requestContext)</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">onResponse(ChatModelResponseContext responseContext)</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">onError(ChatModelErrorContext errorContext)</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;">-></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=""Verdana",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=""Verdana",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=""Verdana",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/12/extracting-structured-java-objects-from.html">Previous</a>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/getting-started-with-agents-in.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Defining Our Java Model</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1:</span></b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2:</span></b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Build the Response Format</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 3:</span></b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 4:</span></b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/12/enhancing-ai-responses-with.html">Previous</a>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/enhancing-llm-observability-with.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is a ContentInjector?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How DefaultContentInjector Works?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Including Metadata for More Transparency</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;"><</span>Content<span style="color: #333333;">></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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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.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;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>Document<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{
<span style="color: #bbbbbb;"> </span>List<span style="color: #333333;"><</span>Document<span style="color: #333333;">></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;"><></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/extracting-structured-java-objects-from.html">Next</a>
<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=""Verdana",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? </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. Interface Overview</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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;"><</span>Content<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">aggregate</span>(Map<span style="color: #333333;"><</span>Query,<span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>Content<span style="color: #333333;">>>></span><span style="color: #bbbbbb;"> </span>queryToContents);
}
</pre></div>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Input: A map from each Query to a collection of
List<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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output: A single, relevance-ranked
List<Content>.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3. ContentAggregator Implementations</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ReRankingContentAggregator</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is Reciprocal Rank Fusion?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;"><</span>Content<span style="color: #333333;">></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;"><</span>Content<span style="color: #333333;">></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;"><</span>Content<span style="color: #333333;">></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;"><</span>Content<span style="color: #333333;">></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 -> Collection<List<Content>></span>
<span style="color: #bbbbbb;"> </span>Map<span style="color: #333333;"><</span>Query,<span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;"><</span>List<span style="color: #333333;"><</span>Content<span style="color: #333333;">>>></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;"><></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;"><</span>Content<span style="color: #333333;">></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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: "Courier New"; mso-ansi-language: EN-US; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7pt "Times New Roman";">
</span></span></span><span face=""Verdana",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: "Courier New"; mso-ansi-language: EN-US; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7pt "Times New Roman";">
</span></span></span><span face=""Verdana",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: "Courier New"; mso-ansi-language: EN-US; mso-fareast-font-family: "Courier New";"><span style="mso-list: Ignore;">o<span style="font: 7pt "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>Document<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{
<span style="color: #bbbbbb;"> </span>List<span style="color: #333333;"><</span>Document<span style="color: #333333;">></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;"><></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/enhancing-ai-responses-with.html">Next</a>
<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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. What is Content Retriever?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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;"><</span>Content<span style="color: #333333;">></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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;"><</span>String<span style="color: #333333;">></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;"><</span>Document<span style="color: #333333;">></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;"><></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;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>Content<span style="color: #333333;">></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing">
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing">
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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 /> </b><p></p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">ContentRetrieverFullApp.java</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>Document<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{
<span style="color: #bbbbbb;"> </span>List<span style="color: #333333;"><</span>Document<span style="color: #333333;">></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;"><></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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/12/content-aggregation-in-langchain4j-from.html">Next</a>
<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: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",sans-serif; mso-ansi-language: EN-US;">Simpler but less customizable.</span></p>
<p class="MsoNoSpacing"><span lang="EN-US" style="font-family: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span lang="EN-US" style="font-family: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span lang="EN-US" style="font-family: "Verdana",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: "Verdana",sans-serif; mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/10/querying-apache-druid-via-http-apis.html">Next</a>
<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=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">1. The
Need for Scalable Databases</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.1 The
Rise of Data Volume and Concurrent Users</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Without
a scalable database, users would see "Site Down" errors or slow
checkout experiences.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.2 Why
Traditional Relational Databases Hit Limits</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Let’s
understand their key bottlenecks:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.2.1
Single-Server Dependency</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.2.2
Locking and Transactions</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.2.3
Vertical Scaling Saturation</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.2.4
Schema Rigidity</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.3
Horizontal vs Vertical Scaling</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">The two
fundamental approaches to scaling databases are vertical scaling (scale up) and
horizontal.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Cons:
Hardware limits, single point of failure and expensive</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Add
more machines (nodes) and distribute data & 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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Cons:
Complex coordination, consistency management</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">For
example, suppose your MySQL server on one machine is overloaded.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.4
Characteristics of Modern Distributed Systems</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.4.1
Fault Tolerance</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.4.2
Elasticity</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.4.3
Availability</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">1.4.4
Eventual Consistency</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2. The
Router–Shard–Replica Model</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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;"> </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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2.1 Overview
of How Client Requests Are Routed</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">It
forwards the query to the correct shard and merges the results if needed.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2.2 The
Concept of a Router (or Coordinator) Node</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2.3 What
a Shard Is: Horizontal Partitioning Explained</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Shard
4 stores IDs from 75–100 million</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2.3.1
Adding Shards for Capacity and Redundancy</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Automatically
balance load so no single shard becomes a hotspot.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2.3.2
Shard Backups and Replication Strategies</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Read
scalability: Secondary replicas can handle read-heavy workloads.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2.3.3
Benefits: Scalability and Resilience</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">The
router–shard–replica model brings two major benefits:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Horizontal
scaling is near-linear when designed properly.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">The
system can self-heal via automatic failover and rebalancing.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">2.3.4
Challenge: Cross-Shard Joins and Data Aggregation</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">When data
relevant to a query lives across multiple shards:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">The
router merges the results before sending them back to the client.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Use
analytical systems like Spark or BigQuery for heavy aggregation workloads.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif">3. MongoDB:
A Case Study in Sharded NoSQL Design</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Let’s
explore MongoDB’s architecture piece by piece.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Introduction
to MongoDB’s Distributed Architecture</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">A typical
sharded MongoDB cluster has three major components:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">mongos:
the query router</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Shard
servers: the actual data-bearing nodes</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Config
servers: the metadata managers</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">3.1
mongos: The Query Router</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">It
aggregates the results and sends them back to the client.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Sends
the query to that shard and returns the results.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">3.2
Replica Sets: How MongoDB Ensures High Availability</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Multiple
secondary nodes: Replicate the data from the primary asynchronously.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">3.3
Primary vs Secondary Nodes</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Let’s look
at how reads and writes behave across these nodes.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Writes:
Always go to the primary node (to maintain a consistent order of operations).</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">If
application has a shard located in Singapore with:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Secondaries:
Mumbai and London</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Data
replication happens asynchronously, ensuring eventual consistency.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">3.4
Automatic Election Mechanism</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">The
node with the most recent operations (highest replication log) is elected.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">3.5
Config Servers: Metadata and Routing Information</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Balancer
state for redistributing chunks</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">3.6
Shard Key Selection and Its Impact on Performance</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Matches
your most common query patterns</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Bad shard
key selection is the #1 cause of performance issues in sharded MongoDB
deployments.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">4.
Cassandra: A Ring-Based Approach to Distribution</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Let’s
explore how it achieves that through its peer-to-peer ring architecture.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">The
Peer-to-Peer Ring Architecture</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Let’s say
we have four nodes with these token ranges:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Node A: 0
– 25</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Node B: 26
– 50</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Node C: 51
– 75</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Node D: 76
– 100</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">If a user
with user_id = 43 writes data, it hashes to 43 </span><span face=""Arial",sans-serif">→</span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">4.1 How
Cassandra Eliminates Single Points of Failure?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Cassandra’s
masterless design is the cornerstone of its fault tolerance.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Metadata
(cluster topology, ring ownership) is gossiped among nodes, so all stay
synchronized.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">When
Node B comes back, it syncs missed updates from peers.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">This
design gives Cassandra continuous availability, even during network partitions
or regional outages.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">4.2
Replication Strategies Across Nodes</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">For a
keyspace user_data:</span></p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">2
replicas in EU-West</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">so even if
one data center fails, another can continue serving.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">4.3 How
Cassandra Handles Writes and Achieves Eventual Consistency</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">The
coordinator forwards the write to all replica nodes.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Later,
data is flushed to disk as an SSTable (sorted string table).</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">4.4
Consistency Levels and Eventual Consistency</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">ALL:
Wait for all replicas (strongest consistency, slower)</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">Example</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">If
replication factor = 3:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">This
tunable model lets developers choose between speed and consistency per
operation.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Anti-entropy
repair: Periodically syncs SSTables between replicas.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">5.
Real-World Challenges in Scalable Databases</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">5.1
Resharding: Redistributing Data Safely When Scaling Out</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Suppose
you have 4 shards handling user data distributed by user_id:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Shard
1 </span><span face=""Arial",sans-serif">→</span><span face=""Verdana",sans-serif"> Users 1–25M<span style="mso-spacerun: yes;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Shard
2 </span><span face=""Arial",sans-serif">→</span><span face=""Verdana",sans-serif"> Users 25M–50M<span style="mso-spacerun: yes;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Shard
3 </span><span face=""Arial",sans-serif">→</span><span face=""Verdana",sans-serif"> Users 50M–75M<span style="mso-spacerun: yes;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Shard
4 </span><span face=""Arial",sans-serif">→</span><span face=""Verdana",sans-serif"> Users 75M–100M</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Range-based
sharding can lead to hotspots if data isn’t evenly distributed.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Spanner
/ Vitess use online resharding techniques with dual writes and data copy.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">5.2 Hotspots:
The "Celebrity Problem" and Uneven Data Distribution</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">For
example, In a social media app</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">"@elonmusk"
or "@cristiano" might get millions of hits per second.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">All
requests for that username land on the same shard.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">The
rest of the cluster sits underutilized.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Adaptive
Load Balancing: Detect and redistribute "hot" keys dynamically.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif">Hotspots
are not about lack of capacity, they’re about imbalanced demand on specific
partitions.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">5.3
Smart Routing Algorithms and Adaptive Sharding Strategies</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Adaptive
Routing: Systems like CockroachDB monitor query latency and dynamically adjust
routing paths.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">5.4
Balancing Traffic Across Shards Dynamically</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">That
shard becomes overloaded while others stay idle.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif">Traffic-aware
Proxying: Route new sessions to less-loaded shards.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif">References</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif"> </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/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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">sales_data.csv</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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 /> </b><p></p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example SQL Query</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Get total sales per product</span></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p><p class="MsoNoSpacing"><b><span face=""Verdana",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 /> </b><p></p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Execute Using curl</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p><p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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> </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>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example Native Query</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Save to native_query.json.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Execute Using curl</span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/10/apache-pinot-vs-druid-which-real-time.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Smart query routing enables:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">4. QueryRouter Interface in Langchain4j</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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=""Verdana",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;">QueryRouter</span><span style="color: #bbbbbb;"> </span>{
<span style="color: #bbbbbb;"> </span>Collection<span style="color: #333333;"><</span>ContentRetriever<span style="color: #333333;">></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">4.1 DefaultQueryRouter: </span></b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">4.2 LanguageModelQueryRouter</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">How It Works?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample Application</span></b></p>
<p class="MsoNormal"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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.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;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>ContentRetriever<span style="color: #333333;">></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;">"-> 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=""Verdana",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=""Verdana",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?
-> Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'}
---------------------------------------------------
Query: Where can I see my payslip for last month?
-> Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'}
-> Routed to: EmbeddingStoreContentRetriever{displayName='financeRetriever'}
---------------------------------------------------
Query: What is the company policy on medical leave?
-> Routed to: EmbeddingStoreContentRetriever{displayName='financeRetriever'}
---------------------------------------------------
Query: How to claim business travel reimbursement?
-> Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'}
-> Routed to: EmbeddingStoreContentRetriever{displayName='financeRetriever'}
---------------------------------------------------
Query: I'm facing issues connecting to the VPN.
-> Routed to: EmbeddingStoreContentRetriever{displayName='itRetriever'}
---------------------------------------------------
</pre></div>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNormal"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below complete working application.</span></p>
<p class="MsoNormal"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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.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;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></span>();
<span style="color: #bbbbbb;"> </span>EmbeddingStore<span style="color: #333333;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>String<span style="color: #333333;">></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;"><</span>ContentRetriever,<span style="color: #bbbbbb;"> </span>String<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><</span>Document<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span><span style="color: #0066bb; font-weight: bold;">convertToDocuments</span>(List<span style="color: #333333;"><</span>String<span style="color: #333333;">></span><span style="color: #bbbbbb;"> </span>texts)<span style="color: #bbbbbb;"> </span>{
<span style="color: #bbbbbb;"> </span>List<span style="color: #333333;"><</span>Document<span style="color: #333333;">></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;"><></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNormal"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/enhancing-rag-retrievals-in-langchain4j.html">Previous</a>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/10/content-retrievers-in-langchain4j.html">Next</a>
<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: "Verdana",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: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">1. Horizontal
Scaling</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">In the
context of Databases,</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Vertical
Scaling:</span></b><span style="font-family: "Verdana",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;"> </span>minimal changes might be needed to
the application code or DBMS configuration.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Horizontal
Scaling:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">1.1
Technical Challenges of Horizontal Scaling</span></b></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Data
Partitioning (Sharding):</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Distributed
Transactions:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Data
Consistency:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Replication
Lag:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Joins
are Expensive:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">2.
Distributed Transactions</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">2.1 ACID
Transactions in a Single Node vs Distributed Environment</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">BEGIN;</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"><span style="mso-spacerun: yes;"> </span>UPDATE accounts SET balance = balance - 500
WHERE id = 1;</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"><span style="mso-spacerun: yes;"> </span>UPDATE accounts SET balance = balance + 500
WHERE id = 2;</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">COMMIT;</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Whereas in
a distributed environment:</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">2.2 Why
it is difficult to implement Distributed Transactions?</span></b></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;"> </span></b></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Network
Latency and Failures:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Two-Phase
Commit (2PC):</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Concurrency
and Locking:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Consistency
Models:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Partition
tolerance. </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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>
<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: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">1.
Atomicity</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">1.1 Why
is Atomicity important?</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Consider a
simple fund transfer between two bank accounts A and B:</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Debit
</span><span style="font-family: "Arial",sans-serif;">₹</span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Credit
</span><span style="font-family: "Arial",sans-serif;">₹</span><span style="font-family: "Verdana",sans-serif;">5,000 to Account B.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">1.2 How
is Atomicity Achieved in Database Systems?</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">database
systems use three core mechanisms to achieve Atomicity.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Commit</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Let’s say
a customer initiates a transaction to transfer </span><span style="font-family: "Arial",sans-serif;">₹</span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Debit
</span><span style="font-family: "Arial",sans-serif;">₹</span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Credit
</span><span style="font-family: "Arial",sans-serif;">₹</span><span style="font-family: "Verdana",sans-serif;">5,000 to Account B</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Step 1:
Transaction Begins</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Step 2:</span></b><span style="font-family: "Verdana",sans-serif;"> Validate the Operations</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">The
database performs preliminary validations to avoid logging unnecessary or
invalid transactions.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">If
the transaction respects all integrity constraints.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Step 3:</span></b><span style="font-family: "Verdana",sans-serif;"> Write-Ahead Logging (Transaction Log)</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Current
status (PENDING)</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Step 4:</span></b><span style="font-family: "Verdana",sans-serif;"> Execute the Operations</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Step 5:</span></b><span style="font-family: "Verdana",sans-serif;"> Commit</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">If all
operations succeed:</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">2.
Consistent</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">2.1
What Does Consistency Really Mean?</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Validation
rules ensuring data formats, ranges, or mandatory fields are correct.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">A
consistent database means every transaction preserves all these rules.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Example:
Deleting a Customer and Their Orders</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Suppose
you have two tables:</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">The
system must prevent the deletion if orders exist (restrict delete).</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">2.2 Why
Is This Important?</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Orders
would have foreign keys pointing to a missing customer.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Applications
reading these orders could crash or behave unpredictably.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">2.3 How
Is Consistency Enforced?</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Database
systems use several mechanisms to ensure consistency:</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">3.
Isolation</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">3.1 Why
is Isolation Important?</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">This
can cause errors, like incorrect balances, lost updates, or corrupted data.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">3.2 How
is Isolation achieved?</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">3.2.1 Locking</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Exclusive
locks for writing (only one can write at a time).</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">3.2.2 Transaction
Scheduling</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">3.2.3 Isolation
levels</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Serializable</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Read
Uncommitted</span></b></p>
<p class="MsoNormal"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Read
Committed</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",sans-serif;">Phantom
reads (new rows may appear in subsequent reads)</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Repeatable
Read</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">It allows
Phantom reads, like if a transaction runs a query like SELECT * FROM orders
WHERE amount > 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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Serializable
(Highest Isolation)</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">It is used
when absolute accuracy is required, like in banking systems.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">4.
Durability</span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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 "Times New Roman";">
</span></span></span><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></b></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;">Following
core mechanisms helps to ensure Durability.</span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Write-Ahead
Logging (WAL):</span></b><span style="font-family: "Verdana",sans-serif;"><span style="mso-spacerun: yes;"> </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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><b><span style="font-family: "Verdana",sans-serif;">Checkpointing:</span></b><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </span></p>
<p class="MsoNoSpacing"><span style="font-family: "Verdana",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: "Verdana",sans-serif;"> </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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. Introduction to RAG</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2. RAG Stages</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.1 Indexing Stage</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.2 Retrieval Stage</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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 /> <p></p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing">
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Irrelevant Chunk Content</span></b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Poorly Formulated User Queries:</span></b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Lack of Structured Query Support:</span></b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.1 Query Rewriting</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">or just "2008 financial crisis"</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">So, what do we do?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">The "Rewrite-Retrieve-Read" Framework</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample prompt template for this</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">References: </span><a href="https://arxiv.org/pdf/2305.14283"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://arxiv.org/pdf/2305.14283</span></a><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.2 Step Back Prompting</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step Back -> 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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Then Reason </span><span face=""Arial",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">-></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> Apply to
Solve</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1: Step Back</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Examples 1:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Answer: Ideal Gas Law (PV = nRT)</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 2:</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2: </span></b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Then Reason</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample prompt template for this</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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>{normal_context}
{step_back_context}
Original Question: {question}
Answer:
</pre></div>
<p class="MsoNoSpacing">
</p><p class="MsoNoSpacing"><span face=""Verdana",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&__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&__hssc=260096658.2.1749469580827&__hsfp=601531394&_gl=1*1gvdm1g*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzMwMDMkajYwJGwwJGgw"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://smith.langchain.com/hub/langchain-ai/stepback-answer?ref=blog.langchain.dev&__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&__hssc=260096658.2.1749469580827&__hsfp=601531394&_gl=1*1gvdm1g*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzMwMDMkajYwJGwwJGgw</span></a><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">References: </span><a href="https://arxiv.org/pdf/2310.06117"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://arxiv.org/pdf/2310.06117</span></a><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">2.3 Follow Up Questions</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Problem Without Query Transformation</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Solution Using Query Transformation</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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>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=""Verdana",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&__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&__hssc=260096658.2.1749469580827&__hsfp=601531394&_gl=1*oyvanp*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzQ2NzYkajYwJGwwJGgw"><span face=""Verdana",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&__hstc=260096658.3a644e0328e94fa87e82130761cb66b8.1749469580827.1749469580827.1749469580827.1&__hssc=260096658.2.1749469580827&__hsfp=601531394&_gl=1*oyvanp*_gcl_au*MTU1MjgzNDUzMi4xNzQ5NDY5NTcx*_ga*MTU5ODE1NTc5MC4xNzQ5NDY5NTcz*_ga_47WX3HKKY2*czE3NDk0Njk1NzMkbzEkZzEkdDE3NDk0NzQ2NzYkajYwJGwwJGgw</span></a><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why is this useful?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Without Multi-Query Retrieval</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">With Multi-Query Retrieval</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3. QueryTransformer interface in Langchain4j</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><div class="separator" style="clear: both; text-align: center;"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"><br /></span><p></p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.1.1 DefaultQueryTransformer:</span></b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.2.2. CompressingQueryTransformer</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Prompt used by this transformer</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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;"> * <p></span>
<span style="color: #888888;"> * This example sets up:</span>
<span style="color: #888888;"> * <ul></span>
<span style="color: #888888;"> * <li>A basic Ollama LLM chat model using llama3.2</li></span>
<span style="color: #888888;"> * <li>A short chat history (ChatMemory)</li></span>
<span style="color: #888888;"> * <li>A verbose user query with historical context</li></span>
<span style="color: #888888;"> * <li>A query transformation step to compress the query</li></span>
<span style="color: #888888;"> * </ul></span>
<span style="color: #888888;"> *</span>
<span style="color: #888888;"> * <p></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;"><</span>Query<span style="color: #333333;">></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;">-></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3.2.3 ExpandingQueryTransformer</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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>"""
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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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.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;"><</span>Query<span style="color: #333333;">></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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing"><span face=""Verdana",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>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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;"><</span>String<span style="color: #333333;">></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;"><</span>Document<span style="color: #333333;">></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;"><></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;"><</span>TextSegment<span style="color: #333333;">></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;"><></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://blog.langchain.dev/query-transformations/</span></a><span face=""Verdana",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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/10/smart-query-routing-in-langchain4j-from.html">Next</a>
<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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sample Data: sales_data</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. Scan Query in Druid</span></b></p>
<p class="MsoNormal"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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;">"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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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 /> <p></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">dataSource<span style="mso-spacerun: yes;"> </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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">resultFormat<span style="mso-spacerun: yes;"> </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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Output json looks like below.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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> </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>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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;"> </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> </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> <p></p><p><b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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> </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>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 3:</span></b><span face=""Verdana",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>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 4: </span></b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example 1: Total Sales by Product</span></b><span face=""Verdana",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>
</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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><div class="separator" style="clear: both; text-align: center;"><span face=""Verdana",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=""Verdana",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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/10/querying-apache-druid-via-http-apis.html">Next</a>
<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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is ORC file format?</span></b></p>
<p class="MsoNormal"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">{DRUID_HOME}/conf/druid/single-server/</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the following line:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">3. Restart your Druid instance</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">bin/start-micro-quickstart</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Preparing orc file</span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">sales_data.csv</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://dataconverter.io/convert/csv-to-orc</span></a><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Loading orc file</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">http://localhost:8888</span></a><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Load data -> Batch-SQL multi-stage-query</span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Select Input type as ‘Local disk’.</span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on SQL tab.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on ‘Start loading data’ button.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">SELECT * FROM "sales_data_orc"</span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">,
Happy learning…</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/exploring-apache-druid-native-queries.html">Next</a>
<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=""Verdana",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! </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Load data -> Batch – SQL
(multi-stage-query) button.</span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNormal"><a href="https://raw.githubusercontent.com/MainakRepositor/Datasets/refs/heads/master/Weather%20Data/pressure.csv"><span face=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Connect data button.</span></p>
<p class="MsoNormal"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p>
<span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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> </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 /> <p></p><p>
</p><p class="MsoNormal"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Next button.</span></p>
<p class="MsoNormal"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p>
<span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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> </p><p> </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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on ‘Start loading data’ button.</span></p><p class="MsoNormal"><span face=""Verdana",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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">SELECT * FROM "pressure"</span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">That’s it, you are done….</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-load-data-from-orc-file-into.html">Next</a>
<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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why to customize the Retriever?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Using custom embedding models</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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.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=""Verdana",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=""Verdana",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;"><</span>Document<span style="color: #333333;">></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;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>String<span style="color: #333333;">></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;"><></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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/enhancing-rag-retrievals-in-langchain4j.html">Next</a>
<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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Stores them in an EmbeddingStore</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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;">-></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;">-></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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;">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;"><</span>Document<span style="color: #333333;">></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;"><></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;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;">-></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;">-></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;"><</span>String<span style="color: #333333;">></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;"><></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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/customizing-content-retrieval-in-rag.html">Next</a>
<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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Example</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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;"><</span>TextSegment<span style="color: #333333;">></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">What is EmbeddingMatch?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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;"><</span>Embedded<span style="color: #333333;">></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=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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;"><</span>TextSegment<span style="color: #333333;">></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;"><</span>TextSegment<span style="color: #333333;">></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working Application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><></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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><></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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><></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;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>TextSegment<span style="color: #333333;">></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 & 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;">-></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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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 & 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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/document-ingestion-with-langchain4j.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><br /></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">1. Setup Kafka</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 1: </span></b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">https://kafka.apache.org/downloads</span></a><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 2: </span></b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 3: </span></b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 4: </span></b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Each message includes:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Step 7: Consume the Messages from the Topic</span></b></p>
<span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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-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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Login to Druid console (</span><a href="http://localhost:8888/"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">http://localhost:8888/</span></a><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><div class="separator" style="clear: both; text-align: center;"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Load data -> Streaming</span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Click on Parse time button.</span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p>
<span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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> </p><p> </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=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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><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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing">
</p><p class="MsoNoSpacing"><span face=""Verdana",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 /> <p></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing"><span face=""Verdana",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/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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p class="MsoNoSpacing"><span face=""Verdana",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;}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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-ingest-data-from-https-endpoint.html">Next</a>
<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=""Verdana",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. </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Why to Delete a Segment?</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Sometimes, you might want to:</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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/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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Syntax</span></b></p><p class="MsoNoSpacing"><b><span face=""Verdana",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://<COORDINATOR_HOST>:<PORT>/druid/coordinator/v1/datasources/<DATASOURCE>/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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>> -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-18T10:00:00.000Z_2025-04-18T11:00:00.000Z_2025-04-18T16:53:25.204Z",
> "blog_visits_2025-04-18T09:00:00.000Z_2025-04-18T10:00:00.000Z_2025-04-18T16:53:25.204Z"
> ]
> }'
{"numChangedSegments":2,"segmentStateChanged":true}
</span></pre><p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b>
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p><div class="separator" style="clear: both; text-align: center;"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Option 2: Mark Segments as Unused by Time Interval</span></b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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://<COORDINATOR_HOST>:<PORT>/druid/coordinator/v1/datasources/<DATASOURCE>/markUnused" \
-H 'Content-Type: application/json' \
-d '{
"interval": "START_INTERVAL/END_INTERVAL"
}'
</pre></div>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
<span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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=""Verdana",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/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=""Verdana",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/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"
> }'
{"numChangedSegments":2,"segmentStateChanged":true}
</pre></div>
<p class="MsoNoSpacing">
</p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p><div class="separator" style="clear: both; text-align: center;"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Syntax</span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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://<OVERLORD_HOST>:<PORT>/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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span>
</p><p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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 \
> -H 'Content-Type: application/json' \
> -d '
> {
> "type": "kill",
> "dataSource": "blog_visits",
> "interval": "2025-04-18T00:00:00.000Z/2025-04-18T11:00:00.000Z"
> }
> '
{"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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/loading-data-from-kafka-into-apache.html">Next</a>
<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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Segments in Apache Druid</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">blog_visits.csv </span></b></p><p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"></span>
</p><p class="MsoNormal"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></b></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Ingestion Spec</span></b></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Upon successful onboarding of blog_visits data,
navigate to Druid console -> Segments tab.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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 /> <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=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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 "Times New Roman";">
</span></span></span><span face=""Verdana",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=""Verdana",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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/understanding-roll-up-in-druid.html">Previous</a>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/how-to-delete-segments-in-druid.html">Next</a>
<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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><span face=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p><p>
<b><span face=""Verdana",sans-serif" lang="EN-US" style="font-size: 12pt; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman"; 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> </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=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;">Find the below working application.</span></p>
<p class="MsoNoSpacing"><span face=""Verdana",sans-serif" lang="EN-US" style="mso-ansi-language: EN-US;"> </span></p>
<p class="MsoNoSpacing"><b><span face=""Verdana",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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><></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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><></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;"><</span>String,<span style="color: #bbbbbb;"> </span>Object<span style="color: #333333;">></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;"><></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;"><</span>TextSegment<span style="color: #333333;">></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;"><></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;"><</span>TextSegment<span style="color: #333333;">></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 & 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;">-></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=""Verdana",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 & 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> </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>
<a href="https://self-learning-java-tutorial.blogspot.com/2025/09/understanding-embeddingsearchresult-and.html">Next</a>
<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