{"id":2111,"date":"2026-07-09T15:38:00","date_gmt":"2026-07-09T15:38:00","guid":{"rendered":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/"},"modified":"2026-07-10T00:59:18","modified_gmt":"2026-07-10T00:59:18","slug":"llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls","status":"publish","type":"post","link":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/","title":{"rendered":"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls"},"content":{"rendered":"<p><br \/>\n<\/p>\n<div id=\"\">\n<p>On this article, you&#8217;ll learn the way LangChain, LlamaIndex, and uncooked API calls every clear up a special layer of the LLM software stack, and the way to decide on amongst them primarily based on what your challenge truly requires.<\/p>\n<p>Subjects we&#8217;ll cowl embrace:<\/p>\n<p>What every possibility is designed to do, said plainly with out advertising and marketing spin.<br \/>\nHow the three approaches examine on efficiency, token overhead, debugging readability, and code quantity.<br \/>\nA sensible determination framework for selecting the correct degree of abstraction earlier than you construct \u2014 and earlier than that alternative turns into costly to undo.<\/p>\n<p>Let\u2019s not waste any extra time.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared.png\" alt=\"LLM Orchestration Frameworks Compared: LangChain vs. LlamaIndex vs. Raw API Calls\" width=\"800\" height=\"706\"\/><\/p>\n<h2>Introduction<\/h2>\n<p>You&#8217;ve gotten a working immediate. The mannequin is giving good solutions. Then the subsequent requirement lands. Perhaps it&#8217;s reminiscence; the mannequin wants to recollect what was mentioned three messages in the past. Perhaps it&#8217;s retrieval \u2014 the mannequin must reply questions on paperwork it was not skilled on. Perhaps it&#8217;s device use; the mannequin must examine a database, run a calculation, or name an exterior API earlier than it could reply. Instantly, a single shopper.chat.completions.create() name is just not sufficient, and you might be standing on the first actual architectural determination in your LLM challenge.<\/p>\n<p>Three paths exist from that second: attain for LangChain, attain for LlamaIndex, or construct a skinny layer on high of the uncooked SDK your self. Getting this alternative improper doesn&#8217;t break the prototype. It breaks the manufacturing system six months later, if you end up debugging stack traces 40 frames deep, paying 2.7x what you have to be on token prices, or spending a dash migrating away from breaking API adjustments.<\/p>\n<p>LLM API spend doubled from $3.5 billion to $8.4 billion between late 2024 and mid-2025. These are actual manufacturing budgets. The framework layer \u2014 the code that sits between your software and the mannequin \u2014 immediately determines how a lot of that spend is doing helpful work versus paying for abstraction you didn&#8217;t want.<\/p>\n<p>This text offers you an sincere comparability: what every possibility truly is, the place it genuinely wins, the place it prices you, and a call framework you need to use tomorrow.<\/p>\n<h2>The Panorama in Plain English<\/h2>\n<p>Earlier than evaluating trade-offs, it helps to grasp what every possibility truly is \u2014 not what its advertising and marketing says, however what downside it was constructed to unravel.<\/p>\n<p>LangChain began in October 2022 as a general-purpose framework for chaining LLM operations collectively. Its core concept was that constructing actual purposes required composing a number of steps \u2014 immediate templates, mannequin calls, output parsers, reminiscence, instruments \u2014 and there needs to be a normal manner to try this. It has grown into the most important LLM framework by adoption: 119K GitHub stars, 500+ integrations, and a sprawling ecosystem. The LangChain crew now builds LangGraph, a separate package deal for stateful, graph-based agent workflows, because the advisable technique to construct manufacturing brokers inside the ecosystem.<br \/>\nLlamaIndex (launched as GPT Index in November 2022) was constructed to unravel a special downside: getting LLMs to cause over your individual information. Its design is organized round information ingestion, chunking, embedding, indexing, and retrieval. The place LangChain is about orchestrating what occurs between steps, LlamaIndex is about making the retrieval step itself as correct and environment friendly as doable. It sits at 44K GitHub stars with 300+ information connectors by LlamaHub, protecting sources like Notion, Google Drive, Slack, PDFs, and databases.<br \/>\nUncooked API calls means utilizing the OpenAI Python SDK, the Anthropic SDK, or any mannequin supplier\u2019s shopper immediately \u2014 no orchestration layer, no abstractions past what the supplier ships. You write the immediate, name the mannequin, and deal with the response your self. This isn&#8217;t the primitive fallback it&#8217;s typically offered as; it&#8217;s the strategy manufacturing groups are more and more migrating again to for workloads the place the framework\u2019s complexity stopped paying for itself.<\/p>\n<p>The important factor to grasp earlier than studying any comparability is that these three choices are usually not competing on the identical dimension. LangChain is an orchestration toolkit. LlamaIndex is a retrieval toolkit. Uncooked API calls are a stance on how a lot abstraction you want. Many manufacturing programs use two of them collectively. The query is all the time: given what I&#8217;m truly constructing, which layer of abstraction earns its value?<\/p>\n<h2>LangChain: The Orchestration Layer<\/h2>\n<p>LangChain\u2019s energy is assembling complexity. In case your software entails a number of steps, a number of instruments, conditional routing, reminiscence throughout turns, or brokers that cause earlier than appearing, LangChain gives the constructing blocks for all of it, with connectors to 500+ companies and a group giant sufficient that somebody has already solved a lot of the edge instances you&#8217;ll encounter.<\/p>\n<p>LangGraph, constructed by the identical crew and secure at v1.0 since October 2025, is the place the intense agent work lives now. It fashions agent workflows as directed graphs, the place nodes are Python features, edges are state transitions, and a central typed state object flows by all the execution. It has built-in persistence through checkpointers to SQLite, PostgreSQL, or Redis, which implies brokers can pause mid-workflow, persist their state, and resume hours later. That&#8217;s genuinely onerous to construct your self and is one among LangChain\u2019s clearest justifications in a manufacturing context.<\/p>\n<p>The sincere trade-offs are value naming immediately. LangChain provides ~10ms framework overhead per step, and LangGraph provides ~14ms. For many human-facing purposes that make LLM calls taking 1\u20133 seconds every, that is irrelevant. For prime-throughput pipelines processing hundreds of requests per minute, it compounds. Stack traces from LangChain manufacturing errors routinely span 15 to 40 frames of inside framework code; discovering the precise supply of a bug is slower than in a system you wrote your self. And for easy use instances, one documented comparability discovered LangChain incurring 2.7x increased prices than a local implementation for a primary RAG pipeline \u2014 the abstraction overhead consumed tokens that didn&#8217;t have to be consumed.<\/p>\n<p>LangChain v1.0 (October 2025) dedicated to API stability after a turbulent v0.1 by v0.3 interval that compelled a number of breaking migrations. That historical past is value understanding. For brand spanking new tasks, the soundness concern is basically resolved. For groups working v0.x code in manufacturing, the migration value to v1.0 is actual.<\/p>\n<p>Here&#8217;s a working LangChain LCEL chain \u2014 the trendy technique to compose LangChain operations.<\/p>\n<p>Stipulations:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cc74623107087\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\npip set up langchain langchain-openai python-dotenv<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">pip <\/span><span class=\"crayon-e\">set up <\/span><span class=\"crayon-e\">langchain <\/span><span class=\"crayon-v\">langchain<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-v\">python<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">dotenv<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Find out how to run: Save as langchain_chain.py, add OPENAI_API_KEY to your .env, run python langchain_chain.py<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cc81265507583\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# langchain_chain.py&#13;<br \/>\n# A LangChain LCEL chain: immediate template \u2192 mannequin \u2192 output parser&#13;<br \/>\n# Stipulations: pip set up langchain langchain-openai python-dotenv&#13;<br \/>\n# Find out how to run: python langchain_chain.py&#13;<br \/>\n&#13;<br \/>\nimport os&#13;<br \/>\nfrom dotenv import load_dotenv&#13;<br \/>\nfrom langchain_core.prompts import ChatPromptTemplate&#13;<br \/>\nfrom langchain_core.output_parsers import StrOutputParser&#13;<br \/>\nfrom langchain_openai import ChatOpenAI&#13;<br \/>\n&#13;<br \/>\nload_dotenv()&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 MODEL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# ChatOpenAI wraps OpenAI&#8217;s chat fashions. Swap the mannequin string to change&#13;<br \/>\n# to gpt-4o-mini (cheaper) or claude-3-5-sonnet (through langchain-anthropic) &#8211;&#13;<br \/>\n# the chain code under stays equivalent both manner. This mannequin portability&#13;<br \/>\n# is one among LangChain&#8217;s real benefits over uncooked API calls.&#13;<br \/>\nllm = ChatOpenAI(&#13;<br \/>\n    mannequin=&#8221;gpt-4o&#8221;,&#13;<br \/>\n    temperature=0.2,&#13;<br \/>\n    api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;)&#13;<br \/>\n)&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 PROMPT TEMPLATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# ChatPromptTemplate defines the message construction with named variables.&#13;<br \/>\n# {subject} will get stuffed in at runtime &#8212; templates are reusable and versionable.&#13;<br \/>\nimmediate = ChatPromptTemplate.from_messages([&#13;<br \/>\n    (&#8220;system&#8221;, &#8220;You are a concise technical explainer. Keep answers under 100 words.&#8221;),&#13;<br \/>\n    (&#8220;human&#8221;, &#8220;Explain {topic} in simple terms.&#8221;)&#13;<br \/>\n])&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 OUTPUT PARSER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# StrOutputParser extracts the textual content content material from the mannequin&#8217;s AIMessage response.&#13;<br \/>\n# With out it you get again an AIMessage object somewhat than a plain string.&#13;<br \/>\nparser = StrOutputParser()&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 CHAIN (LCEL) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# The pipe operator (|) builds a sequential chain: immediate \u2192 llm \u2192 parser.&#13;<br \/>\n# LCEL (LangChain Expression Language) makes the composition readable and&#13;<br \/>\n# helps streaming, batching, and async execution with the identical interface.&#13;<br \/>\nchain = immediate | llm | parser&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    # invoke() runs the complete chain synchronously&#13;<br \/>\n    outcome = chain.invoke({&#8220;subject&#8221;: &#8220;vector embeddings&#8221;})&#13;<br \/>\n    print(outcome)&#13;<br \/>\n&#13;<br \/>\n    # stream() yields tokens as they arrive &#8212; no code adjustments wanted for streaming&#13;<br \/>\n    print(&#8220;n&#8212; Streaming response &#8212;&#8220;)&#13;<br \/>\n    for chunk in chain.stream({&#8220;subject&#8221;: &#8220;RAG pipelines&#8221;}):&#13;<br \/>\n        print(chunk, finish=&#8221;&#8221;, flush=True)&#13;<br \/>\n    print()<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># langchain_chain.py<\/span><\/p>\n<p><span class=\"crayon-p\"># A LangChain LCEL chain: immediate template \u2192 mannequin \u2192 output parser<\/span><\/p>\n<p><span class=\"crayon-p\"># Stipulations: pip set up langchain langchain-openai python-dotenv<\/span><\/p>\n<p><span class=\"crayon-p\"># Find out how to run: python langchain_chain.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">os<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dotenv <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">load_dotenv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langchain_core<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">prompts <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">ChatPromptTemplate<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langchain_core<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">output_parsers <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">StrOutputParser<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">langchain_openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">ChatOpenAI<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">load_dotenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 MODEL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># ChatOpenAI wraps OpenAI&#8217;s chat fashions. Swap the mannequin string to change<\/span><\/p>\n<p><span class=\"crayon-p\"># to gpt-4o-mini (cheaper) or claude-3-5-sonnet (through langchain-anthropic) &#8212;<\/span><\/p>\n<p><span class=\"crayon-p\"># the chain code under stays equivalent both manner. This mannequin portability<\/span><\/p>\n<p><span class=\"crayon-p\"># is one among LangChain&#8217;s real benefits over uncooked API calls.<\/span><\/p>\n<p><span class=\"crayon-v\">llm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ChatOpenAI<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;gpt-4o&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">temperature<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0.2<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 PROMPT TEMPLATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># ChatPromptTemplate defines the message construction with named variables.<\/span><\/p>\n<p><span class=\"crayon-p\"># {subject} will get stuffed in at runtime &#8212; templates are reusable and versionable.<\/span><\/p>\n<p><span class=\"crayon-v\">immediate<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ChatPromptTemplate<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">from_messages<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;system&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;You are a concise technical explainer. Keep answers under 100 words.&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;human&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Explain {topic} in simple terms.&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 OUTPUT PARSER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># StrOutputParser extracts the textual content content material from the mannequin&#8217;s AIMessage response.<\/span><\/p>\n<p><span class=\"crayon-p\"># With out it you get again an AIMessage object somewhat than a plain string.<\/span><\/p>\n<p><span class=\"crayon-v\">parser<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">StrOutputParser<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 CHAIN (LCEL) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># The pipe operator (|) builds a sequential chain: immediate \u2192 llm \u2192 parser.<\/span><\/p>\n<p><span class=\"crayon-p\"># LCEL (LangChain Expression Language) makes the composition readable and<\/span><\/p>\n<p><span class=\"crayon-p\"># helps streaming, batching, and async execution with the identical interface.<\/span><\/p>\n<p><span class=\"crayon-v\">chain<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">immediate<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">llm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">parser<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># invoke() runs the complete chain synchronously<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">chain<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">invoke<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;subject&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;vector embeddings&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># stream() yields tokens as they arrive &#8212; no code adjustments wanted for streaming<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;n&#8212; Streaming response &#8212;&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">chunk <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">chain<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">stream<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;subject&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;RAG pipelines&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">chunk<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">finish<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">flush<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>What this does: Three objects \u2014 immediate, llm, parser \u2014 are related with the | operator. LangChain\u2019s LCEL executes them so as: the template fills in {subject}, passes a formatted message to the mannequin, and the parser extracts a plain string from the response. The identical chain helps .invoke(), .stream(), .batch(), and .ainvoke() with none adjustments to the chain definition itself. That interface consistency is the clearest argument for LangChain on tasks that want a number of execution patterns.<\/p>\n<p>Right here is identical basis prolonged to a tool-using agent with LangGraph.<\/p>\n<p>Stipulations:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cc86432346450\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\npip set up langchain langchain-openai langgraph langchain-community python-dotenv<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">pip <\/span><span class=\"crayon-e\">set up <\/span><span class=\"crayon-e\">langchain <\/span><span class=\"crayon-v\">langchain<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">langgraph <\/span><span class=\"crayon-v\">langchain<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">group <\/span><span class=\"crayon-v\">python<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">dotenv<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Find out how to run: Save as langchain_agent.py and run python langchain_agent.py<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cc8e400751762\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# langchain_agent.py&#13;<br \/>\n# A LangGraph ReAct agent with two instruments: net search and a calculator&#13;<br \/>\n# Stipulations: pip set up langchain langchain-openai langgraph langchain-community python-dotenv&#13;<br \/>\n# Find out how to run: python langchain_agent.py&#13;<br \/>\n&#13;<br \/>\nimport os&#13;<br \/>\nfrom dotenv import load_dotenv&#13;<br \/>\nfrom langchain_openai import ChatOpenAI&#13;<br \/>\nfrom langchain.instruments import device&#13;<br \/>\nfrom langchain_community.instruments import DuckDuckGoSearchRun&#13;<br \/>\nfrom langchain_core.messages import HumanMessage&#13;<br \/>\nfrom langgraph.prebuilt import create_react_agent&#13;<br \/>\n&#13;<br \/>\nload_dotenv()&#13;<br \/>\n&#13;<br \/>\nllm = ChatOpenAI(mannequin=&#8221;gpt-4o&#8221;, temperature=0, api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;))&#13;<br \/>\n&#13;<br \/>\n# Internet search &#8212; no API key required&#13;<br \/>\nsearch = DuckDuckGoSearchRun()&#13;<br \/>\n&#13;<br \/>\n@device&#13;<br \/>\ndef calculate(expression: str) -&gt; str:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    Consider a secure mathematical expression. Use for arithmetic or share calculations.&#13;<br \/>\n    Enter: a Python math expression string (e.g., &#8216;1500 * 0.08&#8217;).&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    attempt:&#13;<br \/>\n        outcome = eval(expression, {&#8220;__builtins__&#8221;: {}}, {})&#13;<br \/>\n        return f&#8221;Consequence: {outcome}&#8221;&#13;<br \/>\n    besides Exception as e:&#13;<br \/>\n        return f&#8221;Error: {str(e)}&#8221;&#13;<br \/>\n&#13;<br \/>\ninstruments = [search, calculate]&#13;<br \/>\n&#13;<br \/>\n# create_react_agent wires collectively the LLM, instruments, and a built-in ReAct loop.&#13;<br \/>\n# The agent thinks, calls a device, reads the outcome, and continues till completed.&#13;<br \/>\nagent = create_react_agent(llm, instruments)&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    outcome = agent.invoke({&#13;<br \/>\n        &#8220;messages&#8221;: [HumanMessage(content=&#8221;What is 15% of 2400?&#8221;)]&#13;<br \/>\n    })&#13;<br \/>\n    print(outcome[&#8220;messages&#8221;][-1].content material)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># langchain_agent.py<\/span><\/p>\n<p><span class=\"crayon-p\"># A LangGraph ReAct agent with two instruments: net search and a calculator<\/span><\/p>\n<p><span class=\"crayon-p\"># Stipulations: pip set up langchain langchain-openai langgraph langchain-community python-dotenv<\/span><\/p>\n<p><span class=\"crayon-p\"># Find out how to run: python langchain_agent.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">os<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dotenv <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">load_dotenv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">langchain_openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">ChatOpenAI<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langchain<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">instruments <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">device<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langchain_community<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">instruments <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">DuckDuckGoSearchRun<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langchain_core<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">messages <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">HumanMessage<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langgraph<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">prebuilt <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">create_react_agent<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">load_dotenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">llm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ChatOpenAI<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;gpt-4o&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">temperature<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Internet search &#8212; no API key required<\/span><\/p>\n<p><span class=\"crayon-v\">search<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">DuckDuckGoSearchRun<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">device<\/span><\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">calculate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">expression<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Consider a secure mathematical expression. Use for arithmetic or share calculations.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Enter: a Python math expression string (e.g., &#8216;1500 * 0.08&#8217;).<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">attempt<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">eval<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">expression<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;__builtins__&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Consequence: {outcome}&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">besides <\/span><span class=\"crayon-e\">Exception <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Error: {str(e)}&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">instruments<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">search<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">calculate<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># create_react_agent wires collectively the LLM, instruments, and a built-in ReAct loop.<\/span><\/p>\n<p><span class=\"crayon-p\"># The agent thinks, calls a device, reads the outcome, and continues till completed.<\/span><\/p>\n<p><span class=\"crayon-v\">agent<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">create_react_agent<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">llm<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">instruments<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">agent<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">invoke<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;messages&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-e\">HumanMessage<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">content<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;What is 15% of 2400?&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;messages&#8221;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>What this does: create_react_agent abstracts the complete reasoning loop. The mannequin decides whether or not to make use of a device, LangGraph executes the chosen device, feeds the outcome again into the message historical past, and repeats till the mannequin has a last reply. What would take 50+ traces in a uncooked implementation is 4 traces right here. That abstraction is suitable while you want it. The query the subsequent part addresses is: when do you not?<\/p>\n<h2>LlamaIndex: The Retrieval Layer<\/h2>\n<p>LlamaIndex was designed from the bottom up for one job: serving to LLMs cause over exterior information. That focus is each its largest energy and the clearest sign for when to make use of it. In case your software\u2019s central problem is \u201chow do I get the mannequin to reply precisely from my paperwork,\u201d LlamaIndex is the precise start line.<\/p>\n<p>The efficiency numbers replicate that specialization. LlamaIndex indexes paperwork 2.5x quicker than LangChain and hits sub-200ms question latency for 10,000 paperwork. Its framework overhead of ~6ms compares favorably to LangChain\u2019s ~10ms and LangGraph\u2019s ~14ms. On the token degree, LlamaIndex makes use of ~1.6K tokens per question versus LangChain\u2019s ~2.4K \u2014 a 33% distinction that provides up rapidly at scale.<\/p>\n<p>The architectural cause for these variations is that LlamaIndex treats retrieval as a first-class primitive, not a composable element. Its 5 core abstractions \u2014 information connectors, node parsers, indices, question engines, and workflows \u2014 are designed to work collectively out of the field. Hierarchical chunking preserves parent-child relationships between doc sections. Auto-merging retrieval recombines associated chunks at question time. Sub-question decomposition breaks complicated queries into less complicated ones and merges the outcomes. You get all of this with much less code: LangChain requires 30\u201340% extra code than LlamaIndex for equal RAG pipelines.<\/p>\n<p>The place LlamaIndex is weaker is on the agent aspect. Its Workflows system handles async, event-driven pipelines nicely, however stateful multi-turn brokers with built-in persistence require extra guide implementation than LangGraph. LangGraph\u2019s checkpointing \u2014 the place an agent pauses, persists its full state, and resumes later \u2014 is one thing LlamaIndex Workflows can obtain however doesn&#8217;t present out of the field. For doc Q&amp;A and data retrieval, this hardly ever issues. For long-running agentic workflows with human-in-the-loop necessities, it issues an amazing deal.<\/p>\n<p>Here&#8217;s a full LlamaIndex RAG pipeline, from doc ingestion to question.<\/p>\n<p>Stipulations:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cc92314491445\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\npip set up llama-index llama-index-llms-openai llama-index-embeddings-openai python-dotenv<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">pip <\/span><span class=\"crayon-e\">set up <\/span><span class=\"crayon-v\">llama<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">index <\/span><span class=\"crayon-v\">llama<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">llms<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-v\">llama<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">embeddings<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-v\">python<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">dotenv<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Find out how to run: Save as llamaindex_rag.py and run python llamaindex_rag.py<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cc9a469625398\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# llamaindex_rag.py&#13;<br \/>\n# Full LlamaIndex RAG pipeline: ingest paperwork \u2192 index \u2192 question&#13;<br \/>\n# Stipulations: pip set up llama-index llama-index-llms-openai&#13;<br \/>\n#                llama-index-embeddings-openai python-dotenv&#13;<br \/>\n# Find out how to run: python llamaindex_rag.py&#13;<br \/>\n&#13;<br \/>\nimport os&#13;<br \/>\nfrom dotenv import load_dotenv&#13;<br \/>\nfrom llama_index.core import VectorStoreIndex, Doc, Settings&#13;<br \/>\nfrom llama_index.llms.openai import OpenAI as LlamaOpenAI&#13;<br \/>\nfrom llama_index.embeddings.openai import OpenAIEmbedding&#13;<br \/>\n&#13;<br \/>\nload_dotenv()&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 GLOBAL SETTINGS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# LlamaIndex v0.10+ makes use of a worldwide Settings object as an alternative of ServiceContext.&#13;<br \/>\n# Configure your LLM and embedding mannequin as soon as right here &#8212; all pipeline parts&#13;<br \/>\n# decide them up robotically. Swap fashions right here to vary the entire pipeline.&#13;<br \/>\nSettings.llm = LlamaOpenAI(&#13;<br \/>\n    mannequin=&#8221;gpt-4o&#8221;,&#13;<br \/>\n    temperature=0,&#13;<br \/>\n    api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;)&#13;<br \/>\n)&#13;<br \/>\nSettings.embed_model = OpenAIEmbedding(&#13;<br \/>\n    mannequin=&#8221;text-embedding-3-small&#8221;,  # Quick and cost-effective for many RAG duties&#13;<br \/>\n    api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;)&#13;<br \/>\n)&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 DOCUMENTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# In manufacturing, substitute with: SimpleDirectoryReader(&#8220;.\/docs&#8221;).load_data()&#13;<br \/>\n# LlamaHub gives 300+ connectors for Notion, Google Drive, PDFs, databases.&#13;<br \/>\n# Paperwork created inline right here to maintain the instance absolutely self-contained.&#13;<br \/>\npaperwork = [&#13;<br \/>\n    Document(&#13;<br \/>\n        text=(&#13;<br \/>\n            &#8220;LlamaIndex is a data framework for LLM applications. &#8220;&#13;<br \/>\n            &#8220;It specializes in document ingestion, chunking, embedding, and retrieval. &#8220;&#13;<br \/>\n            &#8220;Core abstractions: data connectors, node parsers, indices, query engines, &#8220;&#13;<br \/>\n            &#8220;and workflows. LlamaHub provides 300+ pre-built data connectors.&#8221;&#13;<br \/>\n        ),&#13;<br \/>\n        metadata={&#8220;source&#8221;: &#8220;llamaindex_overview&#8221;}&#13;<br \/>\n    ),&#13;<br \/>\n    Document(&#13;<br \/>\n        text=(&#13;<br \/>\n            &#8220;LangChain is a general-purpose LLM orchestration framework. &#8220;&#13;<br \/>\n            &#8220;It excels at chaining operations, multi-step agents, tool use, and memory. &#8220;&#13;<br \/>\n            &#8220;LangGraph &#8212; the recommended way to build stateful agents in the LangChain &#8220;&#13;<br \/>\n            &#8220;ecosystem &#8212; stabilized at v1.0 in October 2025.&#8221;&#13;<br \/>\n        ),&#13;<br \/>\n        metadata={&#8220;source&#8221;: &#8220;langchain_overview&#8221;}&#13;<br \/>\n    ),&#13;<br \/>\n    Document(&#13;<br \/>\n        text=(&#13;<br \/>\n            &#8220;Raw API calls use the OpenAI or Anthropic SDK directly with no framework. &#8220;&#13;<br \/>\n            &#8220;This approach has the lowest latency and highest transparency. &#8220;&#13;<br \/>\n            &#8220;Best for simple, one-off tasks where framework abstraction adds no value. &#8220;&#13;<br \/>\n            &#8220;As complexity grows, a thin internal wrapper is usually preferable to &#8220;&#13;<br \/>\n            &#8220;adopting a full orchestration framework.&#8221;&#13;<br \/>\n        ),&#13;<br \/>\n        metadata={&#8220;source&#8221;: &#8220;raw_api_overview&#8221;}&#13;<br \/>\n    ),&#13;<br \/>\n]&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 INDEX \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# from_documents() handles the complete pipeline: chunk \u2192 embed \u2192 retailer.&#13;<br \/>\n# By default, vectors are saved in reminiscence. For manufacturing, cross a vector retailer:&#13;<br \/>\n# index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)&#13;<br \/>\n# the place storage_context factors to Pinecone, Weaviate, Chroma, and so forth.&#13;<br \/>\nindex = VectorStoreIndex.from_documents(paperwork)&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 QUERY ENGINE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# as_query_engine() creates a retrieval + era pipeline in a single name.&#13;<br \/>\n# similarity_top_k=2 retrieves the two most related chunks per question.&#13;<br \/>\n# response_mode=&#8221;compact&#8221; merges retrieved chunks earlier than passing to the LLM &#8211;&#13;<br \/>\n# reduces token utilization in comparison with &#8220;default&#8221; mode, which sends every chunk individually.&#13;<br \/>\nquery_engine = index.as_query_engine(&#13;<br \/>\n    similarity_top_k=2,&#13;<br \/>\n    response_mode=&#8221;compact&#8221;&#13;<br \/>\n)&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    questions = [&#13;<br \/>\n        &#8220;What is LlamaIndex best suited for?&#8221;,&#13;<br \/>\n        &#8220;How does LangChain differ from LlamaIndex?&#8221;,&#13;<br \/>\n        &#8220;When should I use raw API calls instead of a framework?&#8221;,&#13;<br \/>\n    ]&#13;<br \/>\n&#13;<br \/>\n    for q in questions:&#13;<br \/>\n        print(f&#8221;Q: {q}&#8221;)&#13;<br \/>\n        response = query_engine.question(q)&#13;<br \/>\n        print(f&#8221;A: {response}n&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<p>72<\/p>\n<p>73<\/p>\n<p>74<\/p>\n<p>75<\/p>\n<p>76<\/p>\n<p>77<\/p>\n<p>78<\/p>\n<p>79<\/p>\n<p>80<\/p>\n<p>81<\/p>\n<p>82<\/p>\n<p>83<\/p>\n<p>84<\/p>\n<p>85<\/p>\n<p>86<\/p>\n<p>87<\/p>\n<p>88<\/p>\n<p>89<\/p>\n<p>90<\/p>\n<p>91<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># llamaindex_rag.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Full LlamaIndex RAG pipeline: ingest paperwork \u2192 index \u2192 question<\/span><\/p>\n<p><span class=\"crayon-p\"># Stipulations: pip set up llama-index llama-index-llms-openai<\/span><\/p>\n<p><span class=\"crayon-p\">#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0llama-index-embeddings-openai python-dotenv<\/span><\/p>\n<p><span class=\"crayon-p\"># Find out how to run: python llamaindex_rag.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">os<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dotenv <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">load_dotenv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">llama_index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">core <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">VectorStoreIndex<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Doc<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Settings<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">llama_index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">llms<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">OpenAI <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">LlamaOpenAI<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">llama_index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">embeddings<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">OpenAIEmbedding<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">load_dotenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 GLOBAL SETTINGS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># LlamaIndex v0.10+ makes use of a worldwide Settings object as an alternative of ServiceContext.<\/span><\/p>\n<p><span class=\"crayon-p\"># Configure your LLM and embedding mannequin as soon as right here &#8212; all pipeline parts<\/span><\/p>\n<p><span class=\"crayon-p\"># decide them up robotically. Swap fashions right here to vary the entire pipeline.<\/span><\/p>\n<p><span class=\"crayon-v\">Settings<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">llm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">LlamaOpenAI<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;gpt-4o&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">temperature<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">Settings<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">embed_model<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">OpenAIEmbedding<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;text-embedding-3-small&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-p\"># Quick and cost-effective for many RAG duties<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 DOCUMENTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># In manufacturing, substitute with: SimpleDirectoryReader(&#8220;.\/docs&#8221;).load_data()<\/span><\/p>\n<p><span class=\"crayon-p\"># LlamaHub gives 300+ connectors for Notion, Google Drive, PDFs, databases.<\/span><\/p>\n<p><span class=\"crayon-p\"># Paperwork created inline right here to maintain the instance absolutely self-contained.<\/span><\/p>\n<p><span class=\"crayon-v\">paperwork<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">Document<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">text<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;LlamaIndex is a data framework for LLM applications. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;It specializes in document ingestion, chunking, embedding, and retrieval. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;Core abstractions: data connectors, node parsers, indices, query engines, &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;and workflows. LlamaHub provides 300+ pre-built data connectors.&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">metadata<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;source&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;llamaindex_overview&#8221;<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">Document<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">text<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;LangChain is a general-purpose LLM orchestration framework. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;It excels at chaining operations, multi-step agents, tool use, and memory. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;LangGraph &#8212; the recommended way to build stateful agents in the LangChain &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;ecosystem &#8212; stabilized at v1.0 in October 2025.&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">metadata<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;source&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;langchain_overview&#8221;<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">Document<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">text<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;Raw API calls use the OpenAI or Anthropic SDK directly with no framework. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;This approach has the lowest latency and highest transparency. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;Best for simple, one-off tasks where framework abstraction adds no value. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;As complexity grows, a thin internal wrapper is usually preferable to &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;adopting a full orchestration framework.&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">metadata<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;source&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;raw_api_overview&#8221;<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 INDEX \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># from_documents() handles the complete pipeline: chunk \u2192 embed \u2192 retailer.<\/span><\/p>\n<p><span class=\"crayon-p\"># By default, vectors are saved in reminiscence. For manufacturing, cross a vector retailer:<\/span><\/p>\n<p><span class=\"crayon-p\"># index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)<\/span><\/p>\n<p><span class=\"crayon-p\"># the place storage_context factors to Pinecone, Weaviate, Chroma, and so forth.<\/span><\/p>\n<p><span class=\"crayon-v\">index<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">VectorStoreIndex<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">from_documents<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">paperwork<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 QUERY ENGINE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># as_query_engine() creates a retrieval + era pipeline in a single name.<\/span><\/p>\n<p><span class=\"crayon-p\"># similarity_top_k=2 retrieves the two most related chunks per question.<\/span><\/p>\n<p><span class=\"crayon-p\"># response_mode=&#8221;compact&#8221; merges retrieved chunks earlier than passing to the LLM &#8212;<\/span><\/p>\n<p><span class=\"crayon-p\"># reduces token utilization in comparison with &#8220;default&#8221; mode, which sends every chunk individually.<\/span><\/p>\n<p><span class=\"crayon-v\">query_engine<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">as_query_engine<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">similarity_top_k<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">response_mode<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;compact&#8221;<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">questions<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;What is LlamaIndex best suited for?&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;How does LangChain differ from LlamaIndex?&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;When should I use raw API calls instead of a framework?&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">q<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">questions<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Q: {q}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">response<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">query_engine<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">question<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">q<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;A: {response}n&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>What this does: Settings.llm and Settings.embed_model configure all the pipeline as soon as. VectorStoreIndex.from_documents() handles chunking, embedding, and indexing in a single name \u2014 a course of that takes 30\u201340% extra code in LangChain. as_query_engine() then creates a retrieval + era pipeline with two traces. The similarity_top_k and response_mode parameters provide you with management over the retrieval conduct with out requiring you to assemble the retrieval parts your self. That&#8217;s the LlamaIndex worth proposition in concrete kind: much less meeting, extra retrieval high quality.<\/p>\n<div style=\"width: 810px\" class=\"wp-caption aligncenter\"><img decoding=\"async\" src=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-A-two-column-architecture-diagram-comparing-LlamaIndex-and-LangChain-RAG-pipelines-side-by-side.png\" alt=\"A two-column architecture diagram comparing LlamaIndex and LangChain RAG pipelines side by side\" width=\"800\" height=\"706\"\/><\/p>\n<p class=\"wp-caption-text\">A two-column structure diagram evaluating LlamaIndex and LangChain RAG pipelines aspect by aspect (click on to enlarge)<\/p>\n<\/div>\n<h2>Uncooked API Calls: The Minimal Path<\/h2>\n<p>The default assumption in most LLM developer communities is that you simply begin with uncooked API calls and graduate to a framework as your challenge grows. The sample value analyzing in 2026 is the reverse: groups that began with LangChain and are quietly rewriting to uncooked SDKs.<\/p>\n<p>The OpenAI Brokers SDK, launched in March 2025 with 26,900 GitHub stars and 10.3 million month-to-month downloads, gives device use, multi-agent handoffs, built-in tracing, and guardrails in a minimal package deal. Its overhead per device name is 2\u20135ms versus LangChain\u2019s 10\u201330ms. Groups migrating from LangChain to uncooked SDKs usually see a 40\u201360% discount in code quantity and a 70\u201390% discount in month-to-month framework upkeep burden.<\/p>\n<p>The argument for the uncooked path is just not that frameworks are unhealthy. It&#8217;s that the worth of an abstraction layer relies upon fully on whether or not it&#8217;s hiding complexity you truly face. In 2022, constructing immediate chains and dealing with device calls reliably required framework help as a result of vendor APIs have been inconsistent. By 2026, OpenAI and Anthropic have absorbed device calling, streaming, operate schemas, and multi-turn reminiscence into their native SDKs. The framework\u2019s abstractions now not conceal significant variations. They conceal readability.<\/p>\n<p>Uncooked API is constantly the quickest possibility, with no framework overhead and no additional LLM requires orchestration. Frameworks add 100\u2013500ms of Python overhead per agent step. For latency-sensitive workloads \u2014 real-time buyer help, voice brokers, and high-throughput pipelines \u2014 that overhead is actual and value avoiding.<\/p>\n<p>Here&#8217;s a full tool-using agent constructed on the uncooked OpenAI SDK in beneath 80 traces.<\/p>\n<p>Stipulations:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cc9e126579095\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\npip set up openai python-dotenv<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">pip <\/span><span class=\"crayon-e\">set up <\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-v\">python<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">dotenv<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Find out how to run: Save as raw_api_agent.py and run python raw_api_agent.py<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31cca8700214078\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# raw_api_agent.py&#13;<br \/>\n# A whole tool-using agent on the uncooked OpenAI SDK &#8212; no framework.&#13;<br \/>\n# That is ~75 traces together with feedback. Evaluate it to the LangChain equal.&#13;<br \/>\n# Stipulations: pip set up openai python-dotenv&#13;<br \/>\n# Find out how to run: python raw_api_agent.py&#13;<br \/>\n&#13;<br \/>\nimport os&#13;<br \/>\nimport json&#13;<br \/>\nfrom dotenv import load_dotenv&#13;<br \/>\nfrom openai import OpenAI&#13;<br \/>\n&#13;<br \/>\nload_dotenv()&#13;<br \/>\nshopper = OpenAI(api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;))&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 TOOL DEFINITIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# The mannequin reads these descriptions to determine when and find out how to name every device.&#13;<br \/>\n# Clear, particular descriptions are extra essential right here than in any framework &#8211;&#13;<br \/>\n# there isn&#8217;t any wrapper to fill in gaps.&#13;<br \/>\nTOOLS = [&#13;<br \/>\n    {&#13;<br \/>\n        &#8220;type&#8221;: &#8220;function&#8221;,&#13;<br \/>\n        &#8220;function&#8221;: {&#13;<br \/>\n            &#8220;name&#8221;: &#8220;calculate&#8221;,&#13;<br \/>\n            &#8220;description&#8221;: (&#13;<br \/>\n                &#8220;Evaluate a mathematical expression. Use for arithmetic, &#8220;&#13;<br \/>\n                &#8220;percentages, or numerical computation. &#8220;&#13;<br \/>\n                &#8220;Input: a Python math expression as a string.&#8221;&#13;<br \/>\n            ),&#13;<br \/>\n            &#8220;parameters&#8221;: {&#13;<br \/>\n                &#8220;type&#8221;: &#8220;object&#8221;,&#13;<br \/>\n                &#8220;properties&#8221;: {&#13;<br \/>\n                    &#8220;expression&#8221;: {&#13;<br \/>\n                        &#8220;type&#8221;: &#8220;string&#8221;,&#13;<br \/>\n                        &#8220;description&#8221;: &#8220;A Python math expression, e.g. &#8216;1500 * 0.08&#8242;&#8221;&#13;<br \/>\n                    }&#13;<br \/>\n                },&#13;<br \/>\n                &#8220;required&#8221;: [&#8220;expression&#8221;]&#13;<br \/>\n            }&#13;<br \/>\n        }&#13;<br \/>\n    },&#13;<br \/>\n    {&#13;<br \/>\n        &#8220;sort&#8221;: &#8220;operate&#8221;,&#13;<br \/>\n        &#8220;operate&#8221;: {&#13;<br \/>\n            &#8220;title&#8221;: &#8220;get_word_count&#8221;,&#13;<br \/>\n            &#8220;description&#8221;: &#8220;Depend the variety of phrases in a given string of textual content.&#8221;,&#13;<br \/>\n            &#8220;parameters&#8221;: {&#13;<br \/>\n                &#8220;sort&#8221;: &#8220;object&#8221;,&#13;<br \/>\n                &#8220;properties&#8221;: {&#13;<br \/>\n                    &#8220;textual content&#8221;: {&#8220;sort&#8221;: &#8220;string&#8221;, &#8220;description&#8221;: &#8220;The textual content to rely.&#8221;}&#13;<br \/>\n                },&#13;<br \/>\n                &#8220;required&#8221;: [&#8220;text&#8221;]&#13;<br \/>\n            }&#13;<br \/>\n        }&#13;<br \/>\n    }&#13;<br \/>\n]&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 TOOL IMPLEMENTATIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\ndef calculate(expression: str) -&gt; str:&#13;<br \/>\n    attempt:&#13;<br \/>\n        outcome = eval(expression, {&#8220;__builtins__&#8221;: {}}, {})&#13;<br \/>\n        return str(outcome)&#13;<br \/>\n    besides Exception as e:&#13;<br \/>\n        return f&#8221;Error: {e}&#8221;&#13;<br \/>\n&#13;<br \/>\ndef get_word_count(textual content: str) -&gt; str:&#13;<br \/>\n    return str(len(textual content.cut up()))&#13;<br \/>\n&#13;<br \/>\n# Maps device title \u2192 Python operate for dynamic dispatch within the loop under&#13;<br \/>\nTOOL_DISPATCH = {&#8220;calculate&#8221;: calculate, &#8220;get_word_count&#8221;: get_word_count}&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500 AGENT LOOP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\ndef run_agent(user_message: str) -&gt; str:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    A whole ReAct-style agent loop utilizing uncooked OpenAI device calls.&#13;<br \/>\n    The mannequin decides whether or not to name a device or return a last reply.&#13;<br \/>\n    The loop continues till the mannequin stops requesting device calls.&#13;<br \/>\n    Each step is seen &#8212; no framework wrapping, no hidden logic.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    messages = [&#13;<br \/>\n        {&#8220;role&#8221;: &#8220;system&#8221;, &#8220;content&#8221;: &#8220;You are a helpful assistant.&#8221;},&#13;<br \/>\n        {&#8220;role&#8221;: &#8220;user&#8221;,   &#8220;content&#8221;: user_message},&#13;<br \/>\n    ]&#13;<br \/>\n&#13;<br \/>\n    whereas True:&#13;<br \/>\n        response = shopper.chat.completions.create(&#13;<br \/>\n            mannequin=&#8221;gpt-4o&#8221;,&#13;<br \/>\n            messages=messages,&#13;<br \/>\n            instruments=TOOLS,&#13;<br \/>\n            tool_choice=&#8221;auto&#8221;,  # Mannequin decides: name a device or reply immediately&#13;<br \/>\n            temperature=0,&#13;<br \/>\n        )&#13;<br \/>\n&#13;<br \/>\n        message = response.decisions[0].message&#13;<br \/>\n        messages.append(message)  # All the time add the assistant message to historical past&#13;<br \/>\n&#13;<br \/>\n        # No device calls = the mannequin has its last reply&#13;<br \/>\n        if not message.tool_calls:&#13;<br \/>\n            return message.content material&#13;<br \/>\n&#13;<br \/>\n        # Execute every device name the mannequin requested&#13;<br \/>\n        for tool_call in message.tool_calls:&#13;<br \/>\n            title = tool_call.operate.title&#13;<br \/>\n            args = json.hundreds(tool_call.operate.arguments)&#13;<br \/>\n            fn   = TOOL_DISPATCH.get(title)&#13;<br \/>\n            outcome = fn(**args) if fn else f&#8221;Unknown device: {title}&#8221;&#13;<br \/>\n&#13;<br \/>\n            # Instrument outcome goes again into the message historical past.&#13;<br \/>\n            # The mannequin reads this on the subsequent iteration to determine what to do subsequent.&#13;<br \/>\n            messages.append({&#13;<br \/>\n                &#8220;position&#8221;:        &#8220;device&#8221;,&#13;<br \/>\n                &#8220;tool_call_id&#8221;: tool_call.id,&#13;<br \/>\n                &#8220;content material&#8221;:     outcome,&#13;<br \/>\n            })&#13;<br \/>\n        # Loop &#8212; the mannequin now processes the device outcomes&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    queries = [&#13;<br \/>\n        &#8220;What is 18% of 3500?&#8221;,&#13;<br \/>\n        &#8220;How many words are in: The quick brown fox jumps over the lazy dog?&#8221;,&#13;<br \/>\n        &#8220;Split 240 items into groups of 16. How many groups?&#8221;,&#13;<br \/>\n    ]&#13;<br \/>\n    for q in queries:&#13;<br \/>\n        print(f&#8221;Q: {q}nA: {run_agent(q)}n&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<p>72<\/p>\n<p>73<\/p>\n<p>74<\/p>\n<p>75<\/p>\n<p>76<\/p>\n<p>77<\/p>\n<p>78<\/p>\n<p>79<\/p>\n<p>80<\/p>\n<p>81<\/p>\n<p>82<\/p>\n<p>83<\/p>\n<p>84<\/p>\n<p>85<\/p>\n<p>86<\/p>\n<p>87<\/p>\n<p>88<\/p>\n<p>89<\/p>\n<p>90<\/p>\n<p>91<\/p>\n<p>92<\/p>\n<p>93<\/p>\n<p>94<\/p>\n<p>95<\/p>\n<p>96<\/p>\n<p>97<\/p>\n<p>98<\/p>\n<p>99<\/p>\n<p>100<\/p>\n<p>101<\/p>\n<p>102<\/p>\n<p>103<\/p>\n<p>104<\/p>\n<p>105<\/p>\n<p>106<\/p>\n<p>107<\/p>\n<p>108<\/p>\n<p>109<\/p>\n<p>110<\/p>\n<p>111<\/p>\n<p>112<\/p>\n<p>113<\/p>\n<p>114<\/p>\n<p>115<\/p>\n<p>116<\/p>\n<p>117<\/p>\n<p>118<\/p>\n<p>119<\/p>\n<p>120<\/p>\n<p>121<\/p>\n<p>122<\/p>\n<p>123<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># raw_api_agent.py<\/span><\/p>\n<p><span class=\"crayon-p\"># A whole tool-using agent on the uncooked OpenAI SDK &#8212; no framework.<\/span><\/p>\n<p><span class=\"crayon-p\"># That is ~75 traces together with feedback. Evaluate it to the LangChain equal.<\/span><\/p>\n<p><span class=\"crayon-p\"># Stipulations: pip set up openai python-dotenv<\/span><\/p>\n<p><span class=\"crayon-p\"># Find out how to run: python raw_api_agent.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">os<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">json<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dotenv <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">load_dotenv<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">OpenAI<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">load_dotenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">shopper<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">OpenAI<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 TOOL DEFINITIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># The mannequin reads these descriptions to determine when and find out how to name every device.<\/span><\/p>\n<p><span class=\"crayon-p\"># Clear, particular descriptions are extra essential right here than in any framework &#8212;<\/span><\/p>\n<p><span class=\"crayon-p\"># there isn&#8217;t any wrapper to fill in gaps.<\/span><\/p>\n<p><span class=\"crayon-v\">TOOLS<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;type&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;function&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;function&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;name&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;calculate&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;Evaluate a mathematical expression. Use for arithmetic, &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;percentages, or numerical computation. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;Input: a Python math expression as a string.&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;parameters&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;type&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;object&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;properties&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;expression&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;type&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;string&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;A Python math expression, e.g. &#8216;1500 * 0.08&#8242;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;required&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;expression&#8221;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;sort&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;operate&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;operate&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;title&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;get_word_count&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Depend the variety of phrases in a given string of textual content.&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;parameters&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;sort&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;object&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;properties&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;textual content&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;sort&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;string&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;The textual content to rely.&#8221;<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;required&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;text&#8221;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 TOOL IMPLEMENTATIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">calculate<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">expression<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">attempt<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">eval<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">expression<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;__builtins__&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">besides <\/span><span class=\"crayon-e\">Exception <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Error: {e}&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">get_word_count<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">textual content<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">textual content<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">cut up<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Maps device title \u2192 Python operate for dynamic dispatch within the loop under<\/span><\/p>\n<p><span class=\"crayon-v\">TOOL_DISPATCH<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;calculate&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">calculate<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;get_word_count&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">get_word_count<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500 AGENT LOOP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">run_agent<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">user_message<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0A whole ReAct-style agent loop utilizing uncooked OpenAI device calls.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0The mannequin decides whether or not to name a device or return a last reply.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0The loop continues till the mannequin stops requesting device calls.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Each step is seen &#8212; no framework wrapping, no hidden logic.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">messages<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;role&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;system&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;content&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;You are a helpful assistant.&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;role&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;user&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-s\">&#8220;content&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">user_message<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">whereas<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">response<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">shopper<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">chat<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">completions<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">create<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;gpt-4o&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">messages<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">messages<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">instruments<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">TOOLS<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tool_choice<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;auto&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-p\"># Mannequin decides: name a device or reply immediately<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">temperature<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">message<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">response<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">decisions<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">message<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">messages<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">message<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-p\"># All the time add the assistant message to historical past<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># No device calls = the mannequin has its last reply<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">not<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">message<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">tool_calls<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">message<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">content material<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Execute every device name the mannequin requested<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">tool_call <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">message<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">tool_calls<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">title<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tool_call<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-t\">operate<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">title<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">json<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">hundreds<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">tool_call<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-t\">operate<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">arguments<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">fn<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">TOOL_DISPATCH<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">get<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">title<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">fn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">fn <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Unknown device: {title}&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Instrument outcome goes again into the message historical past.<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># The mannequin reads this on the subsequent iteration to determine what to do subsequent.<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">messages<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;position&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;device&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;tool_call_id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tool_call<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">id<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;content material&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-v\">outcome<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Loop &#8212; the mannequin now processes the device outcomes<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">queries<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;What is 18% of 3500?&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;How many words are in: The quick brown fox jumps over the lazy dog?&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;Split 240 items into groups of 16. How many groups?&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">q<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">queries<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Q: {q}nA: {run_agent(q)}n&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>What this does: The agent loop is absolutely clear. There isn&#8217;t any framework between you and the mannequin\u2019s response. The whereas True loop runs till message.tool_calls is empty, which occurs when the mannequin decides it has sufficient info to reply immediately. Each message \u2014 system, consumer, assistant, and gear outcome \u2014 is in a plain Python listing you&#8217;ll be able to examine, log, or modify at any level. That transparency is the uncooked path\u2019s core benefit: when one thing breaks, you recognize precisely the place to look.<\/p>\n<h2>Head-to-Head Comparability<\/h2>\n<p>The identical job was evaluated throughout three dimensions. All measurements replicate present benchmarks from unbiased evaluation cited all through this text.<\/p>\n<p>Framework Overhead and Efficiency<\/p>\n<p>Metric<br \/>\nUncooked API<br \/>\nLlamaIndex<br \/>\nLangChain (LCEL)<br \/>\nLangGraph<\/p>\n<p>Framework overhead<br \/>\n~0ms<br \/>\n~6ms<br \/>\n~10ms<br \/>\n~14ms<\/p>\n<p>Token overhead (per question)<br \/>\n0<br \/>\n~1.6K<br \/>\n~2.4K<br \/>\n~2.0K<\/p>\n<p>Per device name latency<br \/>\n2\u20135ms<br \/>\nN\/A<br \/>\n10\u201330ms<br \/>\n10\u201330ms<\/p>\n<p>Stack hint depth on error<br \/>\n2\u20135 frames<br \/>\n5\u201310 frames<br \/>\n15\u201340 frames<br \/>\n15\u201340 frames<\/p>\n<p>Debug transparency<br \/>\nExcessive<br \/>\nMedium<br \/>\nLow<br \/>\nLow<\/p>\n<p>Code Quantity: Identical RAG Process, Three WaysThis is essentially the most concrete technique to really feel the trade-off. All three implementations under reply the identical query from the identical context doc:<\/p>\n<p>Implementation<br \/>\nStrains of code<br \/>\nFramework set up dimension<br \/>\nDebugging readability<\/p>\n<p>Uncooked OpenAI SDK<br \/>\n~20 traces<br \/>\nopenai solely<br \/>\nFull visibility<\/p>\n<p>LlamaIndex<br \/>\n~15 traces<br \/>\nllama-index + plugins<br \/>\nMedium<\/p>\n<p>LangChain LCEL<br \/>\n~18 traces<br \/>\nlangchain + langchain-openai<br \/>\nLow\u2013medium<\/p>\n<p>For a primary one-document Q&amp;A, the distinction is marginal. The place LlamaIndex\u2019s code benefit compounds is while you add chunking methods, a number of paperwork, re-ranking, metadata filtering, and hybrid search \u2014 every of which requires extra meeting in LangChain than in LlamaIndex.<\/p>\n<p>When Every One BreaksKnowing when every strategy fails is as helpful as understanding when it succeeds.<\/p>\n<p>Failure mode<br \/>\nUncooked API<br \/>\nLlamaIndex<br \/>\nLangChain<\/p>\n<p>Retrieval accuracy degrades<br \/>\nYou constructed it, you repair it<br \/>\nTune chunking\/index technique<br \/>\nTune every pipeline element individually<\/p>\n<p>Agent loops indefinitely<br \/>\nAdd max_iterations manually<br \/>\nWorkflow timeout<br \/>\nmax_iterations parameter<\/p>\n<p>Immediate adjustments break output<br \/>\nFast, apparent<br \/>\nFast, apparent<br \/>\nCould propagate by chain silently<\/p>\n<p>Mannequin API adjustments<br \/>\nReplace SDK<br \/>\nReplace llama-index package deal<br \/>\nReplace langchain-openai + retest<\/p>\n<p>Debugging a manufacturing error<br \/>\nDirect, small stack<br \/>\nReasonable<br \/>\nDeep stack traces, onerous to isolate<\/p>\n<p>Scaling to excessive throughput<br \/>\nOptimum<br \/>\nGood<br \/>\nFramework overhead compounds<\/p>\n<h2>Full Working Instance<\/h2>\n<p>The identical doc Q&amp;A job applied 3 ways. Identical enter doc, identical query, completely different path by the stack. Learn these aspect by aspect and the trade-offs turn out to be concrete.<\/p>\n<p>Stipulations:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31ccb7679982213\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\npip set up openai langchain langchain-openai llama-index &#13;<br \/>\n            llama-index-llms-openai llama-index-embeddings-openai python-dotenv<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">pip <\/span><span class=\"crayon-e\">set up <\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">langchain <\/span><span class=\"crayon-v\">langchain<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-v\">llama<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-i\">index<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\"><\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">llama<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">llms<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-v\">llama<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">embeddings<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-v\">python<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">dotenv<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Find out how to run: Save as three_ways.py and run python three_ways.py<\/p>\n<div id=\"urvanov-syntax-highlighter-6a5043e31ccbb671239681\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-mac print-yes notranslate\" data-settings=\" minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# three_ways.py&#13;<br \/>\n# The identical doc Q&amp;A job applied 3 ways:&#13;<br \/>\n# Uncooked OpenAI SDK, LlamaIndex, and LangChain LCEL.&#13;<br \/>\n# Identical enter. Identical output. Completely different path by the stack.&#13;<br \/>\n# Stipulations: pip set up openai langchain langchain-openai llama-index&#13;<br \/>\n#                llama-index-llms-openai llama-index-embeddings-openai python-dotenv&#13;<br \/>\n# Find out how to run: python three_ways.py&#13;<br \/>\n&#13;<br \/>\nimport os&#13;<br \/>\nimport time&#13;<br \/>\nfrom dotenv import load_dotenv&#13;<br \/>\n&#13;<br \/>\nload_dotenv()&#13;<br \/>\n&#13;<br \/>\nQUESTION = &#8220;What&#8217;s retrieval-augmented era and why does it matter?&#8221;&#13;<br \/>\n&#13;<br \/>\nCONTEXT_DOC = &#8220;&#8221;&#8221;&#13;<br \/>\nRetrieval-Augmented Era (RAG) is a way that improves LLM responses&#13;<br \/>\nby fetching related context from an exterior data base earlier than producing&#13;<br \/>\na solution. As a substitute of relying solely on coaching information, RAG retrieves essentially the most&#13;<br \/>\nrelated doc chunks and contains them within the immediate. This reduces&#13;<br \/>\nhallucinations, retains solutions grounded in your precise information, and permits the mannequin&#13;<br \/>\nto reply questions on info it was by no means skilled on.&#13;<br \/>\n&#8220;&#8221;&#8221;&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# APPROACH 1: RAW OPENAI SDK&#13;<br \/>\n# When to make use of: easy, one-off calls the place full visibility issues most&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\ndef raw_api_answer(query: str, context: str) -&gt; str:&#13;<br \/>\n    &#8220;&#8221;&#8221;Reply a query utilizing context, through uncooked OpenAI SDK &#8212; no framework.&#8221;&#8221;&#8221;&#13;<br \/>\n    from openai import OpenAI&#13;<br \/>\n    shopper = OpenAI(api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;))&#13;<br \/>\n&#13;<br \/>\n    # Every part is express: the system immediate, the context injection,&#13;<br \/>\n    # the message construction. Nothing is hidden in a framework abstraction.&#13;<br \/>\n    response = shopper.chat.completions.create(&#13;<br \/>\n        mannequin=&#8221;gpt-4o&#8221;,&#13;<br \/>\n        temperature=0,&#13;<br \/>\n        messages=[&#13;<br \/>\n            {&#13;<br \/>\n                &#8220;role&#8221;: &#8220;system&#8221;,&#13;<br \/>\n                &#8220;content&#8221;: (&#13;<br \/>\n                    &#8220;Answer questions using only the provided context. &#8220;&#13;<br \/>\n                    &#8220;If the answer is not in the context, say so clearly.&#8221;&#13;<br \/>\n                )&#13;<br \/>\n            },&#13;<br \/>\n            {&#13;<br \/>\n                &#8220;role&#8221;: &#8220;user&#8221;,&#13;<br \/>\n                &#8220;content&#8221;: f&#8221;Context:n{context}nnQuestion: {question}&#8221;&#13;<br \/>\n            }&#13;<br \/>\n        ]&#13;<br \/>\n    )&#13;<br \/>\n    return response.decisions[0].message.content material&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# APPROACH 2: LLAMAINDEX&#13;<br \/>\n# When to make use of: document-heavy retrieval the place you need optimized RAG out of the field&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\ndef llamaindex_answer(query: str, context: str) -&gt; str:&#13;<br \/>\n    &#8220;&#8221;&#8221;Reply a query utilizing LlamaIndex &#8212; purpose-built retrieval pipeline.&#8221;&#8221;&#8221;&#13;<br \/>\n    from llama_index.core import VectorStoreIndex, Doc, Settings&#13;<br \/>\n    from llama_index.llms.openai import OpenAI as LlamaOpenAI&#13;<br \/>\n    from llama_index.embeddings.openai import OpenAIEmbedding&#13;<br \/>\n&#13;<br \/>\n    # Configure as soon as &#8212; all pipeline parts decide it up&#13;<br \/>\n    Settings.llm = LlamaOpenAI(&#13;<br \/>\n        mannequin=&#8221;gpt-4o&#8221;, temperature=0,&#13;<br \/>\n        api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;)&#13;<br \/>\n    )&#13;<br \/>\n    Settings.embed_model = OpenAIEmbedding(&#13;<br \/>\n        mannequin=&#8221;text-embedding-3-small&#8221;,&#13;<br \/>\n        api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;)&#13;<br \/>\n    )&#13;<br \/>\n&#13;<br \/>\n    # from_documents() = chunk + embed + index in a single name&#13;<br \/>\n    # For a number of paperwork, cross an inventory: from_documents([doc1, doc2, doc3])&#13;<br \/>\n    index = VectorStoreIndex.from_documents([Document(text=context)])&#13;<br \/>\n&#13;<br \/>\n    # as_query_engine() = retriever + generator, wired collectively robotically&#13;<br \/>\n    query_engine = index.as_query_engine(similarity_top_k=1)&#13;<br \/>\n    return str(query_engine.question(query))&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# APPROACH 3: LANGCHAIN LCEL&#13;<br \/>\n# When to make use of: workflows that may develop to incorporate brokers, reminiscence, or routing&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\ndef langchain_answer(query: str, context: str) -&gt; str:&#13;<br \/>\n    &#8220;&#8221;&#8221;Reply a query utilizing a LangChain LCEL chain.&#8221;&#8221;&#8221;&#13;<br \/>\n    from langchain_core.prompts import ChatPromptTemplate&#13;<br \/>\n    from langchain_core.output_parsers import StrOutputParser&#13;<br \/>\n    from langchain_openai import ChatOpenAI&#13;<br \/>\n&#13;<br \/>\n    llm = ChatOpenAI(&#13;<br \/>\n        mannequin=&#8221;gpt-4o&#8221;, temperature=0,&#13;<br \/>\n        api_key=os.getenv(&#8220;OPENAI_API_KEY&#8221;)&#13;<br \/>\n    )&#13;<br \/>\n&#13;<br \/>\n    immediate = ChatPromptTemplate.from_messages([&#13;<br \/>\n        (&#8220;system&#8221;,&#13;<br \/>\n         &#8220;Answer using only the provided context. &#8220;&#13;<br \/>\n         &#8220;If the answer is not in the context, say so.nnContext:n{context}&#8221;),&#13;<br \/>\n        (&#8220;human&#8221;, &#8220;{question}&#8221;)&#13;<br \/>\n    ])&#13;<br \/>\n&#13;<br \/>\n    # The identical chain helps .stream(), .batch(), .ainvoke() &#8212; no code adjustments wanted&#13;<br \/>\n    chain = immediate | llm | StrOutputParser()&#13;<br \/>\n    return chain.invoke({&#8220;context&#8221;: context, &#8220;query&#8221;: query})&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\n# RUN ALL THREE AND COMPARE&#13;<br \/>\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    approaches = [&#13;<br \/>\n        (&#8220;Raw OpenAI SDK&#8221;, raw_api_answer),&#13;<br \/>\n        (&#8220;LlamaIndex&#8221;,     llamaindex_answer),&#13;<br \/>\n        (&#8220;LangChain LCEL&#8221;, langchain_answer),&#13;<br \/>\n    ]&#13;<br \/>\n&#13;<br \/>\n    for title, fn in approaches:&#13;<br \/>\n        print(f&#8221;n{&#8216;=&#8217;*60}&#8221;)&#13;<br \/>\n        print(f&#8221;Strategy: {title}&#8221;)&#13;<br \/>\n        print(f&#8221;{&#8216;=&#8217;*60}&#8221;)&#13;<br \/>\n        begin = time.perf_counter()&#13;<br \/>\n        reply = fn(QUESTION, CONTEXT_DOC)&#13;<br \/>\n        elapsed = time.perf_counter() &#8211; begin&#13;<br \/>\n        print(f&#8221;Reply: {reply}&#8221;)&#13;<br \/>\n        print(f&#8221;Time (excluding LLM): seen in wall clock&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<p>72<\/p>\n<p>73<\/p>\n<p>74<\/p>\n<p>75<\/p>\n<p>76<\/p>\n<p>77<\/p>\n<p>78<\/p>\n<p>79<\/p>\n<p>80<\/p>\n<p>81<\/p>\n<p>82<\/p>\n<p>83<\/p>\n<p>84<\/p>\n<p>85<\/p>\n<p>86<\/p>\n<p>87<\/p>\n<p>88<\/p>\n<p>89<\/p>\n<p>90<\/p>\n<p>91<\/p>\n<p>92<\/p>\n<p>93<\/p>\n<p>94<\/p>\n<p>95<\/p>\n<p>96<\/p>\n<p>97<\/p>\n<p>98<\/p>\n<p>99<\/p>\n<p>100<\/p>\n<p>101<\/p>\n<p>102<\/p>\n<p>103<\/p>\n<p>104<\/p>\n<p>105<\/p>\n<p>106<\/p>\n<p>107<\/p>\n<p>108<\/p>\n<p>109<\/p>\n<p>110<\/p>\n<p>111<\/p>\n<p>112<\/p>\n<p>113<\/p>\n<p>114<\/p>\n<p>115<\/p>\n<p>116<\/p>\n<p>117<\/p>\n<p>118<\/p>\n<p>119<\/p>\n<p>120<\/p>\n<p>121<\/p>\n<p>122<\/p>\n<p>123<\/p>\n<p>124<\/p>\n<p>125<\/p>\n<p>126<\/p>\n<p>127<\/p>\n<p>128<\/p>\n<p>129<\/p>\n<p>130<\/p>\n<p>131<\/p>\n<p>132<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># three_ways.py<\/span><\/p>\n<p><span class=\"crayon-p\"># The identical doc Q&amp;A job applied 3 ways:<\/span><\/p>\n<p><span class=\"crayon-p\"># Uncooked OpenAI SDK, LlamaIndex, and LangChain LCEL.<\/span><\/p>\n<p><span class=\"crayon-p\"># Identical enter. Identical output. Completely different path by the stack.<\/span><\/p>\n<p><span class=\"crayon-p\"># Stipulations: pip set up openai langchain langchain-openai llama-index<\/span><\/p>\n<p><span class=\"crayon-p\">#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0llama-index-llms-openai llama-index-embeddings-openai python-dotenv<\/span><\/p>\n<p><span class=\"crayon-p\"># Find out how to run: python three_ways.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">os<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">time<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dotenv <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">load_dotenv<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">load_dotenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">QUESTION<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;What&#8217;s retrieval-augmented era and why does it matter?&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-v\">CONTEXT_DOC<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">Retrieval-Augmented Era (RAG) is a way that improves LLM responses<\/span><\/p>\n<p><span class=\"crayon-s\">by fetching related context from an exterior data base earlier than producing<\/span><\/p>\n<p><span class=\"crayon-s\">a solution. As a substitute of relying solely on coaching information, RAG retrieves essentially the most<\/span><\/p>\n<p><span class=\"crayon-s\">related doc chunks and contains them within the immediate. This reduces<\/span><\/p>\n<p><span class=\"crayon-s\">hallucinations, retains solutions grounded in your precise information, and permits the mannequin<\/span><\/p>\n<p><span class=\"crayon-s\">to reply questions on info it was by no means skilled on.<\/span><\/p>\n<p><span class=\"crayon-s\">&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># APPROACH 1: RAW OPENAI SDK<\/span><\/p>\n<p><span class=\"crayon-p\"># When to make use of: easy, one-off calls the place full visibility issues most<\/span><\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">raw_api_answer<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">query<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">context<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;Reply a query utilizing context, through uncooked OpenAI SDK &#8212; no framework.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">OpenAI<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">shopper<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">OpenAI<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Every part is express: the system immediate, the context injection,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># the message construction. Nothing is hidden in a framework abstraction.<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">response<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">shopper<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">chat<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">completions<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">create<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;gpt-4o&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">temperature<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">messages<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;role&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;system&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;content&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;Answer questions using only the provided context. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;If the answer is not in the context, say so clearly.&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;role&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;user&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;content&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Context:n{context}nnQuestion: {question}&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">response<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">decisions<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">message<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">content material<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># APPROACH 2: LLAMAINDEX<\/span><\/p>\n<p><span class=\"crayon-p\"># When to make use of: document-heavy retrieval the place you need optimized RAG out of the field<\/span><\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">llamaindex_answer<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">query<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">context<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;Reply a query utilizing LlamaIndex &#8212; purpose-built retrieval pipeline.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">llama_index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">core <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">VectorStoreIndex<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Doc<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Settings<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">llama_index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">llms<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">OpenAI <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">LlamaOpenAI<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">llama_index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">embeddings<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">OpenAIEmbedding<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Configure as soon as &#8212; all pipeline parts decide it up<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">Settings<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">llm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">LlamaOpenAI<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;gpt-4o&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">temperature<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">Settings<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">embed_model<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">OpenAIEmbedding<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;text-embedding-3-small&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># from_documents() = chunk + embed + index in a single name<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># For a number of paperwork, cross an inventory: from_documents([doc1, doc2, doc3])<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">VectorStoreIndex<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">from_documents<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-e\">Document<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">text<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">context<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># as_query_engine() = retriever + generator, wired collectively robotically<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">query_engine<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">index<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">as_query_engine<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">similarity_top_k<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">query_engine<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">question<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">query<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># APPROACH 3: LANGCHAIN LCEL<\/span><\/p>\n<p><span class=\"crayon-p\"># When to make use of: workflows that may develop to incorporate brokers, reminiscence, or routing<\/span><\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">langchain_answer<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">query<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">context<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;Reply a query utilizing a LangChain LCEL chain.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langchain_core<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">prompts <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">ChatPromptTemplate<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">langchain_core<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">output_parsers <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">StrOutputParser<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">langchain_openai <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">ChatOpenAI<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">llm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ChatOpenAI<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;gpt-4o&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">temperature<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">api_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">os<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">getenv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;OPENAI_API_KEY&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">immediate<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ChatPromptTemplate<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">from_messages<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;system&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-s\">&#8220;Answer using only the provided context. &#8220;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-s\">&#8220;If the answer is not in the context, say so.nnContext:n{context}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;human&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;{question}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># The identical chain helps .stream(), .batch(), .ainvoke() &#8212; no code adjustments wanted<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">chain<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">immediate<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">llm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">StrOutputParser<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">chain<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">invoke<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;context&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">context<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;query&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">query<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-p\"># RUN ALL THREE AND COMPARE<\/span><\/p>\n<p><span class=\"crayon-p\"># \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">approaches<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Raw OpenAI SDK&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">raw_api_answer<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;LlamaIndex&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-v\">llamaindex_answer<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;LangChain LCEL&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">langchain_answer<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">title<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">fn <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">approaches<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;n{&#8216;=&#8217;*60}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Strategy: {title}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;{&#8216;=&#8217;*60}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">begin<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">time<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">perf_counter<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">reply<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">fn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">QUESTION<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">CONTEXT_DOC<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">elapsed<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">time<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">perf_counter<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">begin<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Reply: {reply}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Time (excluding LLM): seen in wall clock&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>What this does: All three features obtain the identical QUESTION and CONTEXT_DOC and return a string reply. The uncooked API model manually constructs the message listing and extracts the response. The LlamaIndex model makes use of from_documents() and as_query_engine() to deal with the pipeline. The LangChain model assembles a immediate, mannequin, and parser with the | operator. At this scale \u2014 one doc, one query \u2014 the variations are minimal. Feed this operate 500 paperwork and a posh question, and the hole between LlamaIndex\u2019s purpose-built retrieval and the opposite two approaches opens up considerably.<\/p>\n<h2>Wrapping Up<\/h2>\n<p>The framework determination is just not about which possibility has essentially the most GitHub stars or essentially the most options. It&#8217;s about matching the abstraction degree of your device to the precise complexity of your downside.<\/p>\n<p>For easy, one-shot duties, uncooked API calls are quicker to jot down, quicker to run, and simpler to debug than any framework. For doc retrieval at any significant scale, LlamaIndex earns its dependency by higher chunking, quicker indexing, and fewer code. For stateful brokers with reminiscence, instruments, and multi-step reasoning, LangGraph\u2019s persistence and graph-based management stream are genuinely onerous to duplicate cleanly with a hand-rolled loop.<\/p>\n<p>The sample that almost all manufacturing groups converge on by mid-2026 is just not a single framework however a layered stack: uncooked SDK for the easy calls, LlamaIndex for the retrieval layer, LangGraph for the agent loop, and LangSmith for tracing throughout the whole lot. None of these decisions locks you out of the others. They compose.<\/p>\n<p>The sensible rule is that this: begin with the minimal possibility that handles your present necessities, and add a framework while you hit an issue the framework was constructed to unravel \u2014 not earlier than. A retrieval downside you encounter is a cause so as to add LlamaIndex. A state administration downside you encounter is a cause so as to add LangGraph. Including both earlier than you are feeling the ache they tackle means including upkeep overhead for a future downside that will not arrive within the form you anticipated.<\/p>\n<\/p><\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/machinelearningmastery.com\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>On this article, you&#8217;ll learn the way LangChain, LlamaIndex, and uncooked API calls every clear up a special layer of the LLM software stack, and the way to decide on amongst them primarily based on what your challenge truly requires. Subjects we&#8217;ll cowl embrace: What every possibility is designed to do, said plainly with out [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2113,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png","fifu_image_alt":"","jnews-multi-image_gallery":[],"jnews_single_post":[],"jnews_primary_category":[],"jnews_override_bookmark_settings":[],"jnews_social_meta":[],"jnews_override_counter":[],"footnotes":""},"categories":[7],"tags":[2433,759,463,2191,2625,2626,452,1857,2627],"class_list":["post-2111","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-science-mlops","tag-api","tag-calls","tag-compared","tag-frameworks","tag-langchain","tag-llamaindex","tag-llm","tag-orchestration","tag-raw"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls - Future News 24<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls - Future News 24\" \/>\n<meta property=\"og:description\" content=\"On this article, you&#8217;ll learn the way LangChain, LlamaIndex, and uncooked API calls every clear up a special layer of the LLM software stack, and the way to decide on amongst them primarily based on what your challenge truly requires. Subjects we&#8217;ll cowl embrace: What every possibility is designed to do, said plainly with out [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/\" \/>\n<meta property=\"og:site_name\" content=\"Future News 24\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-09T15:38:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-10T00:59:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png\" \/><meta property=\"og:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png\" \/>\n<meta name=\"author\" content=\"Future News 24\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Future News 24\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/\"},\"author\":{\"name\":\"Future News 24\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/person\\\/cecad1bde21cfc357cf70128144d6c83\"},\"headline\":\"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls\",\"datePublished\":\"2026-07-09T15:38:00+00:00\",\"dateModified\":\"2026-07-10T00:59:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/\"},\"wordCount\":6950,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png\",\"keywords\":[\"API\",\"calls\",\"Compared\",\"Frameworks\",\"LangChain\",\"LlamaIndex\",\"LLM\",\"Orchestration\",\"Raw\"],\"articleSection\":[\"Data Science &amp; MLOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/\",\"name\":\"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls - Future News 24\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png\",\"datePublished\":\"2026-07-09T15:38:00+00:00\",\"dateModified\":\"2026-07-10T00:59:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#primaryimage\",\"url\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png\",\"contentUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/09\\\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/futurenews24.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#website\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/\",\"name\":\"Future News 24\",\"description\":\"The Smart Hub for AI and Next-Gen Innovation\",\"publisher\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/futurenews24.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\",\"name\":\"Future News 24\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/fn24-favicon.png\",\"contentUrl\":\"https:\\\/\\\/futurenews24.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/fn24-favicon.png\",\"width\":250,\"height\":250,\"caption\":\"Future News 24\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/person\\\/cecad1bde21cfc357cf70128144d6c83\",\"name\":\"Future News 24\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"caption\":\"Future News 24\"},\"sameAs\":[\"https:\\\/\\\/futurenews24.com\"],\"url\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/author\\\/mridulpahuja20\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls - Future News 24","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/","og_locale":"en_US","og_type":"article","og_title":"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls - Future News 24","og_description":"On this article, you&#8217;ll learn the way LangChain, LlamaIndex, and uncooked API calls every clear up a special layer of the LLM software stack, and the way to decide on amongst them primarily based on what your challenge truly requires. Subjects we&#8217;ll cowl embrace: What every possibility is designed to do, said plainly with out [&hellip;]","og_url":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/","og_site_name":"Future News 24","article_published_time":"2026-07-09T15:38:00+00:00","article_modified_time":"2026-07-10T00:59:18+00:00","og_image":[{"url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png","type":"","width":"","height":""},{"url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png","type":"","width":"","height":""}],"author":"Future News 24","twitter_card":"summary_large_image","twitter_image":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png","twitter_misc":{"Written by":"Future News 24","Est. reading time":"34 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#article","isPartOf":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/"},"author":{"name":"Future News 24","@id":"https:\/\/futurenews24.com\/#\/schema\/person\/cecad1bde21cfc357cf70128144d6c83"},"headline":"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls","datePublished":"2026-07-09T15:38:00+00:00","dateModified":"2026-07-10T00:59:18+00:00","mainEntityOfPage":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/"},"wordCount":6950,"commentCount":0,"publisher":{"@id":"https:\/\/futurenews24.com\/#organization"},"image":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#primaryimage"},"thumbnailUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png","keywords":["API","calls","Compared","Frameworks","LangChain","LlamaIndex","LLM","Orchestration","Raw"],"articleSection":["Data Science &amp; MLOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/","url":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/","name":"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls - Future News 24","isPartOf":{"@id":"https:\/\/futurenews24.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#primaryimage"},"image":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#primaryimage"},"thumbnailUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png","datePublished":"2026-07-09T15:38:00+00:00","dateModified":"2026-07-10T00:59:18+00:00","breadcrumb":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#primaryimage","url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png","contentUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-LLM-Orchestration-Frameworks-Compared-1024x680.png"},{"@type":"BreadcrumbList","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/09\/llm-orchestration-frameworks-compared-langchain-vs-llamaindex-vs-raw-api-calls\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/futurenews24.com\/"},{"@type":"ListItem","position":2,"name":"LLM Orchestration Frameworks In contrast: LangChain vs. LlamaIndex vs. Uncooked API Calls"}]},{"@type":"WebSite","@id":"https:\/\/futurenews24.com\/#website","url":"https:\/\/futurenews24.com\/","name":"Future News 24","description":"The Smart Hub for AI and Next-Gen Innovation","publisher":{"@id":"https:\/\/futurenews24.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/futurenews24.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/futurenews24.com\/#organization","name":"Future News 24","url":"https:\/\/futurenews24.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/futurenews24.com\/#\/schema\/logo\/image\/","url":"https:\/\/futurenews24.com\/wp-content\/uploads\/2026\/06\/fn24-favicon.png","contentUrl":"https:\/\/futurenews24.com\/wp-content\/uploads\/2026\/06\/fn24-favicon.png","width":250,"height":250,"caption":"Future News 24"},"image":{"@id":"https:\/\/futurenews24.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/futurenews24.com\/#\/schema\/person\/cecad1bde21cfc357cf70128144d6c83","name":"Future News 24","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","caption":"Future News 24"},"sameAs":["https:\/\/futurenews24.com"],"url":"https:\/\/futurenews24.com\/index.php\/author\/mridulpahuja20\/"}]}},"_links":{"self":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/2111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/comments?post=2111"}],"version-history":[{"count":1,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/2111\/revisions"}],"predecessor-version":[{"id":2112,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/2111\/revisions\/2112"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/media\/2113"}],"wp:attachment":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/media?parent=2111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/categories?post=2111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/tags?post=2111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}