{"id":6132,"date":"2025-08-30T08:18:14","date_gmt":"2025-08-30T08:18:14","guid":{"rendered":"https:\/\/techtrendfeed.com\/?p=6132"},"modified":"2025-08-30T08:18:14","modified_gmt":"2025-08-30T08:18:14","slug":"a-developers-information-to-rag-on-semi-structured-knowledge","status":"publish","type":"post","link":"https:\/\/techtrendfeed.com\/?p=6132","title":{"rendered":"A Developer&#8217;s Information to RAG on Semi-Structured Knowledge"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div id=\"article-start\">\n<p>Have you ever carried out RAG over PDFs, Docs, and Studies? Many essential paperwork aren&#8217;t simply easy textual content. Take into consideration analysis papers, monetary reviews, or product manuals. They usually comprise a mixture of paragraphs, tables, and different structured components. This creates a major problem for normal Retrieval-Augmented Technology (RAG) methods. Efficient RAG on semi-structured information requires extra than simply fundamental textual content splitting. This information provides a hands-on answer utilizing clever unstructured information parsing and a sophisticated RAG approach referred to as the multi-vector retriever, all inside the LangChain RAG framework.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-need-for-rag-on-semi-structured-data\">Want for RAG on Semi-Structured Knowledge<\/h2>\n<p>Conventional <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2023\/09\/retrieval-augmented-generation-rag-in-ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">RAG<\/a> pipelines usually stumble with these mixed-content paperwork. First, a easy textual content splitter may chop a desk in half, destroying the precious information inside. Second, embedding the uncooked textual content of a big desk can create noisy, ineffective vectors for semantic search. The language mannequin may by no means see the precise context to reply a consumer\u2019s query.<\/p>\n<p>We are going to construct a better system that intelligently separates textual content from tables and makes use of completely different methods for storing and retrieving every. This strategy ensures our language mannequin will get the exact, full data it wants to offer correct solutions.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-the-solution-a-smarter-approach-to-retrieval\">The Answer: A Smarter Method to Retrieval<\/h2>\n<p>Our answer tackles the core challenges head-on through the use of two key elements. This technique is all about getting ready and retrieving information in a means that preserves its unique which means and construction.<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>Clever Knowledge Parsing:<\/strong> We use the Unstructured library to do the preliminary heavy lifting. As an alternative of blindly splitting textual content, Unstructured\u2019s <code>partition_pdf<\/code> perform analyzes a doc\u2019s structure. It might inform the distinction between a paragraph and a desk, extracting every factor cleanly and preserving its integrity.<\/li>\n<li><strong>The Multi-Vector Retriever:<\/strong> That is the core of our <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2025\/04\/advanced-rag-techniques\/\" target=\"_blank\" rel=\"noreferrer noopener\">superior RAG approach<\/a>. The multi-vector retriever permits us to retailer a number of representations of our information. For retrieval, we are going to use concise summaries of our textual content chunks and tables. These smaller summaries are a lot better for embedding and similarity search. For reply era, we are going to move the total, uncooked desk or textual content chunk to the language mannequin. This offers the mannequin the entire context it wants.<\/li>\n<\/ul>\n<p>The general workflow appears like this:<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-building-the-rag-pipeline\">Constructing the RAG Pipeline<\/h2>\n<p>Let\u2019s stroll by the best way to construct this technique step-by-step. We are going to use the <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/arxiv.org\/abs\/2307.09288\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">LLaMA2 analysis paper<\/a> as our instance doc.<\/p>\n<h4 class=\"wp-block-heading\" id=\"h-step-1-setting-up-the-environment\"><strong>Step 1: Setting Up the Atmosphere<\/strong><\/h4>\n<p>First, we have to set up the required <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2021\/05\/introduction-to-python-programming-beginners-guide\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python<\/a> packages. We\u2019ll use LangChain for the core framework, Unstructured for parsing, and Chroma for our vector retailer.<\/p>\n<pre class=\"wp-block-code\"><code>! pip set up langchain langchain-chroma \"unstructured[all-docs]\" pydantic lxml langchainhub langchain_openai -q<\/code><\/pre>\n<p>Unstructured\u2019s PDF parsing depends on a few exterior instruments for processing and <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2021\/06\/optical-character-recognitionocr-with-tesseract-opencv-and-python\/\" target=\"_blank\" rel=\"noreferrer noopener\">Optical Character Recognition (OCR)<\/a>. In the event you\u2019re on a Mac, you&#8217;ll be able to set up them simply utilizing Homebrew.<\/p>\n<pre class=\"wp-block-code\"><code>!apt-get set up -y tesseract-ocr\n!apt-get set up -y poppler-utils<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-step-2-data-loading-and-parsing-with-unstructured\"><strong>Step 2: Knowledge Loading and Parsing with Unstructured<\/strong><\/h4>\n<p>Our first process is to course of the PDF. We use partition_pdf from Unstructured, which is purpose-built for this sort of unstructured information parsing. We are going to configure it to determine tables and chunk the doc\u2019s textual content by its titles and subtitles.<\/p>\n<pre class=\"wp-block-code\"><code>from typing import Any\n\nfrom pydantic import BaseModel\n\nfrom unstructured.partition.pdf import partition_pdf\n\n# Get components\n\nraw_pdf_elements = partition_pdf(\n\n\u00a0\u00a0\u00a0filename=\"\/content material\/LLaMA2.pdf\",\n\n\u00a0\u00a0\u00a0# Unstructured first finds embedded picture blocks\n\n\u00a0\u00a0\u00a0extract_images_in_pdf=False,\n\n\u00a0\u00a0\u00a0# Use structure mannequin (YOLOX) to get bounding containers (for tables) and discover titles\n\n\u00a0\u00a0\u00a0# Titles are any sub-section of the doc\n\n\u00a0\u00a0\u00a0infer_table_structure=True,\n\n\u00a0\u00a0\u00a0# Put up processing to mixture textual content as soon as we've the title\n\n\u00a0\u00a0\u00a0chunking_strategy=\"by_title\",\n\n\u00a0\u00a0\u00a0# Chunking params to mixture textual content blocks\n\n\u00a0\u00a0\u00a0# Try and create a brand new chunk 3800 chars\n\n\u00a0\u00a0\u00a0# Try and preserve chunks &gt; 2000 chars\n\n\u00a0\u00a0\u00a0max_characters=4000,\n\n\u00a0\u00a0\u00a0new_after_n_chars=3800,\n\n\u00a0\u00a0\u00a0combine_text_under_n_chars=2000,\n\n\u00a0\u00a0\u00a0image_output_dir_path=path,\n\n)<\/code><\/pre>\n<p>After operating the partitioner, we are able to see what sorts of components it discovered. The output exhibits two predominant sorts: <code>CompositeElement<\/code> for our textual content chunks and <code>Desk<\/code> for the tables.<\/p>\n<pre class=\"wp-block-code\"><code># Create a dictionary to retailer counts of every sort\n\ncategory_counts = {}\n\nfor factor in raw_pdf_elements:\n\n\u00a0\u00a0\u00a0class = str(sort(factor))\n\n\u00a0\u00a0\u00a0if class in category_counts:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category_countsBeginner += 1\n\n\u00a0\u00a0\u00a0else:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category_countsBeginner = 1\n\n# Unique_categories may have distinctive components\n\nunique_categories = set(category_counts.keys())\n\ncategory_counts<\/code><\/pre>\n<p><strong>Output:<\/strong><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"578\" height=\"47\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image3-14.webp\" alt=\"Identifying the composite element and table chunks\" class=\"wp-image-241886\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image3-14.webp 578w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image3-14-300x24.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image3-14-150x12.webp 150w\" sizes=\"auto, (max-width: 578px) 100vw, 578px\"\/><\/figure>\n<\/div>\n<p>As you&#8217;ll be able to see, Unstructured did an excellent job figuring out 2 distinct tables and 85 textual content chunks. Now, let\u2019s separate these into distinct lists for simpler processing.<\/p>\n<pre class=\"wp-block-code\"><code>class Factor(BaseModel):\n\n\u00a0\u00a0\u00a0sort: str\n\n\u00a0\u00a0\u00a0textual content: Any\n\n# Categorize by sort\n\ncategorized_elements = []\n\nfor factor in raw_pdf_elements:\n\n\u00a0\u00a0\u00a0if \"unstructured.paperwork.components.Desk\" in str(sort(factor)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0categorized_elements.append(Factor(sort=\"desk\", textual content=str(factor)))\n\n\u00a0\u00a0\u00a0elif \"unstructured.paperwork.components.CompositeElement\" in str(sort(factor)):\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0categorized_elements.append(Factor(sort=\"textual content\", textual content=str(factor)))\n\n# Tables\n\ntable_elements = [e for e in categorized_elements if e.type == \"table\"]\n\nprint(len(table_elements))\n\n# Textual content\n\ntext_elements = [e for e in categorized_elements if e.type == \"text\"]\n\nprint(len(text_elements))<\/code><\/pre>\n<p><strong>Output:<\/strong><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"88\" height=\"53\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image1-16.webp\" alt=\"Text elements in the output\" class=\"wp-image-241887\"\/><\/figure>\n<\/div>\n<h4 class=\"wp-block-heading\" id=\"h-step-3-creating-summaries-for-better-retrieval\"><strong>Step 3: Creating Summaries for Higher Retrieval<\/strong><\/h4>\n<p>Giant tables and lengthy textual content blocks don\u2019t create very efficient embeddings for semantic search. A concise abstract, nonetheless, is ideal. That is the central concept of utilizing a multi-vector retriever. We\u2019ll create a easy <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2024\/06\/langchain-guide\/\" target=\"_blank\" rel=\"noreferrer noopener\">LangChain<\/a> chain to generate these summaries.<\/p>\n<pre class=\"wp-block-code\"><code>from langchain_core.output_parsers import StrOutputParser\n\nfrom langchain_core.prompts import ChatPromptTemplate\n\nfrom langchain_openai import ChatOpenAI\n\nfrom getpass import getpass\n\nOPENAI_KEY = getpass('Enter Open AI API Key: ')\n\nLANGCHAIN_API_KEY = getpass('Enter Langchain API Key: ')\n\nLANGCHAIN_TRACING_V2=\"true\"\n\n# Immediate\n\nprompt_text = \"\"\"You're an assistant tasked with summarizing tables and textual content. Give a concise abstract of the desk or textual content. Desk or textual content chunk: {factor} \"\"\"\n\nimmediate = ChatPromptTemplate.from_template(prompt_text)\n\n# Abstract chain\n\nmannequin = ChatOpenAI(temperature=0, mannequin=\"gpt-4.1-mini\")\n\nsummarize_chain = {\"factor\": lambda x: x} | immediate | mannequin | StrOutputParser()<\/code><\/pre>\n<p>Now, we apply this chain to our extracted tables and textual content chunks. The batch technique permits us to course of these concurrently, which speeds issues up.<\/p>\n<pre class=\"wp-block-code\"><code># Apply to tables\n\ntables = [i.text for i in table_elements]\n\ntable_summaries = summarize_chain.batch(tables, {\"max_concurrency\": 5})\n\n# Apply to texts\n\ntexts = [i.text for i in text_elements]\n\ntext_summaries = summarize_chain.batch(texts, {\"max_concurrency\": 5})<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-step-4-building-the-multi-vector-retriever\"><strong>Step 4: Constructing the Multi-Vector Retriever<\/strong><\/h4>\n<p>With our summaries prepared, it\u2019s time to construct the retriever. It makes use of two storage elements:<\/p>\n<ol class=\"wp-block-list\">\n<li>A vectorstore (<a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2023\/07\/guide-to-chroma-db-a-vector-store-for-your-generative-ai-llms\/\" target=\"_blank\" rel=\"noreferrer noopener\">ChromaDB<\/a>) shops the embedded <em>summaries<\/em>.<\/li>\n<li>A docstore (a easy in-memory retailer) holds the <em>uncooked<\/em> desk and textual content content material.<\/li>\n<\/ol>\n<p>The retriever makes use of distinctive IDs to create a hyperlink between a abstract within the vector retailer and its corresponding uncooked doc within the docstore.<\/p>\n<pre class=\"wp-block-code\"><code>import uuid\n\nfrom langchain.retrievers.multi_vector import MultiVectorRetriever\n\nfrom langchain.storage import InMemoryStore\n\nfrom langchain_chroma import Chroma\n\nfrom langchain_core.paperwork import Doc\n\nfrom langchain_openai import OpenAIEmbeddings\n\n# The vectorstore to make use of to index the kid chunks\n\nvectorstore = Chroma(collection_name=\"summaries\", embedding_function=OpenAIEmbeddings())\n\n# The storage layer for the guardian paperwork\n\nretailer = InMemoryStore()\n\nid_key = \"doc_id\"\n\n# The retriever (empty to start out)\n\nretriever = MultiVectorRetriever(\n\n\u00a0\u00a0\u00a0vectorstore=vectorstore,\n\n\u00a0\u00a0\u00a0docstore=retailer,\n\n\u00a0\u00a0\u00a0id_key=id_key,\n\n)\n\n# Add texts\n\ndoc_ids = [str(uuid.uuid4()) for _ in texts]\n\nsummary_texts = [\n\n\u00a0\u00a0\u00a0Document(page_content=s, metadata={id_key: doc_ids[i]})\n\n\u00a0\u00a0\u00a0for i, s in enumerate(text_summaries)\n\n]\n\nretriever.vectorstore.add_documents(summary_texts)\n\nretriever.docstore.mset(record(zip(doc_ids, texts)))\n\n# Add tables\n\ntable_ids = [str(uuid.uuid4()) for _ in tables]\n\nsummary_tables = [\n\n\u00a0\u00a0\u00a0Document(page_content=s, metadata={id_key: table_ids[i]})\n\n\u00a0\u00a0\u00a0for i, s in enumerate(table_summaries)\n\n]\n\nretriever.vectorstore.add_documents(summary_tables)\n\nretriever.docstore.mset(record(zip(table_ids, tables)))<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-step-5-running-the-rag-chain\"><strong>Step 5: Operating the RAG Chain<\/strong><\/h4>\n<p>Lastly, we assemble the entire LangChain RAG pipeline. The chain will take a query, use our retriever to fetch the related summaries, pull the corresponding uncooked paperwork, after which move every part to the language mannequin to generate a solution.<\/p>\n<pre class=\"wp-block-code\"><code>from langchain_core.runnables import RunnablePassthrough\n\n# Immediate template\n\ntemplate = \"\"\"Reply the query primarily based solely on the next context, which may embody textual content and tables:\n\n{context}\n\nQuery: {query}\n\n\"\"\"\n\nimmediate = ChatPromptTemplate.from_template(template)\n\n# LLM\n\nmannequin = ChatOpenAI(temperature=0, mannequin=\"gpt-4\")\n\n# RAG pipeline\n\nchain = (\n\n\u00a0\u00a0\u00a0{\"context\": retriever, \"query\": RunnablePassthrough()}\n\n\u00a0\u00a0\u00a0| immediate\n\n\u00a0\u00a0\u00a0| mannequin\n\n\u00a0\u00a0\u00a0| StrOutputParser()\n\n)\n\nLet's take a look at it with a selected query that may solely be answered by  a desk within the paper.\n\nchain.invoke(\"What's the variety of coaching tokens for LLaMA2?\")<\/code><\/pre>\n<p><strong>Output:<\/strong><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"570\" height=\"29\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image4-13.webp\" alt=\"Testing the working of the workflow\" class=\"wp-image-241889\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image4-13.webp 570w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image4-13-300x15.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/08\/image4-13-150x8.webp 150w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\"\/><\/figure>\n<\/div>\n<p>The system works completely. By inspecting the method, we are able to see that the retriever first discovered the abstract of Desk 1, which discusses mannequin parameters and coaching information. Then, it retrieved the total, uncooked desk from the docstore and supplied it to the <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2023\/03\/an-introduction-to-large-language-models-llms\/\" target=\"_blank\" rel=\"noreferrer noopener\">LLM<\/a>. This gave the mannequin the precise information wanted to reply the query accurately, proving the ability of this RAG on semi-structured information strategy.<\/p>\n<p>You&#8217;ll be able to entry the total code on the <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/colab.research.google.com\/drive\/1HK2gSMIfMLmirmVLuXn4kSO9LDhahD2L?usp=sharing\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Colab pocket book<\/a> or the <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/github.com\/harshxmishra\/Semi-Structured-RAG\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">GitHub repository<\/a>.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusion<\/h2>\n<p>Dealing with paperwork with blended textual content and tables is a typical, real-world downside. A easy RAG pipeline isn&#8217;t sufficient typically. By combining clever unstructured information parsing with the multi-vector retriever, we create a way more strong and correct system. This technique ensures that the complicated construction of your paperwork turns into a energy, not a weak spot. It supplies the language mannequin with full context in an easy-to-understand method, main to higher, extra dependable solutions.<\/p>\n<p><em>Learn extra: <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/2023\/10\/rag-pipeline-with-the-llama-index\/\">Construct a RAG Pipeline utilizing Llama Index<\/a><\/em><\/p>\n<h2 class=\"wp-block-heading\" id=\"h-frequently-asked-questions\">Regularly Requested Questions<\/h2>\n<div class=\"schema-faq wp-block-yoast-faq-block\">\n<div class=\"schema-faq-section\" id=\"faq-question-1756292237097\"><strong class=\"schema-faq-question\"><strong>Q1. Can this technique be used for different file sorts like DOCX or HTML?<\/strong><\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. Sure, the Unstructured library helps a variety of file sorts. You&#8217;ll be able to merely swap the partition_pdf perform with the suitable one, like partition_docx.<\/p>\n<\/p><\/div>\n<div class=\"schema-faq-section\" id=\"faq-question-1756292281919\"><strong class=\"schema-faq-question\"><strong><strong>Q2. Is a abstract the one means to make use of the multi-vector retriever?<\/strong><\/strong><\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. No, you may generate hypothetical questions from every chunk or just embed the uncooked textual content if it\u2019s sufficiently small. A abstract is usually the best for complicated tables.<\/p>\n<\/p><\/div>\n<div class=\"schema-faq-section\" id=\"faq-question-1756292316301\"><strong class=\"schema-faq-question\"><strong>Q3. Why not simply embed your entire desk as textual content<\/strong>?<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. Giant tables can create \u201cnoisy\u201d embeddings the place the core which means is misplaced within the particulars. This makes semantic search much less efficient. A concise abstract captures the essence of the desk for higher retrieval.<\/p>\n<\/p><\/div><\/div>\n<div class=\"border-top py-3 author-info my-4\">\n<div class=\"author-card d-flex align-items-center\">\n<div class=\"flex-shrink-0 overflow-hidden\">\n                                    <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/www.analyticsvidhya.com\/blog\/author\/harsh9480979\/\" class=\"text-decoration-none active-avatar\"><br \/>\n                                                                       <img decoding=\"async\" src=\"https:\/\/av-eks-lekhak.s3.amazonaws.com\/media\/lekhak-profile-images\/converted_image_0fBqNLi.webp\" width=\"48\" height=\"48\" alt=\"Harsh Mishra\" loading=\"lazy\" class=\"rounded-circle\"\/><\/p>\n<p>                                <\/a>\n                                <\/div><\/div>\n<p>Harsh Mishra is an AI\/ML Engineer who spends extra time speaking to Giant Language Fashions than precise people. Keen about GenAI, NLP, and making machines smarter (so that they don\u2019t substitute him simply but). When not optimizing fashions, he\u2019s most likely optimizing his espresso consumption. \ud83d\ude80\u2615<\/p>\n<\/p><\/div><\/div>\n<p><h4 class=\"fs-24 text-dark\">Login to proceed studying and luxuriate in expert-curated content material.<\/h4>\n<p>                        <button class=\"btn btn-primary mx-auto d-table\" data-bs-toggle=\"modal\" data-bs-target=\"#loginModal\" id=\"readMoreBtn\">Preserve Studying for Free<\/button>\n                    <\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Have you ever carried out RAG over PDFs, Docs, and Studies? Many essential paperwork aren&#8217;t simply easy textual content. Take into consideration analysis papers, monetary reviews, or product manuals. They usually comprise a mixture of paragraphs, tables, and different structured components. This creates a major problem for normal Retrieval-Augmented Technology (RAG) methods. Efficient RAG on [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":6134,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55],"tags":[157,305,78,1729,5016],"class_list":["post-6132","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-machine-learning","tag-data","tag-developers","tag-guide","tag-rag","tag-semistructured"],"_links":{"self":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/6132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6132"}],"version-history":[{"count":1,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/6132\/revisions"}],"predecessor-version":[{"id":6133,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/6132\/revisions\/6133"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/media\/6134"}],"wp:attachment":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:. Learn more: https://airlift.net. Template: 69d9690a190636c2e0989534. Config Timestamp: 2026-04-10 21:18:02 UTC, Cached Timestamp: 2026-06-21 07:47:11 UTC -->