{
    "componentChunkName": "component---src-templates-post-tsx",
    "path": "/elastic-search/",
    "result": {"data":{"logo":null,"markdownRemark":{"html":"<h1>Elastic Search logstash - Nori 토크나이저 설정</h1>\n<img src=\"https://github.com/user-attachments/assets/eba59a7d-2ecf-4f47-a15d-e8082a9586e7\" width=\"550\">\n<p>이번에 회사에서 검색 기능을 구현하면서 Elastic Search를 다루게 됐다. 이 엔진을 다루면서 삽질을 많이 했는데, 다음에는 하지 않도록 기록용으로 남겨둔다.</p>\n<h2>Elastic Search란?</h2>\n<p>간단히 말하면, 가장 널리 쓰이는 검색 엔진 중 하나이다. 검색 대상이 되는 문서들을 저장하고, 주기마다 인덱싱해고, 검색 쿼리를 날렸을때 사용자가 지정한 토크나이저 등을 이용해서 검색 결과를 반환해주는 엔진이다.</p>\n<h2>Nori 토크나이저</h2>\n<p>Elasticsearch(이하 ES)는 세계적으로 쓰이는 엔진이므로 당연하게도 한국어에 특화되어 있지 않다. 한국어처럼 특이한 형태소 구조를 가진 언어의 경우, 검색 효율을 높이기 위해 특수한 토크나이저가 필요한데, 많이 쓰이는 토크나이저가 Nori 토크나이저다. (Mecab 기반의 형태소 분석기인데, 이 부분은 생략)</p>\n<p>예를 들면 ES에서 기본적으로 제공하는 토크나이저로는 ‘주웠어’를 검색한다고 하면, 검색 대상 문서에 ‘주웠다’가 있다고 해도 검색에 걸리지를 않는다. 하지만 Nori 토크나이저로 ‘주웠어’와 ‘주웠다’를 형태소 분리하게 되면 아래와 같이 동일하게 분리되므로, ‘주웠어’라고 검색해도 ‘주웠다’가 포함된 문서가 검색에 걸리게 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{  \n  “tokens” : [  \n    {  \n      “token” : “주웠“,  \n    },  \n    {  \n      “token” : “줍”,  \n    }  \n  ]  \n}</code></pre></div>\n<p>위 결과를 보면 유추할 수 있듯이, ‘주웠어’를 토큰화하면 ‘주웠’ 뿐만 아니라 ‘줍’도 포함되기 때문에 ‘줍다’를 검색해도 ES의 검색에 걸리게 된다!</p>\n<p><img src=\"https://github.com/user-attachments/assets/554d9533-7f72-4cf3-b463-57445bd8222e\" width=\"400\">.</p>\n<h2>Logstash</h2>\n<p>Logstash는 ELK(Elasticsearch, Logstash, Kibana)의 구성요소 중 <strong>L</strong> 에 해당하는데, 쉽게 보면 Elasticsearch를 사용하는데 필요한 툴킷이다. 데이터 파이프라인의 중간 역할을 수행한다고 보면 되는데, 데이터 인덱싱, 필터링, 저장하는 역할을 수행한다.</p>\n<p>Logstash에 특정 인덱스에 Nori 토크나이저를 적용하려면 아래와 같은 <code class=\"language-text\">curl</code> 문을 실행해주면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">curl -X PUT \"http://localhost:9200/target_index\" -H 'Content-Type: application/json' -d'\n{\n  \"settings\": {\n    \"analysis\": {\n      \"filter\": {\n        \"lowercase_filter\": {\n          \"type\": \"lowercase\"\n        },\n        \"nori_part_of_speech_filter\": {\n          \"type\": \"nori_part_of_speech\",\n          \"stoptags\": [\"E\",\"J\"]  // 원하는 stoptags 값으로 변경\n        }\n      },\n      \"analyzer\": {\n        \"my_analyzer\": {\n          \"type\": \"custom\",\n          \"tokenizer\": \"nori_tokenizer\",\n          \"filter\": [\"lowercase_filter\", \"nori_part_of_speech_filter\"]\n        }\n      },\n      \"tokenizer\": {\n        \"nori_tokenizer\": {\n          \"type\": \"nori_tokenizer\",\n          \"decompound_mode\": \"mixed\"\n        }\n      }\n    },\n    \"number_of_shards\": 1,\n    \"number_of_replicas\": 1\n  },\n  \"mappings\": {\n    \"properties\": {\n      \"{TARGET_COLUMN}\": {\n        \"type\": \"text\",\n        \"analyzer\": \"my_analyzer\"\n      }\n    }\n  }\n}\n'</code></pre></div>\n<p>그리고 적용을 원하는 index에 해당하는 설정을 <code class=\"language-text\">logstash/pipeline/{TARGET_INDEX}.conf</code> 를 작성해주면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">input {\n\tjdbc {\n\t\tjdbc_driver_library => \"/usr/share/logstash/logstash-core/lib/jars/postgresql.jar\" \n\t\tjdbc_driver_class => \"org.postgresql.Driver\"\n\t\tjdbc_connection_string => \"${DB_URL}\" \n\t\tjdbc_user => \"${DB_USER}\"\n\t\tjdbc_password => \"${DB_PASSWORD}\"\n\t\tschedule => \"*/10 * * * *\"\n\t\tstatement => 'SELECT id, {TARGET_COLUMN} FROM {TABLE_NAME}'. # 검색 대상 가져오는 \n\t}\n}\noutput {\n\telasticsearch { \n\t\thosts => [\"http://elasticsearch:9200\"]\n\t\tindex => \"target_index\"\n\t\tdocument_id => \"%{id}\"\n\t\tdoc_as_upsert => true\n\t}\n}</code></pre></div>","htmlAst":{"type":"root","children":[{"type":"element","tagName":"h1","properties":{},"children":[{"type":"text","value":"Elastic Search logstash - Nori 토크나이저 설정"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://github.com/user-attachments/assets/eba59a7d-2ecf-4f47-a15d-e8082a9586e7","width":550},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"이번에 회사에서 검색 기능을 구현하면서 Elastic Search를 다루게 됐다. 이 엔진을 다루면서 삽질을 많이 했는데, 다음에는 하지 않도록 기록용으로 남겨둔다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Elastic Search란?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"간단히 말하면, 가장 널리 쓰이는 검색 엔진 중 하나이다. 검색 대상이 되는 문서들을 저장하고, 주기마다 인덱싱해고, 검색 쿼리를 날렸을때 사용자가 지정한 토크나이저 등을 이용해서 검색 결과를 반환해주는 엔진이다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Nori 토크나이저"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Elasticsearch(이하 ES)는 세계적으로 쓰이는 엔진이므로 당연하게도 한국어에 특화되어 있지 않다. 한국어처럼 특이한 형태소 구조를 가진 언어의 경우, 검색 효율을 높이기 위해 특수한 토크나이저가 필요한데, 많이 쓰이는 토크나이저가 Nori 토크나이저다. (Mecab 기반의 형태소 분석기인데, 이 부분은 생략)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"예를 들면 ES에서 기본적으로 제공하는 토크나이저로는 ‘주웠어’를 검색한다고 하면, 검색 대상 문서에 ‘주웠다’가 있다고 해도 검색에 걸리지를 않는다. 하지만 Nori 토크나이저로 ‘주웠어’와 ‘주웠다’를 형태소 분리하게 되면 아래와 같이 동일하게 분리되므로, ‘주웠어’라고 검색해도 ‘주웠다’가 포함된 문서가 검색에 걸리게 된다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{  \n  “tokens” : [  \n    {  \n      “token” : “주웠“,  \n    },  \n    {  \n      “token” : “줍”,  \n    }  \n  ]  \n}"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"위 결과를 보면 유추할 수 있듯이, ‘주웠어’를 토큰화하면 ‘주웠’ 뿐만 아니라 ‘줍’도 포함되기 때문에 ‘줍다’를 검색해도 ES의 검색에 걸리게 된다!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://github.com/user-attachments/assets/554d9533-7f72-4cf3-b463-57445bd8222e","width":400},"children":[]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{},"children":[{"type":"text","value":"Logstash"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Logstash는 ELK(Elasticsearch, Logstash, Kibana)의 구성요소 중 "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"L"}]},{"type":"text","value":" 에 해당하는데, 쉽게 보면 Elasticsearch를 사용하는데 필요한 툴킷이다. 데이터 파이프라인의 중간 역할을 수행한다고 보면 되는데, 데이터 인덱싱, 필터링, 저장하는 역할을 수행한다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Logstash에 특정 인덱스에 Nori 토크나이저를 적용하려면 아래와 같은 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"curl"}]},{"type":"text","value":" 문을 실행해주면 된다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"curl -X PUT \"http://localhost:9200/target_index\" -H 'Content-Type: application/json' -d'\n{\n  \"settings\": {\n    \"analysis\": {\n      \"filter\": {\n        \"lowercase_filter\": {\n          \"type\": \"lowercase\"\n        },\n        \"nori_part_of_speech_filter\": {\n          \"type\": \"nori_part_of_speech\",\n          \"stoptags\": [\"E\",\"J\"]  // 원하는 stoptags 값으로 변경\n        }\n      },\n      \"analyzer\": {\n        \"my_analyzer\": {\n          \"type\": \"custom\",\n          \"tokenizer\": \"nori_tokenizer\",\n          \"filter\": [\"lowercase_filter\", \"nori_part_of_speech_filter\"]\n        }\n      },\n      \"tokenizer\": {\n        \"nori_tokenizer\": {\n          \"type\": \"nori_tokenizer\",\n          \"decompound_mode\": \"mixed\"\n        }\n      }\n    },\n    \"number_of_shards\": 1,\n    \"number_of_replicas\": 1\n  },\n  \"mappings\": {\n    \"properties\": {\n      \"{TARGET_COLUMN}\": {\n        \"type\": \"text\",\n        \"analyzer\": \"my_analyzer\"\n      }\n    }\n  }\n}\n'"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"그리고 적용을 원하는 index에 해당하는 설정을 "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"logstash/pipeline/{TARGET_INDEX}.conf"}]},{"type":"text","value":" 를 작성해주면 된다."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input {\n\tjdbc {\n\t\tjdbc_driver_library => \"/usr/share/logstash/logstash-core/lib/jars/postgresql.jar\" \n\t\tjdbc_driver_class => \"org.postgresql.Driver\"\n\t\tjdbc_connection_string => \"${DB_URL}\" \n\t\tjdbc_user => \"${DB_USER}\"\n\t\tjdbc_password => \"${DB_PASSWORD}\"\n\t\tschedule => \"*/10 * * * *\"\n\t\tstatement => 'SELECT id, {TARGET_COLUMN} FROM {TABLE_NAME}'. # 검색 대상 가져오는 \n\t}\n}\noutput {\n\telasticsearch { \n\t\thosts => [\"http://elasticsearch:9200\"]\n\t\tindex => \"target_index\"\n\t\tdocument_id => \"%{id}\"\n\t\tdoc_as_upsert => true\n\t}\n}"}]}]}]}],"data":{"quirksMode":false}},"excerpt":"Elastic Search logstash - Nori 토크나이저 설정 이번에 회사에서 검색 기능을 구현하면서 Elastic Search를 다루게 됐다. 이 엔진을 다루면서 삽질을 많이 했는데, 다음에는 하지 않도록 기록용으로 남겨둔다. Elastic…","fields":{"readingTime":{"text":"4 min read"}},"frontmatter":{"title":"[ELK] Elastic Search logstash - Nori 토크나이저 설정","userDate":"24 August 2024","date":"2024-08-24T10:00:00.000Z","tags":["toolkit","web","chatgpt"],"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/a212cca5adc07a10c064f5aa2d19cb90/c4c9c/logstash.jpg","srcSet":"/static/a212cca5adc07a10c064f5aa2d19cb90/c4c9c/logstash.jpg 512w","sizes":"100vw"},"sources":[{"srcSet":"/static/a212cca5adc07a10c064f5aa2d19cb90/023c4/logstash.webp 512w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6328125}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"children":[{"gatsbyImageData":{"layout":"fullWidth","backgroundColor":"#282838","images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/0d6f4/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/248f9/soohwan.png 40w,\n/static/a9e6b445142b247ee4cfa66155398bb2/fd435/soohwan.png 80w,\n/static/a9e6b445142b247ee4cfa66155398bb2/0d6f4/soohwan.png 120w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/e7f45/soohwan.webp 40w,\n/static/a9e6b445142b247ee4cfa66155398bb2/589ec/soohwan.webp 80w,\n/static/a9e6b445142b247ee4cfa66155398bb2/71a38/soohwan.webp 120w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6833333333333333}}]}}]}},"relatedPosts":{"totalCount":25,"edges":[{"node":{"id":"f2a32d9d-b206-5141-8c2d-5440e19caf65","excerpt":"llama.cpp (On device llm inference tool) 최근에 llama.cpp를 사용해봤는데, 상당히 편리하고 미래에 더 많이 쓰일 툴이라는 생각이 들어서 기록해둔다! llama.cpp란? 대표적인 오픈소스 LLM인 Meta…","frontmatter":{"title":"llama.cpp (On device llm inference tool)","date":"2024-09-07T10:00:00.000Z"},"fields":{"readingTime":{"text":"7 min read"},"slug":"/llama-cpp/"}}},{"node":{"id":"fa28b462-1fe2-5d0f-932b-f28e32f1da18","excerpt":"Elastic Search logstash - Nori 토크나이저 설정 이번에 회사에서 검색 기능을 구현하면서 Elastic Search를 다루게 됐다. 이 엔진을 다루면서 삽질을 많이 했는데, 다음에는 하지 않도록 기록용으로 남겨둔다. Elastic…","frontmatter":{"title":"[ELK] Elastic Search logstash - Nori 토크나이저 설정","date":"2024-08-24T10:00:00.000Z"},"fields":{"readingTime":{"text":"4 min read"},"slug":"/elastic-search/"}}},{"node":{"id":"d1f4a9ee-591d-5e95-a930-a1bf17701b0e","excerpt":"단 30줄로 ChatGPT 웹페이지 만들기 (Streamlit chat_message) Streamlit은 파이썬 기반의 오픈소스 웹 UI 라이브러리입니다. 매우 간단한 코드로 손쉽게 웹페이지를 띄울 수 있어서 간단한 데모나 PoC…","frontmatter":{"title":"단 30줄로 ChatGPT 웹페이지 만들기 (Streamlit chat_message)","date":"2024-05-01T10:00:00.000Z"},"fields":{"readingTime":{"text":"9 min read"},"slug":"/streamlit-chatgpt/"}}},{"node":{"id":"4e37b604-dce8-5e09-85e8-337d4f03f0cb","excerpt":"Terabyte(TB) 단위 데이터 셔플링 - terashuf 리눅스에서 TB 단위의 데이터를 line 기준으로 셔플링이 필요할 때가 (가끔) 있다. 직접 코딩해서 쓰기에는 메모리, 속도 등을 신경써야해서 생각보다 큰 작업인데, terashuf…","frontmatter":{"title":"Terabyte(TB) 단위 데이터 셔플링 - terashuf","date":"2024-03-20T10:00:00.000Z"},"fields":{"readingTime":{"text":"1 min read"},"slug":"/terashuf/"}}},{"node":{"id":"ec8327c3-3c4d-51da-9440-8cb74fd1effe","excerpt":"tmux - conf Tmux 설정을 위한 tmux configuraion 기록","frontmatter":{"title":"tmux - conf","date":"2024-02-15T10:00:00.000Z"},"fields":{"readingTime":{"text":"2 min read"},"slug":"/tmux-conf/"}}}]}},"pageContext":{"slug":"/elastic-search/","prev":{"excerpt":"AI Joker 공개 이번에 회사에서 작업한 A.I. Joker 모델을 공개했습니다! Joker 모델은 한국어 Hate Speech를 생성하는 모델입니다. 최근 많은 LLM들이 나오고 있는 만큼 해당 모델들의 Safety…","frontmatter":{"title":"AI Joker 공개","tags":["record"],"date":"2024-07-10T10:00:00.000Z","draft":false,"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEMElEQVQ4y22U209UVxTG/Rua9sE0jS9Nrb1YRa1QTaOlSAEtYIqId4R2sLQNF40MAgMyBChVZBBLqohFyk1BGLnOOcPIcFOQuZ+5MJC+tLa2aUx5M2nza8454zCmPqzsk733+s73rf2ttUZymnHbTeFw2QR1tQu4bSb87nG8bhHJJeL3WJQzp20Mt0O955FXRyjfYWKNuqGGy27C57EoyYvee/h9FmbuG3HMCbjmRaamBvB6LQR9E8odn2dcyZGBXPYxJVRAu7rh94wzaGzDYr6NIHSR930uiWVJZOtPotFnEX8ugRyDhsHRdqatd7jTex2v26zkPmO5RnKqzOTNgNeCKHRzsVZPbHocm09Fs+tsEruqY9n93R52FyWyOTeGmP27qdFXMDzUjl9aZalIlpyi8uFxCjhsY3gWRGrqdcTXJFJzrRqHMMq3P9RQcaUSu2mYS1friKtKoLS2CNe8GdvDkTBYCFBQirwcsNLUVEt5lZZTjdmkVR3mz6CHFVMbrPwOT5+wMnqDlSUnR/Unybx4DH1dKRcuVLIUsIYeKix5TCmwMNrF4a8y2Jq1nayibPrNt0g6m8Zi0Mlvvy6SWnyI68YW8nUFbDrxPqma/Qwaf8QvWdQ62sOS1Tou+6bQN5aw48sPySvN51JDPVHbdtDQaKCjs42Nm6LRlZdTVKFle9YOCqvzCLgnQi6RLSTbRmZoG1OscKe/laiEaFLS0tGeLmUyaOVMVzH//vM38JSyngqGpGF02nLSDx3hrdgttLU3seSbwGl/JtklKuxkwIH+G6QkpxK3Zx/f5BUSMPXx5A+JoaEBBvp7efxY4pf7I+TnFfBpajpxH39Cd2czizLgag1VyTJTGdws3OJA2gE+iE1kuvky5/cmU1+Qz5XCQspSUpluqCM+OY34+AQG797E4xLDjaF2Ssg2ckihQ0NDNS+9vI4+Yx9Ww0V0x7Mp/1yDUadl0mrilbVvUKErVmwmRRo7kqEcMuDcrBHTaDcazResf2crPvssf3W38qjFwCPfPFtidnHwYAadHVd5MHtXUfYCYwvhDbmVgoFpfmpv5ujRTDKOZWOdm8TmW+CEJpf0g8e5fs2A7eEYAeleeChEAJqf+4PbKTA3O8TU/SEyczLQlZTx2usbWbvuTbRnzpGVcwSztZeFByPPEQkDrlJWZcvP/7N/mhJDMR99to3eDe9SWXiagoJC+t5+j737ovi6roBlaRJXxNhy2SM6JUzbLiiz78HMXQyNVfT0tlK/fgPamJ3kRO/k/Kvr6O24Sl19JRbxltIhL2AorkoOMXXaVF963eN09rTQ02Kg/XIt3bdbmZ8bYTkwhWNhVHmQ/wFKkYAh2R6HqE5sh0jQb2VxcYpgcIagz4pHqbl6x21fHcyrE9tlUR7CJYM5I0NUkx2hXpcjdKaskZNermGI4X9XYrZBL2fr5QAAAABJRU5ErkJggg=="},"images":{"fallback":{"src":"/static/10b0ae51490d8aac906d05f57899f25a/b5658/joker.png","srcSet":"/static/10b0ae51490d8aac906d05f57899f25a/f054e/joker.png 750w,\n/static/10b0ae51490d8aac906d05f57899f25a/b5658/joker.png 1024w","sizes":"100vw"},"sources":[{"srcSet":"/static/10b0ae51490d8aac906d05f57899f25a/4f03f/joker.webp 750w,\n/static/10b0ae51490d8aac906d05f57899f25a/67ded/joker.webp 1024w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":1}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADjElEQVQ4y23Oy48TdQDA8TExEaTttvSBfdHddru7bWc6bWd+8+i0u23n0SdlBRQXZGHDgiiLDwgqXjCIJEaC8cLBmHgwUU9EYzRqQuLJi/4NJB6NF+8evgbOHr7XT76SM5ix7s4QnRHnnm9yZzvBTIswN8JcP5bC67ZoWi7CdtFsn5bloZo+dSNAMYbIIqCmD6mJIVXdR3J6I7r9IQ3T59pZlW+uxzndCbPdC/HZXoq3TikowsfqBOjOmFZ7SrM9p2kfRbXn1O0jKNbsSbJ5BMnu9Gl3+qiiz4OPSvz0QRLHFGwOZH6+neLHT5YRbRerM0J0JrTas/8FZXNKzZgg2es+ZtvDdbs8+iHJl+9lWVP7OG2br26k+PvXJCfmFqoYIpwhTXtMwxpTN0coxhjFmCKbE2rGmKoYPQY9qi2fyzsq//4e5sNXi5TlLqbd5t6lPH/9kuDTG2usqgGi7dO0hzSsIXUzQDaGKGKMLEZUxZCKCJB02+PUpMH9vQwP7ybYnSxyfNrjwumA3dEiD94v8cfnK7xzWsbpujQtH9X0qBs+iuEjC5+a7lPVPSqai9SyelyYFbjkh5hqC3TkKOutLON2nkYpgtuMcT6IszdPslo8SLlcpmUH1A0XRQyQhUtNuFQ1l4o2QFI1h3OTVXbcg+grIfSVBRqlEGopgrYSRi0e4KiIse1mScSeopA/iLADmoZL3Rgg631q+oCq1qeq95FOzhQefpzn7eMpBmqcoBVj04pzwkky0eNMRYIdL8F3twusLe2nslrE6g5pGX1U8/FhD1nvUW1tUJK7SH9+n+DR1zF2vQSvH0lz88wiV45V2J1WuHqsxLXNAnuzNJdfWmK5/BylUgFhb6DZAxR9g7rpIos+Wttja2uE9M9vYb69k+DqfJErWzLOuoVqdKlpDo4jODms4zlFckuHObx4iHwuRi6fYqmYY201x/LqMrnFDNl8gRvvukhNdT9394rcOlNFMxrUhYFmW9imTEsp0mhWKC2nWSokyWSiFA7HSKcXiEb34fayyLVniUQk8rmn2drKIqlqiNcuVrh2ymQS1Nh8sc/GoMEbl7u8eb5D1yqTzkRJJsOkkiGymQVShyLE4yHWKnEq1RjpTIhmI8r2y3mkyloI38uha1n6bpVXrkw5+4LD/S/2uHnrIopaJhZ9hmQqwqHkAXJP8BDhyD46ZoWdMxOGcx/PNfECk/8AbxXdRjRliPoAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/34f77/soohwan.png 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/a94f6/soohwan.png 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png 1148w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/38420/soohwan.webp 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7470d/soohwan.webp 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/b5ef6/soohwan.webp 1148w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6829268292682927}}}}]},"fields":{"readingTime":{"text":"2 min read"},"layout":"","slug":"/joker/"}},"next":{"excerpt":"llama.cpp (On device llm inference tool) 최근에 llama.cpp를 사용해봤는데, 상당히 편리하고 미래에 더 많이 쓰일 툴이라는 생각이 들어서 기록해둔다! llama.cpp란? 대표적인 오픈소스 LLM인 Meta…","frontmatter":{"title":"llama.cpp (On device llm inference tool)","tags":["toolkit","llama","parallelism","ondevice"],"date":"2024-09-07T10:00:00.000Z","draft":null,"excerpt":null,"image":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAADF0lEQVQ4y41Ua0hTYRjeL0EkCIkh/dCRzLSyUOkGeUurYUPFgYGIXYRsNm/QbJKaGtJIrdSm5jQvZExsqc2h5SWtJBem5pXNW868hJYZmG5ue2JnncNkszxwzvd97/t+z/e8z/t+hwYABuNrMH4BvV4P8iFt1tY6nY6ymdtpsAK2ubkJqVQKrVZLbSB9o2Nj6O7u3haUZu0UDoeDUrF4Cxtys0ajQUhICOrr66nDzUnRyAnpSObz4evnT4HNzs5S8+npaWL80NMDBwcHLC0tWchEMzeo1WrY2Nig8aWMWIvFYoKtUqkk0mSz2ejo6CB8h9zdERMTQ2WwhSHJrqKiAjQaDUqViliXlpYiLIyD4eERtLW2g8ViQS6XEz5j2nQ63VJDc0CJREIA1ksbTTJotZhfnKPSGR8fN+m4oQXDkQE3twPWi0IK3j8wQAAedHbH8vwKYZsb/YHBlgkMtU5SwOk3soi4a1yu9ZTN2+JKdDQRLH5UiX7FCFKCssHZHwXeSQFqRQ1QKWewZxcdtna2mJycsl4U87Ibx7i4ePgG+MOD4QmmPRP7XJzhRGfgCN0TPn5+CDx3FgrFR4tetGhs0vlFrcbpgEAcP3oMvMgEKPoGkS8shreXD5guTJRXVO28sXWbpqDerj6kXsyC8M59ODKcwL3OgzAxH2XZVZRE5D6Lq7eVpUmPlsp3KEqowdTcN4hKyvBpZBRtEgXuXRJjfUNj9a5vATSJawpYnP8O/vlsPC9swtzPVTwuq8Tg+BQGe1VI8E2DrNrU3Hqd3gLUKuDC12XcvpCLwiQROl93QlxQgleyZtSJapHMykRzTdfOAKm/jsGAp6nVuBUiQAYvE08eFuNBeg5SwgXIjRBi4vMMBfjPlEnAtV9rqE0qQFowH6dcgkDf7QrXvScQe4aHooh0DLX37pwhGaCUv4UoKgNsr3DY2zFx2MkbaaF8tN8tx++V1Z0VhQj62/WrC0uQJRcgLzIVQR6hSAqKhYQrxFDDGyruv4DmV7Cv6T2eXc1GbWIebgYnQnQ5Ey/ic1AnKMb62sa2DP8Aa3laMz94KroAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/4e87fa63ace7633b9f27aff5cbd7d283/ccc41/llama-cpp.png","srcSet":"/static/4e87fa63ace7633b9f27aff5cbd7d283/ccc41/llama-cpp.png 512w","sizes":"100vw"},"sources":[{"srcSet":"/static/4e87fa63ace7633b9f27aff5cbd7d283/d689f/llama-cpp.webp 512w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":1}}},"author":[{"id":"Soohwan Kim","bio":"Co-founder/A.I. engineer at TUNiB.","avatar":{"childImageSharp":{"gatsbyImageData":{"layout":"fullWidth","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADjElEQVQ4y23Oy48TdQDA8TExEaTttvSBfdHddru7bWc6bWd+8+i0u23n0SdlBRQXZGHDgiiLDwgqXjCIJEaC8cLBmHgwUU9EYzRqQuLJi/4NJB6NF+8evgbOHr7XT76SM5ix7s4QnRHnnm9yZzvBTIswN8JcP5bC67ZoWi7CdtFsn5bloZo+dSNAMYbIIqCmD6mJIVXdR3J6I7r9IQ3T59pZlW+uxzndCbPdC/HZXoq3TikowsfqBOjOmFZ7SrM9p2kfRbXn1O0jKNbsSbJ5BMnu9Gl3+qiiz4OPSvz0QRLHFGwOZH6+neLHT5YRbRerM0J0JrTas/8FZXNKzZgg2es+ZtvDdbs8+iHJl+9lWVP7OG2br26k+PvXJCfmFqoYIpwhTXtMwxpTN0coxhjFmCKbE2rGmKoYPQY9qi2fyzsq//4e5sNXi5TlLqbd5t6lPH/9kuDTG2usqgGi7dO0hzSsIXUzQDaGKGKMLEZUxZCKCJB02+PUpMH9vQwP7ybYnSxyfNrjwumA3dEiD94v8cfnK7xzWsbpujQtH9X0qBs+iuEjC5+a7lPVPSqai9SyelyYFbjkh5hqC3TkKOutLON2nkYpgtuMcT6IszdPslo8SLlcpmUH1A0XRQyQhUtNuFQ1l4o2QFI1h3OTVXbcg+grIfSVBRqlEGopgrYSRi0e4KiIse1mScSeopA/iLADmoZL3Rgg631q+oCq1qeq95FOzhQefpzn7eMpBmqcoBVj04pzwkky0eNMRYIdL8F3twusLe2nslrE6g5pGX1U8/FhD1nvUW1tUJK7SH9+n+DR1zF2vQSvH0lz88wiV45V2J1WuHqsxLXNAnuzNJdfWmK5/BylUgFhb6DZAxR9g7rpIos+Wttja2uE9M9vYb69k+DqfJErWzLOuoVqdKlpDo4jODms4zlFckuHObx4iHwuRi6fYqmYY201x/LqMrnFDNl8gRvvukhNdT9394rcOlNFMxrUhYFmW9imTEsp0mhWKC2nWSokyWSiFA7HSKcXiEb34fayyLVniUQk8rmn2drKIqlqiNcuVrh2ymQS1Nh8sc/GoMEbl7u8eb5D1yqTzkRJJsOkkiGymQVShyLE4yHWKnEq1RjpTIhmI8r2y3mkyloI38uha1n6bpVXrkw5+4LD/S/2uHnrIopaJhZ9hmQqwqHkAXJP8BDhyD46ZoWdMxOGcx/PNfECk/8AbxXdRjRliPoAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png","srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/34f77/soohwan.png 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/a94f6/soohwan.png 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7cf1f/soohwan.png 1148w","sizes":"100vw"},"sources":[{"srcSet":"/static/a9e6b445142b247ee4cfa66155398bb2/38420/soohwan.webp 750w,\n/static/a9e6b445142b247ee4cfa66155398bb2/7470d/soohwan.webp 1080w,\n/static/a9e6b445142b247ee4cfa66155398bb2/b5ef6/soohwan.webp 1148w","type":"image/webp","sizes":"100vw"}]},"width":1,"height":0.6829268292682927}}}}]},"fields":{"readingTime":{"text":"7 min read"},"layout":"post","slug":"/llama-cpp/"}},"primaryTag":"toolkit"}},
    "staticQueryHashes": ["3170763342","3229353822"]}