{"id":783,"date":"2024-07-24T10:29:10","date_gmt":"2024-07-24T01:29:10","guid":{"rendered":"http:\/\/practical.kr\/?p=783"},"modified":"2024-07-24T10:29:10","modified_gmt":"2024-07-24T01:29:10","slug":"llm%ec%9d%b4-%ec%97%ac%eb%9f%ac%eb%b6%84%ec%9d%98-pdf-%eb%ac%b8%ec%a0%9c%eb%a5%bc-%ed%95%b4%ea%b2%b0%ed%95%b4%eb%93%9c%eb%a6%bd%eb%8b%88%eb%8b%a4-ollama-gemma2%ec%99%80-%ed%95%a8%ea%bb%98%ed%95%98","status":"publish","type":"post","link":"http:\/\/practical.kr\/?p=783","title":{"rendered":"LLM\uc774 \uc5ec\ub7ec\ubd84\uc758 PDF \ubb38\uc81c\ub97c \ud574\uacb0\ud574\ub4dc\ub9bd\ub2c8\ub2e4 &#8211; Ollama-Gemma2\uc640 \ud568\uaed8\ud558\ub294 \ud504\ub85c\uc81d\ud2b8 \uc774\uc57c\uae30"},"content":{"rendered":"\n<p>\uc5ec\ub7ec\ubd84, \ud639\uc2dc \ubb38\uc11c \ub354\ubbf8 \uc18d\uc5d0\uc11c \uc911\uc694\ud55c \uc815\ubcf4\ub97c \ucc3e\uc544\uc57c \ud588\ub358 \uc801 \uc788\ub098\uc694? \uc9c1\uc811 \uac80\uc0ac\ud558\uace0, \uc694\uc57d\ud558\ub294 \uc77c\uc774 \uc5bc\ub9c8\ub098 \ud798\ub4e0\uc9c0 \uc798 \uc544\uc2e4 \uac81\ub2c8\ub2e4. \uc624\ub298\uc740 \uc774\ub7f0 \ubb38\uc81c\ub97c Python\uacfc \uba38\uc2e0\ub7ec\ub2dd(LMM)\uc73c\ub85c \ud574\uacb0\ud558\ub294 \ubc29\ubc95\uc744 \ub098\ub220\ubcf4\ub824 \ud569\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\uc758 \ud558\uc774\ub77c\uc774\ud2b8\ub294 <strong>Local \ubaa8\ub378\uc778 Ollama-Gemma2<\/strong>\ub97c \uc0ac\uc6a9\ud558\uc5ec PDF \ub370\uc774\ud130\ub97c RAG(Retrieval-Augmented Generation) \ubaa8\ub378\ub85c \uac80\uc0c9\ud558\uace0 \uc694\uc57d\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">PDF \ub370\uc774\ud130\ub97c SQLite\uc640 PostgreSQL\uc5d0 \uc800\uc7a5\ud558\uae30!<\/h3>\n\n\n\n<p>\uc5ec\ub7ec\ubd84\uc774 \uc54c\uace0 \uacc4\uc154\uc57c \ud560 \uccab \ubc88\uc9f8 \uac1c\ub150\uc740 PDF \ud30c\uc77c\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc120 SQLite\uc640 PostgreSQL\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. PDF \ud30c\uc77c \ub85c\ub4dc<\/h4>\n\n\n\n<p>PyPDFLoader\ub97c \uc0ac\uc6a9\ud558\uc5ec PDF \ud30c\uc77c\uc744 \ub85c\ub4dc\ud569\ub2c8\ub2e4. \uc774 \ub2e8\uacc4\uc5d0\uc11c\ub294 \ud30c\uc77c\uc744 \uc77d\uae30\ub9cc \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain_community.document_loaders import PyPDFLoader\n\ndef load_pdf(file_path):\n    loader = PyPDFLoader(file_path)\n    documents = loader.load()\n    return documents<\/pre>\n\n\n\n<p><code>file_path<\/code>\ub294 \uc77d\uc5b4\ub4e4\uc77c PDF \ud30c\uc77c\uc758 \uacbd\ub85c\ub97c \ub9d0\ud569\ub2c8\ub2e4. <code>documents<\/code>\ub294 PDF\uc758 \ub0b4\uc6a9\uc744 \ub2f4\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. \ud14d\uc2a4\ud2b8 \ubd84\ud560<\/h4>\n\n\n\n<p>\uc774\uc5b4\uc11c, PDF\uc5d0\uc11c \uc5bb\uc740 \ud14d\uc2a4\ud2b8\ub97c \uccad\ud06c\ub85c \ub098\ub215\ub2c8\ub2e4. RecursiveCharacterTextSplitter\ub97c \uc0ac\uc6a9\ud558\uba74 \uc774 \uc791\uc5c5\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain.text_splitter import RecursiveCharacterTextSplitter\n\ndef split_text(documents):\n    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)\n    texts = text_splitter.split_documents(documents)\n    return texts<\/pre>\n\n\n\n<p><code>chunk_size<\/code>\ub294 \uac01 \uccad\ud06c\uc758 \ucd5c\ub300 \ud06c\uae30\ub97c, <code>chunk_overlap<\/code>\uc740 \uccad\ud06c\ub4e4 \uac04\uc758 \uc911\ubcf5 \ubc94\uc704\ub97c \ub73b\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. \ud14d\uc2a4\ud2b8\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\uae30<\/h4>\n\n\n\n<p>\uc800\uc7a5\ud55c \ud14d\uc2a4\ud2b8 \uccad\ud06c\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub123\ub294 \uac83\uc740 \uaf64 \uc911\uc694\ud569\ub2c8\ub2e4. \uc544\ub798\ub294 \uc774\ub97c SQLite\uc5d0 \uc800\uc7a5\ud558\ub294 \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain_community.vectorstores import SQLiteVSS\n\ndef save_to_db(texts, embeddings):\n    vector_store = SQLiteVSS.from_texts(\n        texts=texts,\n        embedding=embeddings,\n        table=\"documents\"\n    )\n    return vector_store<\/pre>\n\n\n\n<p>\uc704 \ucf54\ub4dc\uc5d0\uc11c <code>texts<\/code>\ub294 \uc800\uc7a5\ud558\ub824\ub294 \ud14d\uc2a4\ud2b8, <code>embeddings<\/code>\ub294 \uc784\ubca0\ub529 \ubaa8\ub378\uc774\uba70 \ubaa8\ub4e0 \ud14d\uc2a4\ud2b8 \uccad\ud06c\ub294 &#8216;documents&#8217; \ud14c\uc774\ube14\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c\ubd80\ud130 \uc77d\uc5b4\uc624\uae30<\/h4>\n\n\n\n<p>\uc774\uc81c \uc800\uc7a5\ud55c \ub370\uc774\ud130\ub97c \ub2e4\uc2dc \ubd88\ub7ec\uc624\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubd05\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def load_from_db(embeddings):\n    conn = SQLiteVSS.create_connection(db_file=\"vss.db\")\n    db = SQLiteVSS(table=\"documents\", embedding=embeddings, connection=conn)\n    return db<\/pre>\n\n\n\n<p><code>db_file<\/code>\uc740 SQLite \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud30c\uc77c\uc758 \uc774\ub984\uc785\ub2c8\ub2e4. \uc774\ub294 \ud544\uc694\ud55c \ub370\uc774\ud130\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uac00\uc838\uc624\uae30 \uc704\ud55c \uc5f0\uacb0\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ollama-Gemma2: \ubb38\uc11c \uc694\uc57d\uc758 \ub9c8\ubc95\uc0ac<\/h3>\n\n\n\n<p>\uc774\uc81c Ollama-Gemma2 \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uac80\uc0c9\ud558\uace0 \uc694\uc57d\ud574 \ubd05\uc2dc\ub2e4. \uc774 \ubaa8\ub378\uc740 \uc0ac\uc6a9\uc790\uac00 \uc785\ub825\ud55c \ucffc\ub9ac\uc5d0 \ub300\ud574 \ubb38\uc11c\ub97c \uc774\ud574\ud558\uace0 \uc694\uc57d\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. \uc784\ubca0\ub529 \uc0dd\uc131<\/h4>\n\n\n\n<p>\uc704\uc5d0\uc11c \uc0ac\uc6a9\ud55c \ud14d\uc2a4\ud2b8 \uccad\ud06c\ub97c \uc704\ud55c \uc784\ubca0\ub529\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc774 \uc784\ubca0\ub529\uc740 \ud14d\uc2a4\ud2b8\ub97c \uc22b\uc790 \ubca1\ud130\ub85c \ubcc0\ud658\ud558\uc5ec \ud6a8\uc728\uc801\uc73c\ub85c \uac80\uc0c9\ud558\ub294 \ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain_community.embeddings import HuggingFaceEmbeddings\n\nembeddings = HuggingFaceEmbeddings(model_name=\"sentence-transformers\/all-MiniLM-L6-v2\")<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2. \uac80\uc0c9 \ubc0f \uc694\uc57d<\/h4>\n\n\n\n<p>Ollama-Gemma2 \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud558\uc5ec \ubca1\ud130 \uc800\uc7a5\uc18c\uc5d0\uc11c \uac00\uc7a5 \uc720\uc0ac\ud55c \ud14d\uc2a4\ud2b8 \uccad\ud06c\ub97c \uac80\uc0c9\ud558\uace0 \uc774\ub97c \uc694\uc57d\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain.chains import RetrievalQA\nfrom langchain_community.llms import Ollama\n\ndef query_to_db(query, vector_store, llm, chain_type):\n    retriever = vector_store.as_retriever(search_type=\"similarity\", search_kwargs={\"k\": 2})\n    qa = RetrievalQA.from_chain_type(llm=llm, chain_type=chain_type, retriever=retriever)\n    response = qa.invoke(query)\n    return response<\/pre>\n\n\n\n<p><code>query<\/code>\ub294 \uc0ac\uc6a9\uc790\uac00 \uc785\ub825\ud558\ub294 \uc9c8\ubb38\uc785\ub2c8\ub2e4. <code>vector_store<\/code>\ub294 \ud14d\uc2a4\ud2b8 \uccad\ud06c\uac00 \uc800\uc7a5\ub41c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0\uc744, <code>llm<\/code>\uc740 Ollama-Gemma2 \ubaa8\ub378\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c <code>chain_type<\/code>\uc740 \uac80\uc0c9 \ubc29\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc608\uc81c: \ubb38\uc11c\ub97c \ud55c\uae00\ub85c \uc694\uc57d\ud558\uae30<\/h3>\n\n\n\n<p>\ud504\ub85c\uc81d\ud2b8\uc758 \uc9c4\uc9dc \uc7ac\ubbf8\ub294 \ub370\uc774\ud130\ub97c \uc785\ub825\ud558\uace0 \uc694\uc57d \uacb0\uacfc\ub97c \ud655\uc778\ud558\ub294 \uc21c\uac04\uc785\ub2c8\ub2e4. \uc608\uc81c\ub97c \ud1b5\ud574 \ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub97c \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if __name__ == \"__main__\":\n    # \ub370\uc774\ud130 \ubd88\ub7ec\uc624\uae30\n    texts = load_pdf_process(\"example.pdf\") \n    embeddings = HuggingFaceEmbeddings(model_name=\"sentence-transformers\/all-MiniLM-L6-v2\")\n    vector_store = load_from_db(embeddings)\n\n    # Ollama-Gemma2 \ubaa8\ub378 \uc0dd\uc131\n    ollama_model = Ollama(model=\"gemma2\")\n\n    # \ucffc\ub9ac \uc218\ud589\n    query = \"\ubb38\uc11c\ub97c \ud55c\uae00\ub85c \uc694\uc57d\ud574\uc8fc\uc138\uc694.\"\n    response = query_to_db(query, vector_store, ollama_model, \"stuff\")\n    print(response)<\/pre>\n\n\n\n<p>\uc704\uc758 \ucf54\ub4dc\ub294 PDF \ud30c\uc77c\uc744 \ub85c\ub4dc\ud558\uace0, \uccad\ud06c\ub85c \ubd84\ud560\ud558\uace0, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\uba70, Ollama-Gemma2 \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud574 \uc694\uc57d \uacb0\uacfc\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc804\uccb4 \ucf54\ub4dc\ub294 \uc544\ub798 \ub9c1\ud06c\uc5d0\uc11c \ucc38\uc870 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><a href=\"https:\/\/github.com\/bipark\/Ollama-Gemma2-PDF-RAG\">https:\/\/github.com\/bipark\/Ollama-Gemma2-PDF-RAG<\/a><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ub9c8\ubb34\ub9ac<\/h3>\n\n\n\n<p>\uc774\ubc88 \ud504\ub85c\uc81d\ud2b8\ub97c \ud1b5\ud574 PDF \ud30c\uc77c\uc744 \uc77d\uace0, \uccad\ud06c\ub85c \ub098\ub204\uba70, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud55c \ud6c4, \uc774\ub97c LLM \ubaa8\ub378\ub85c \ubd84\uc11d\ud558\uace0 \uc694\uc57d\ud558\ub294 \ub2e4\uc591\ud55c \uacfc\uc815\uc744 \uc54c\uc544\ubd24\uc2b5\ub2c8\ub2e4. Ollama-Gemma2 \ubaa8\ub378\uc740 \uc624\ub298\ub0a0\uc758 \ubb38\uc11c \ubd84\uc11d \ubc0f \uc694\uc57d \uc791\uc5c5\uc744 \ud55c\uce35 \ub354 \ud6a8\uc728\uc801\uc774\uace0 \uc27d\uac8c \ub9cc\ub4e4\uc5b4\uc90d\ub2c8\ub2e4. \uc5ec\ub7ec\ubd84\ub3c4 \uc774 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\uc5ec \ubb38\uc11c \ub354\ubbf8 \uc18d\uc5d0\uc11c \uc911\uc694\ud55c \uc815\ubcf4\ub97c \ube60\ub974\uace0 \uc27d\uac8c \ucc3e\uc544 \ubcf4\uc138\uc694!<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\uc774 \uae00\uc740 Github \ubb38\uc11c\ub97c \ud1a0\ub300\ub85c \uc81c\ubaa9\ubd80\ud130 \ubaa8\ub450  AI\uac00 \uc791\uc131 \ud588\uc2b5\ub2c8\ub2e4. <\/p>\n<cite>\ubb34\uc11c\uc6b4 \uc138\uc0c1\uc785\ub2c8\ub2e4. \uc774\uac74 \uc81c\uac00 \uc37c\uc2b5\ub2c8\ub2e4. ^^;<\/cite><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\uc5ec\ub7ec\ubd84, \ud639\uc2dc \ubb38\uc11c \ub354\ubbf8 \uc18d\uc5d0\uc11c \uc911\uc694\ud55c \uc815\ubcf4\ub97c \ucc3e\uc544\uc57c \ud588\ub358 \uc801 \uc788\ub098\uc694? \uc9c1\uc811 \uac80\uc0ac\ud558\uace0, \uc694\uc57d\ud558\ub294 \uc77c\uc774 \uc5bc\ub9c8\ub098 \ud798\ub4e0\uc9c0 \uc798 \uc544\uc2e4 \uac81\ub2c8\ub2e4. \uc624\ub298\uc740 \uc774\ub7f0 \ubb38\uc81c\ub97c Python\uacfc \uba38\uc2e0\ub7ec\ub2dd(LMM)\uc73c\ub85c \ud574\uacb0\ud558\ub294 \ubc29\ubc95\uc744 \ub098\ub220\ubcf4\ub824 \ud569\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\uc758 \ud558\uc774\ub77c\uc774\ud2b8\ub294 Local \ubaa8\ub378\uc778 Ollama-Gemma2\ub97c \uc0ac\uc6a9\ud558\uc5ec PDF \ub370\uc774\ud130\ub97c RAG(Retrieval-Augmented Generation) \ubaa8\ub378\ub85c \uac80\uc0c9\ud558\uace0 \uc694\uc57d\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. PDF \ub370\uc774\ud130\ub97c SQLite\uc640 PostgreSQL\uc5d0 \uc800\uc7a5\ud558\uae30! \uc5ec\ub7ec\ubd84\uc774 \uc54c\uace0 \uacc4\uc154\uc57c \ud560 \uccab \ubc88\uc9f8 \uac1c\ub150\uc740<\/p>\n<div class=\"more-link\">\n\t\t\t\t <a href=\"http:\/\/practical.kr\/?p=783\" class=\"link-btn theme-btn\"><span>Read More <\/span> <i class=\"fa fa-caret-right\"><\/i><\/a>\n\t\t\t<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[38,97],"tags":[],"class_list":["post-783","post","type-post","status-publish","format-standard","hentry","category-ai","category-mml"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=783"}],"version-history":[{"count":2,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/783\/revisions"}],"predecessor-version":[{"id":785,"href":"http:\/\/practical.kr\/index.php?rest_route=\/wp\/v2\/posts\/783\/revisions\/785"}],"wp:attachment":[{"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=783"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/practical.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}