{"id":6300,"date":"2026-01-17T14:41:50","date_gmt":"2026-01-17T05:41:50","guid":{"rendered":"https:\/\/secondlife.lol\/?p=6300"},"modified":"2026-01-17T14:43:11","modified_gmt":"2026-01-17T05:43:11","slug":"llm-%eb%a6%ac%eb%9e%ad%ed%82%b9-%eb%a1%9c%ec%bb%ac-rag","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/zh\/llm-%eb%a6%ac%eb%9e%ad%ed%82%b9-%eb%a1%9c%ec%bb%ac-rag\/","title":{"rendered":"\ub85c\uceec RAG \uace0\uae09: LLM \ub9ac\ub7ad\ud0b9\u00b7\uadfc\uac70 \uc694\uc57d\uc73c\ub85c \ud488\uc9c8\u2191"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"424\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-62-600x424.png\" alt=\"LLM \ub9ac\ub7ad\ud0b9\" class=\"wp-image-6301\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-62-600x424.png 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-62-300x212.png 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-62-768x543.png 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-62-18x12.png 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-62.png 1036w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure>\n<\/div>\n\n\n<p>\ud558\uc774\ube0c\ub9ac\ub4dc RAG(=BM25+\ubca1\ud130 \uac80\uc0c9)\uae4c\uc9c0 \ub9cc\ub4e4\uc5c8\ub294\ub370\ub3c4 \u201c\ub2f5\uc774 \uc5b4\ub518\uac00 \uc560\ub9e4\ud558\ub2e4\u201d\uba74, \uc774\uc81c\ub294\u00a0<strong>(1) LLM\uc5d0 \ub123\ub294 \ucee8\ud14d\uc2a4\ud2b8\ub97c \ub354 \ub611\ub611\ud558\uac8c \uace0\ub974\uace0(LLM \ub9ac\ub7ad\ud0b9)<\/strong>,\u00a0<strong>(2) \ub2f5\ubcc0\uc744 \uadfc\uac70 \uc911\uc2ec\uc73c\ub85c \uc694\uc57d(Summarization)<\/strong>\u00a0\ud558\ub294 \ub2e8\uacc4\ub85c \ub118\uc5b4\uac08 \ud0c0\uc774\ubc0d\uc785\ub2c8\ub2e4. \uc774 \ub450 \uac00\uc9c0\ub9cc \ucd94\uac00\ud574\ub3c4 \u201c\uadf8\ub7f4\ub4ef\ud55c \ub9d0\u201d\uc774 \u201c\uadfc\uac70 \uc788\ub294 \ub2f5\u201d\uc73c\ub85c \ud655 \ubc14\ub01d\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uc774\ubc88 \uc8fc\uc81c\ub294 \ubb50\uc608\uc694?<\/h2>\n\n\n\n<p>\uc774\ubc88 \ud3b8\uc758 \uc8fc\uc81c\ub294 \u201c\ub85c\uceec RAG\uc758 \ud488\uc9c8\uc744 \ud55c \ub2e8\uacc4 \uc62c\ub9ac\ub294 \ub9c8\uc9c0\ub9c9 \ud37c\uc990\u201d \ub450 \uac00\uc9c0\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>LLM \uae30\ubc18 \uc7ac\uc21c\uc704(Re-rank)<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1\ucc28 \uac80\uc0c9(BM25\/\ubca1\ud130)\uc73c\ub85c \ubf51\ud78c \ubb38\uc11c \ud6c4\ubcf4(top-k)\ub97c\u00a0<strong>\ub354 \uc815\ubc00\ud55c \ubaa8\ub378<\/strong>\uc774 \ub2e4\uc2dc \uc810\uc218\ud654\ud574\uc11c \uc21c\uc11c\ub97c \uc7ac\uc815\ub82c\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ud2b9\ud788 Cross-Encoder(\ub9ac\ub7ad\ucee4)*\ub294 \u201c\uc9c8\uc758+\ubb38\uc11c\u201d\ub97c \ud55c \ubc88\uc5d0 \uc785\ub825\uc73c\ub85c \ub123\uace0 \uc9c1\uc811 \uad00\ub828 \uc810\uc218\ub97c \ubf51\uae30 \ub54c\ubb38\uc5d0, \uc0c1\uc704 \ud6c4\ubcf4\ub97c \uc815\ub82c\ud558\ub294 \ub370 \uac15\ud569\ub2c8\ub2e4. (<a href=\"https:\/\/www.pinecone.io\/learn\/series\/rag\/rerankers\/\" target=\"_blank\" rel=\"noopener\">Pinecone<\/a>)<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\ub2f5\ubcc0 \uc694\uc57d(Summarization) \/ \uadfc\uac70 \uc815\ub9ac<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>LLM\uc774 \ucd5c\uc885 \ub2f5\ubcc0\uc744 \ub9cc\ub4e4\uace0 \ub098\uc11c,\u00a0<strong>\uadfc\uac70 \ubb38\ub2e8\ub9cc \ub2e4\uc2dc \uc694\uc57d<\/strong>\ud574 \u201c\ud575\uc2ec 3\uc904 + \uadfc\uac70 bullet + \ubd88\ud655\uc2e4\uc131\u201d \ud615\ud0dc\ub85c \uc815\ub9ac\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uacb0\uacfc\uc801\uc73c\ub85c \uc0ac\uc6a9\uc790\uac00 \u201c\uc774 \ub2f5\uc774 \uc5b4\ub514\uc11c \ub098\uc654\ub294\uc9c0\u201d \ube60\ub974\uac8c \ud655\uc778\ud560 \uc218 \uc788\uc5b4 \uc2e0\ub8b0\ub3c4\uac00 \uc62c\ub77c\uac11\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\uc65c \uc9c0\uae08 \uc774\uac8c \ub728\ub294\uac00<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub85c\uceec LLM(<a href=\"https:\/\/secondlife.lol\/zh\/open-webui-ollama-setup-macbook-part2\/\" data-type=\"post\" data-id=\"5141\">Ollama<\/a>)\uc740 \uc124\uce58\/\uc6b4\uc601\uc774 \uc26c\uc6cc\uc84c\uace0,\u00a0<strong>\uc784\ubca0\ub529 \uc804\uc6a9 \ubaa8\ub378<\/strong>\ub3c4 \uacf5\uc2dd\uc801\uc73c\ub85c \uc9c0\uc6d0\ub418\uba74\uc11c \ub85c\uceec RAG\uac00 \ud604\uc2e4\uc774 \ub410\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ud558\uc9c0\ub9cc \u201c\uac80\uc0c9\uc740 \uc798\ud588\ub294\ub370 \ub2f5\uc774 \uc560\ub9e4\ud55c \ubb38\uc81c\u201d\ub294 \ud754\ud569\ub2c8\ub2e4. \uc774\uc720\ub294 \uac04\ub2e8\ud574\uc694.\n<ul class=\"wp-block-list\">\n<li>top-k\uc5d0\u00a0<strong>\ub178\uc774\uc988 \ubb38\ub2e8\uc774 \uc11e\uc774\uac70\ub098<\/strong><\/li>\n\n\n\n<li>\ud575\uc2ec \ubb38\ub2e8\uc774\u00a0<strong>\uc21c\uc704\uc5d0\uc11c \ubc00\ub9ac\uac70\ub098<\/strong><\/li>\n\n\n\n<li>LLM\uc774\u00a0<strong>\uae34 \ucee8\ud14d\uc2a4\ud2b8\ub97c \ub300\ucda9 \uc77d\uace0<\/strong>\u00a0\uadf8\ub7f4\ub4ef\ud558\uac8c \ub9d0\ud574\ubc84\ub9ac\uae30 \ub54c\ubb38\uc774\uc8e0.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uadf8\ub798\uc11c \uc694\uc998 RAG \ud30c\uc774\ud504\ub77c\uc778\uc740 \u201c\uac80\uc0c9 1\ub2e8 + \uc7ac\uc21c\uc704 2\ub2e8\u201d\uc744 \uc815\uc11d(two-stage retrieval)\uc73c\ub85c \ub9ce\uc774 \uc501\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\uc804\uccb4 \uad6c\uc870(\uadf8\ub9bc\uc73c\ub85c \uc774\ud574)<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"424\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-63-600x424.png\" alt=\"2\ub2e8 RAG \ud30c\uc774\ud504\ub77c\uc778 \uc804\uccb4 \uad6c\uc870\" class=\"wp-image-6302\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-63-600x424.png 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-63-300x212.png 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-63-768x543.png 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-63-18x12.png 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-63.png 1036w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure>\n<\/div>\n\n\n<p>\ub85c\uceec(\ub9e5 + SQLite + Ollama) \uae30\uc900\uc73c\ub85c \uc774\ub807\uac8c \uac00\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>1\ub2e8 \uac80\uc0c9<\/strong>\n<ul class=\"wp-block-list\">\n<li>BM25(FTS5)\ub85c \u201c\ud0a4\uc6cc\ub4dc\uc5d0 \uac15\ud55c \ud6c4\ubcf4\u201d \ubf51\uae30<\/li>\n\n\n\n<li>\ubca1\ud130 \uac80\uc0c9(sqlite-vec)\uc73c\ub85c \u201c\ud45c\ud604\uc774 \ub2ec\ub77c\ub3c4 \uc758\ubbf8\uac00 \ube44\uc2b7\ud55c \ud6c4\ubcf4\u201d \ubf51\uae30<\/li>\n\n\n\n<li>(\uc120\ud0dd) RRF\ub85c \ub450 \ub9ac\uc2a4\ud2b8\ub97c \ud569\uccd0 \u201c\ub113\uac8c\u201d \ud6c4\ubcf4\uad70 \ub9cc\ub4e4\uae30 (<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/search\/hybrid-search-ranking\" target=\"_blank\" rel=\"noopener\">Microsoft Learn<\/a>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>2\ub2e8 \uc7ac\uc21c\uc704(Re-rank)<\/strong>\n<ul class=\"wp-block-list\">\n<li>Cross-Encoder \ub9ac\ub7ad\ucee4\uac00 \uc9c8\uc758+\ubb38\ub2e8 \uc30d\uc744 \uc2a4\ucf54\uc5b4\ub9c1\ud574 top-n\ub9cc \ub0a8\uae30\uae30 (<a href=\"https:\/\/huggingface.co\/BAAI\/bge-reranker-large\" target=\"_blank\" rel=\"noopener\">\u62e5\u62b1\u7684\u8138<\/a>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc0dd\uc131(Answer)<\/strong>\n<ul class=\"wp-block-list\">\n<li>top-n \ubb38\ub2e8\ub9cc \ubd99\uc5ec Ollama\u00a0<code>\/api\/chat<\/code>\u00a0\ub610\ub294 OpenAI \ud638\ud658 API\ub85c \ub2f5\ubcc0 \uc0dd\uc131 (<a href=\"https:\/\/ollama.readthedocs.io\/en\/api\/\" target=\"_blank\" rel=\"noopener\">Ollama<\/a>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc694\uc57d(Summarize)<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ubc29\uae08 \uc0ac\uc6a9\ud55c \uadfc\uac70 \ubb38\ub2e8\uc744 \u201c\ud575\uc2ec \uc694\uc57d + \uadfc\uac70 \ubaa9\ub85d + \ubd88\ud655\uc2e4\uc131\u201d\uc73c\ub85c \uc7ac\uc815\ub9ac(\uc9e7\uac8c!)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\u2705 \ud575\uc2ec:&nbsp;<strong>\u201c\uac80\uc0c9\uc744 \uc798\ud558\ub294 \uac83\u201d\ubcf4\ub2e4 \u201c\ucee8\ud14d\uc2a4\ud2b8\ub97c \uc798 \uace0\ub974\ub294 \uac83\u201d\uc774 \ub2f5\ubcc0 \ud488\uc9c8\uc744 \uc88c\uc6b0<\/strong>\u7528\u4e8e\u4ee5\u4e0b\u65b9\u9762<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uc124\uce58\/\uc900\ube44\ubb3c<\/h2>\n\n\n\n<p>\uc774\ubc88 \ud3b8\uc740 \u201c<a href=\"https:\/\/secondlife.lol\/zh\/\ud558\uc774\ube0c\ub9ac\ub4dc-rag-bm25-vector-search\/\">\uc774\uc804 \ud3b8(\ud558\uc774\ube0c\ub9ac\ub4dc RAG)<\/a>\u201d \ud658\uacbd\uc744 \uadf8\ub300\ub85c \uc501\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MacOS<\/li>\n\n\n\n<li>Python 3.10+<\/li>\n\n\n\n<li>SQLite(FTS5)<\/li>\n\n\n\n<li>sqlite-vec(\ubca1\ud130 \uac80\uc0c9)\n<ul class=\"wp-block-list\">\n<li>\ucc38\uace0: vec0 KNN \ucffc\ub9ac\ub294 \ud658\uacbd\uc5d0 \ub530\ub77c\u00a0<code>LIMIT<\/code>\u00a0\u6216\u00a0<code>k = ?<\/code>\u00a0\uac19\uc740 \uc81c\uc57d\uc744 \uc694\uad6c\ud558\ub294 \uacbd\uc6b0\uac00 \uc788\uc5b4\uc694.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ollama\n<ul class=\"wp-block-list\">\n<li>\uc784\ubca0\ub529:\u00a0<code>\/api\/embed<\/code>\u00a0(<a href=\"https:\/\/docs.ollama.com\/api\/embed\" target=\"_blank\" rel=\"noopener\">Ollama Docs<\/a>)<\/li>\n\n\n\n<li>\ucc44\ud305:\u00a0<code>\/api\/chat<\/code><\/li>\n\n\n\n<li>(\uc120\ud0dd) OpenAI \ud638\ud658 API \uc0ac\uc6a9 \uac00\ub2a5<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\ucd94\uac00(LLM \ub9ac\ub7ad\ud0b9\uc6a9, \ub85c\uceec)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pip install sentence-transformers<\/code>\u00a0(CrossEncoder \uc0ac\uc6a9)\n<ul class=\"wp-block-list\">\n<li>\ubaa8\ub378 \uc608:\u00a0<code>BAAI\/bge-reranker-large<\/code>\u00a0\uac19\uc740 \ub9ac\ub7ad\ucee4\ub294 \u201ctop-k\ub97c \uc7ac\uc815\ub82c\ud558\ub294 \uc6a9\ub3c4\u201d\ub85c \ub9ce\uc774 \uc18c\uac1c\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\uc2e4\uc804 \uc0ac\uc6a9\ubc95 (Step-by-step)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1) \u201c\ud6c4\ubcf4\uad70\u201d\uc744 \ub113\uac8c \ubf51\uae30 (BM25 + \ubca1\ud130)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>BM25(FTS5): \uc815\ud655\ud55c \ud0a4\uc6cc\ub4dc\/\uace0\uc720\uba85\uc0ac\/\ucf54\ub4dc \uc2ec\ubcfc\uc5d0 \uac15\ud568<\/li>\n\n\n\n<li>\ubca1\ud130 \uac80\uc0c9: \ud45c\ud604\uc774 \ub2ec\ub77c\ub3c4 \uc758\ubbf8\uac00 \ube44\uc2b7\ud558\uba74 \uc7a1\uc544\uc90c<\/li>\n\n\n\n<li>\ub450 \uacb0\uacfc\ub97c \ud569\uccd0\uc11c candidate set\uc744 \ub9cc\ub4ed\ub2c8\ub2e4(top 40~200 \uc815\ub3c4).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2) RRF\ub85c \u201c1\ucc28 \ud1b5\ud569 \uc21c\uc704\u201d \ub9cc\ub4e4\uae30 (\uc120\ud0dd\uc774\uc9c0\ub9cc \ucd94\ucc9c)<\/h3>\n\n\n\n<p>BM25\uc640 \ubca1\ud130\ub294 \uc810\uc218 \uc2a4\ucf00\uc77c\uc774 \ub2ec\ub77c\uc11c \uadf8\ub300\ub85c \ub354\ud558\uba74 \uc774\uc0c1\ud574\uc9c8 \uc218 \uc788\uc5b4\uc694.<br>\uadf8\ub7f4 \ub54c RRF\ub294\u00a0<strong>\uc21c\uc704(rank)\ub9cc<\/strong>\u00a0\uc368\uc11c \uc11e\uc5b4\uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc810\uc218 = 1 \/ (rank + k)<\/li>\n\n\n\n<li>k\ub294 \ubcf4\ud1b5 60 \uac19\uc740 \uc791\uc740 \uc0c1\uc218\ub85c \ub450\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc774 \uc5b8\uae09\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3) LLM \uae30\ubc18 Re-rank\ub85c \u201c\ucd5c\uc885 \uadfc\uac70 top-n\u201d \uace0\ub974\uae30<\/h3>\n\n\n\n<p>\uc5ec\uae30\uc11c \ub9ac\ub7ad\ucee4(Cross-Encoder)\uac00 \uc77c\uc744 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc785\ub825: (\uc9c8\uc758, \ubb38\ub2e8) \uc30d<\/li>\n\n\n\n<li>\ucd9c\ub825: \uad00\ub828\ub3c4 \uc810\uc218<\/li>\n\n\n\n<li>\ud6c4\ubcf4 50\uac1c\ub97c \ub123\uace0 top 6~12\uac1c\ub9cc \ubf51\ub294 \ub290\ub08c\uc774 \uac00\uc7a5 \uc2e4\uc804\uc801\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4) Ollama\ub85c \ub2f5\ubcc0 \uc0dd\uc131 + \u201c\uadfc\uac70 \uae30\ubc18 \uc694\uc57d\u201d \ub9cc\ub4e4\uae30<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub2f5\ubcc0 \ud504\ub86c\ud504\ud2b8\ub294\u00a0<strong>\uadfc\uac70 \ubb38\ub2e8\uc744 \uba3c\uc800<\/strong>\u00a0\uc8fc\uace0, \uadf8 \ub2e4\uc74c \uc9c8\ubb38<\/li>\n\n\n\n<li>\uc0dd\uc131 \ub4a4 \uc694\uc57d\uc740 \u201c\uac19\uc740 \uadfc\uac70 \ubb38\ub2e8\u201d\ub9cc \ub300\uc0c1\uc73c\ub85c \ub2e4\uc2dc \uc9e7\uac8c \uc815\ub9ac(\ud575\uc2ec 3\uc904 + bullet)<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"338\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-64-600x338.jpg\" alt=\"\" class=\"wp-image-6303\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-64-600x338.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-64-300x169.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-64-768x432.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-64-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-64.jpg 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">(\uc791\ub3d9 \uc608\uc2dc \ucf54\ub4dc) \ud558\uc774\ube0c\ub9ac\ub4dc \ud6c4\ubcf4 \u2192 \ub9ac\ub7ad\ud06c \u2192 \ub2f5\ubcc0 \u2192 \uc694\uc57d<\/h3>\n\n\n\n<p>\uc544\ub798 \ucf54\ub4dc\ub294 \u201c\uc804\uccb4 \ud30c\uc774\ud504\ub77c\uc778 \uac10\u201d\uc744 \uc7a1\uae30 \uc704\ud55c\u00a0<strong>\uc9e7\uc740 \ub3d9\uc791 \uc608\uc2dc<\/strong>\u662f<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>import sqlite3\nimport requests\nfrom sentence_transformers import CrossEncoder\n\nDB_PATH = \"rag.db\"\nOLLAMA = \"http:\/\/localhost:11434\"\nEMBED_MODEL = \"embeddinggemma\"\nCHAT_MODEL = \"llama3\"\n\n# 1) \ub85c\uceec \ub9ac\ub7ad\ucee4(\ud06c\ub85c\uc2a4 \uc778\ucf54\ub354) \ub85c\ub4dc\nreranker = CrossEncoder(\"BAAI\/bge-reranker-large\")\n\ndef ollama_embed(text: str) -> list&#91;float]:\n    r = requests.post(f\"{OLLAMA}\/api\/embed\", json={\n        \"model\": EMBED_MODEL,\n        \"input\": text\n    })\n    r.raise_for_status()\n    return r.json()&#91;\"embeddings\"]&#91;0]\n\ndef bm25_search(conn, query: str, k: int = 30) -> list&#91;dict]:\n    rows = conn.execute(\n        \"SELECT rowid, content FROM docs WHERE docs MATCH ? LIMIT ?\",\n        (query, k)\n    ).fetchall()\n    return &#91;{\"id\": rid, \"text\": txt, \"src\": \"bm25\"} for rid, txt in rows]\n\ndef vec_search(conn, query: str, k: int = 30) -> list&#91;dict]:\n    # sqlite-vec \ucffc\ub9ac \ud615\ud0dc\ub294 \uad6c\ud604\/\ubc84\uc804\uc5d0 \ub530\ub77c \ub2e4\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    # \ud575\uc2ec\uc740 'query \uc784\ubca0\ub529'\uc744 \ub123\uace0 top-k \ubb38\ub2e8 rowid\ub97c \uac00\uc838\uc624\ub294 \uad6c\uc870\uc785\ub2c8\ub2e4.\n    qv = ollama_embed(query)\n\n    rows = conn.execute(\n        \"\"\"\n        SELECT doc_id, distance\n        FROM vec_docs\n        WHERE embedding MATCH ? AND k = ?\n        ORDER BY distance ASC\n        \"\"\",\n        (bytes(bytearray()), k)  # \u2190 \uc608\uc2dc \uc790\ub9ac: \uc2e4\uc81c\ub85c\ub294 qv\ub97c vec \ud615\uc2dd\uc73c\ub85c \uc804\ub2ec\n    ).fetchall()\n\n    # NOTE: \uc704 vec \uc804\ub2ec \ud615\uc2dd\uc740 \ud658\uacbd\ubcc4\ub85c \ub2e4\ub985\ub2c8\ub2e4. (\uc5ec\uae30\uc11c\ub294 \ud30c\uc774\ud504\ub77c\uc778 \uc608\uc2dc\uac00 \ubaa9\uc801)\n    # \uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 sqlite-vec \ubb38\uc11c\/\ubc14\uc778\ub529 \ud615\uc2dd\uc5d0 \ub9de\ucdb0 qv\ub97c \uc804\ub2ec\ud558\uc138\uc694.\n\n    # doc_id\ub85c \ubcf8\ubb38 \uc870\ud68c\n    out = &#91;]\n    for doc_id, _dist in rows:\n        txt = conn.execute(\"SELECT content FROM docs WHERE rowid = ?\", (doc_id,)).fetchone()\n        if txt:\n            out.append({\"id\": doc_id, \"text\": txt&#91;0], \"src\": \"vec\"})\n    return out\n\ndef rerank(query: str, candidates: list&#91;dict], top_n: int = 8) -> list&#91;dict]:\n    pairs = &#91;(query, c&#91;\"text\"]) for c in candidates]\n    scores = reranker.predict(pairs)\n    ranked = sorted(\n        &#91;{\"score\": float(s), **c} for s, c in zip(scores, candidates)],\n        key=lambda x: x&#91;\"score\"],\n        reverse=True\n    )\n    return ranked&#91;:top_n]\n\ndef ollama_chat(prompt: str) -> str:\n    r = requests.post(f\"{OLLAMA}\/api\/chat\", json={\n        \"model\": CHAT_MODEL,\n        \"messages\": &#91;{\"role\": \"user\", \"content\": prompt}],\n        \"stream\": False\n    })\n    r.raise_for_status()\n    return r.json()&#91;\"message\"]&#91;\"content\"]\n\ndef build_grounded_prompt(query: str, passages: list&#91;dict]) -> str:\n    context = \"\\n\\n\".join(&#91;f\"&#91;\uadfc\uac70 {i+1}] {p&#91;'text']}\" for i, p in enumerate(passages)])\n    return f\"\"\"\uc544\ub798 \uadfc\uac70\ub9cc \uc0ac\uc6a9\ud574\uc11c \ub2f5\ud558\uc138\uc694. \uadfc\uac70\uc5d0 \uc5c6\ub294 \ub0b4\uc6a9\uc740 '\ucd94\uc815'\uc774\ub77c\uace0 \ud45c\uc2dc\ud558\uc138\uc694.\n\n{context}\n\n\uc9c8\ubb38: {query}\n\n\ucd9c\ub825 \ud615\uc2dd:\n1) \ud55c \uc904 \ub2f5\n2) \uadfc\uac70 \uc694\uc57d(\ubd88\ub9bf 3\uac1c)\n3) \ubd88\ud655\uc2e4\ud55c \uc810(\uc788\uc73c\uba74)\n\"\"\"\n\ndef summarize_evidence(passages: list&#91;dict]) -> str:\n    context = \"\\n\\n\".join(&#91;p&#91;\"text\"] for p in passages])\n    prompt = f\"\"\"\ub2e4\uc74c \uadfc\uac70 \ubb38\ub2e8\ub9cc\uc73c\ub85c \uc694\uc57d\ud574\uc918.\n- \ud575\uc2ec 3\uc904\n- \uc911\uc694\ud55c \uc22b\uc790\/\uace0\uc720\uba85\uc0ac\ub9cc \ub530\ub85c 5\uac1c\n- \ud55c \uc904 \uacb0\ub860\n\n\uadfc\uac70:\n{context}\n\"\"\"\n    return ollama_chat(prompt)\n\ndef answer(query: str):\n    conn = sqlite3.connect(DB_PATH)\n\n    bm = bm25_search(conn, query, k=30)\n    # vec = vec_search(conn, query, k=30)  # \uc2e4\uc81c \ud658\uacbd\uc5d0\uc11c sqlite-vec \ubc14\uc778\ub529 \ub9de\ucd94\uba74 \ud65c\uc131\ud654\n    vec = &#91;]\n\n    # \ud6c4\ubcf4 \ud1b5\ud569(\uc911\ubcf5 \uc81c\uac70)\n    merged = {c&#91;\"id\"]: c for c in (bm + vec)}\n    candidates = list(merged.values())\n\n    top_passages = rerank(query, candidates, top_n=8)  # LLM \uae30\ubc18 \uc7ac\uc21c\uc704\n    final_prompt = build_grounded_prompt(query, top_passages)\n\n    final_answer = ollama_chat(final_prompt)\n    evidence_summary = summarize_evidence(top_passages)\n\n    return final_answer, evidence_summary\n\nif __name__ == \"__main__\":\n    q = \"\ubca1\ud130 \uac80\uc0c9 \uc608\uc2dc\ub97c \ub4e4\uc5b4\uc11c \ud558\uc774\ube0c\ub9ac\ub4dc RAG \uc7a5\uc810\uc744 \uc124\uba85\ud574\uc918\"\n    a, s = answer(q)\n    print(\"\\n=== \ub2f5\ubcc0 ===\\n\", a)\n    print(\"\\n=== \uadfc\uac70 \uc694\uc57d ===\\n\", s)<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4ee3\u7801\u8bc4\u6ce8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CrossEncoder(...)<\/code>: \ub9ac\ub7ad\ucee4 \ubaa8\ub378 \ub85c\ub4dc. \uc9c8\uc758+\ubb38\ub2e8\uc744 \uac19\uc774 \ub123\uc5b4 \uc810\uc218\ub97c \ubf51\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>ollama_embed()<\/code>: Ollama\u00a0<code>\/api\/embed<\/code>\ub85c \uc784\ubca0\ub529\uc744 \ubf51\uc2b5\ub2c8\ub2e4(\uc784\ubca0\ub529\uc740 \ubca1\ud130 \uac80\uc0c9\/RAG\uc758 \ucd9c\ubc1c\uc810).<\/li>\n\n\n\n<li><code>bm25_search()<\/code>: SQLite FTS5\uc5d0\uc11c \ud0a4\uc6cc\ub4dc \uae30\ubc18\uc73c\ub85c \ud6c4\ubcf4\ub97c \ubf51\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>vec_search()<\/code>: sqlite-vec\ub85c \ubca1\ud130 \ud6c4\ubcf4\ub97c \ubf51\ub294 \uc790\ub9ac(\uc2e4\uc81c \ubc14\uc778\ub529 \ud615\uc2dd\uc740 \ud658\uacbd\uc5d0 \ub9de\ucdb0 \uad6c\ud604). \ucc38\uace0\ub85c vec0 \ucffc\ub9ac\ub294 LIMIT \ub610\ub294\u00a0<code>k = ?<\/code>\u00a0\uc81c\uc57d\uc774 \ud544\uc694\ud55c \uacbd\uc6b0\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>rerank()<\/code>: \ud6c4\ubcf4 \ubb38\ub2e8\uc744 \ub9ac\ub7ad\ucee4\ub85c \uc810\uc218\ud654\ud558\uace0 top_n\ub9cc \ub0a8\uae41\ub2c8\ub2e4(\ub450 \ub2e8\uacc4 \uac80\uc0c9\uc758 \ud575\uc2ec).<\/li>\n\n\n\n<li><code>build_grounded_prompt()<\/code>: \u201c\uadfc\uac70 \ubc16 \ub0b4\uc6a9\uc740 \ucd94\uc815 \ud45c\uc2dc\u201d \uac19\uc740 \uaddc\uce59\uc744 \ub123\uc5b4 \ud658\uac01\uc744 \uc904\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>summarize_evidence()<\/code>: \ub2f5\ubcc0 \ud6c4 \uadfc\uac70\ub9cc \ub2e4\uc2dc \uc694\uc57d\ud574\uc11c \uc0ac\uc6a9\uc790 \uac80\uc99d \uc2dc\uac04\uc744 \uc904\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li><code>ollama_chat()<\/code>: Ollama\u00a0<code>\/api\/chat<\/code>\ub85c \ub2f5\ubcc0 \uc0dd\uc131(\uc2a4\ud2b8\ub9ac\ubc0d \ub044\ub824\uba74\u00a0<code>stream: false<\/code>).<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u26a0\ufe0f \ucc38\uace0: \uc608\uc2dc \ucf54\ub4dc\ub294 \u201c\uad6c\uc870 \uc774\ud574\uc6a9\u201d\uc785\ub2c8\ub2e4. \ud2b9\ud788 sqlite-vec\uc5d0 \uc784\ubca0\ub529\uc744 \ubc14\uc778\ub529\ud558\ub294 \ubc29\uc2dd\uc740 \ud655\uc7a5\/\uc5b8\uc5b4 \ubc14\uc778\ub529\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c8 \uc218 \uc788\uc5b4, \uc5ec\ub7ec\ubd84 \ud658\uacbd\uc758 sqlite-vec \ubb38\uc11c\/\uc608\uc81c\uc5d0 \ub9de\ucdb0\u00a0<code>vec_search()<\/code>\u00a0\ubd80\ubd84\uc744 \uc5f0\uacb0\ud574 \uc8fc\uc138\uc694.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\ubc14\ub85c \uc368\uba39\ub294 \ud301 3\uac00\uc9c0<\/h2>\n\n\n\n<p>\u2705&nbsp;<strong>\ud301 1 \u2014 \ub9ac\ub7ad\ud06c\ub294 \u2018\ud6c4\ubcf4 50\uac1c \u2192 \ucd5c\uc885 8\uac1c\u2019 \uc815\ub3c4\uac00 \uac00\uc7a5 \uac00\uc131\ube44<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub9ac\ub7ad\ucee4(Cross-Encoder)\ub294 \uc815\ud655\ud558\uc9c0\ub9cc \ube44\uc6a9\uc774 \ud07d\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uadf8\ub798\uc11c \u201c\ub300\ucda9 \ub113\uac8c \ubf51\uace0, \uc881\uac8c \uc815\ub82c\u201d\uc774 \uc815\uc11d\uc774\uc5d0\uc694.<\/li>\n<\/ul>\n\n\n\n<p>\u2705&nbsp;<strong>\ud301 2 \u2014 \ub2f5\ubcc0 \ud504\ub86c\ud504\ud2b8\uc5d0 \u2018\uadfc\uac70 \ubc16\uc774\uba74 \ucd94\uc815\u2019 \uaddc\uce59\uc744 \ubc15\uc544\ub77c<\/strong>&nbsp;\ud83e\uddf7<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201c\uadfc\uac70\uc5d0 \uc5c6\ub294 \ub0b4\uc6a9\uc740 \ucd94\uc815\uc774\ub77c\uace0 \ud45c\uc2dc\u201d\ub9cc \ud574\ub3c4 \ud658\uac01\uc774 \ud655 \uc904\uc5b4\ub4ed\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uadf8\ub9ac\uace0 \uc694\uc57d \ub2e8\uacc4\uc5d0\uc11c \u201c\uc22b\uc790\/\uace0\uc720\uba85\uc0ac\ub9cc \ub530\ub85c\u201d\ub97c \uaf2d \ubf51\uc544\ub450\uba74 \uac80\uc99d\uc774 \uc26c\uc6cc\uc694.<\/li>\n<\/ul>\n\n\n\n<p>\u2705&nbsp;<strong>\ud301 3 \u2014 \uc694\uc57d\uc740 \u2018\ub2f5\ubcc0 \uc694\uc57d\u2019\uc774 \uc544\ub2c8\ub77c \u2018\uadfc\uac70 \uc694\uc57d\u2019\uc73c\ub85c<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub2f5\ubcc0\uc744 \uc694\uc57d\ud558\uba74 \ub610 \u201c\uadf8\ub7f4\ub4ef\ud55c \uc694\uc57d\u201d\uc774 \ub098\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uadfc\uac70 \ubb38\ub2e8\ub9cc<\/strong>\u00a0\uc694\uc57d\ud558\uba74 \uac80\uc99d \uac00\ub2a5\uc131\uc774 \uc62c\ub77c\uac11\ub2c8\ub2e4(\uc2e4\ubb34\uc5d0\uc11c \uc774\uac8c \uccb4\uac10 \ud07c).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\uc628\ub77c\uc778 \ubc18\uc751\/\ud6c4\uae30 \uc694\uc57d<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub9ac\ub7ad\ucee4\ub97c \u201cRAG\uc758 \uc131\ub2a5\uc744 \uc62c\ub9ac\ub294 2\ub2e8\uacc4 \uad6c\uc131(two-stage retrieval)\uc758 \ud575\uc2ec\u201d\uc73c\ub85c \uc18c\uac1c\ud558\ub294 \uc790\ub8cc\uac00 \ub9ce\uc2b5\ub2c8\ub2e4. (\uc9c8\uc758-\ubb38\uc11c \uc30d\uc744 \uc9c1\uc811 \uc810\uc218\ud654\ud558\ub294 cross-encoder \ubc29\uc2dd)<\/li>\n\n\n\n<li>Hugging Face\uc758 bge-reranker \uacc4\uc5f4\ub3c4 \u201c\uac04\ub2e8\ud55c \ub9ac\ud2b8\ub9ac\ubc84\uac00 \ubf51\uc740 top-k\ub97c \ub9ac\ub7ad\ud0b9\ud558\ub294 \uc6a9\ub3c4\u201d\ub85c \ub110\ub9ac \uc124\uba85\ub429\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ub85c\uceec \uad00\uc810\uc5d0\uc11c\ub294 Ollama\uac00 \uc784\ubca0\ub529 \ubaa8\ub378\uacfc\u00a0<code>\/api\/embed<\/code>\ub97c \uacf5\uc2dd \uc9c0\uc6d0\ud574 RAG \ud30c\uc774\ud504\ub77c\uc778\uc5d0 \uc4f0\uae30 \uc26c\uc6cc\uc84c\ub2e4\ub294 \uc810\uc774 \ubc18\ubcf5\uc801\uc73c\ub85c \uac15\uc870\ub429\ub2c8\ub2e4.<\/li>\n\n\n\n<li>OpenAI \ud638\ud658 API \uc9c0\uc6d0\ub3c4 \ub85c\uceec \ub3c4\uad6c\/\ud504\ub808\uc784\uc6cc\ud06c \uc5f0\uacb0\uc131\uc744 \ub192\uc600\ub2e4\ub294 \ud3c9\uac00\uac00 \ub9ce\uc2b5\ub2c8\ub2e4(\ub2e8, \uc9c0\uc6d0 \ubc94\uc704\ub294 \ubb38\uc11c \uae30\uc900\uc73c\ub85c \ud655\uc778 \uad8c\uc7a5).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ub9ac\uc2a4\ud06c &amp; \uc8fc\uc758\uc0ac\ud56d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) TOS\/API \uc0ac\uc6a9 \ub9ac\uc2a4\ud06c<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub85c\uceec Ollama\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uceec \ud638\ucd9c\uc774\uc9c0\ub9cc,\u00a0<strong>OpenAI \ud638\ud658 API\ub97c \uc4f8 \ub54c\ub3c4 \u201c\uc5b4\ub5a4 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\/\ubc84\uc804\u201d\uc744 \uc4f0\ub294\uc9c0<\/strong>\u00a0\ubb38\uc11c \uae30\uc900\uc73c\ub85c \ud655\uc778\ud558\uc138\uc694.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2) \ubcf4\uc548 &amp; \ud504\ub77c\uc774\ubc84\uc2dc<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 \uc7a5\uc810: \ubb38\uc11c\uac00 \ub85c\uceec\uc5d0\uc11c\ub9cc \ucc98\ub9ac\ub418\uba74 \uc720\ucd9c \uc704\ud5d8\uc774 \ud06c\uac8c \uc904\uc5b4\ub4ed\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\u26a0\ufe0f \uc8fc\uc758: \ub85c\uceec \uc11c\ubc84(11434 \ud3ec\ud2b8)\ub97c \uc678\ubd80\uc5d0 \ub178\ucd9c\ud558\uc9c0 \ub9c8\uc138\uc694(\uacf5\uc720\uae30 \ud3ec\ud2b8\ud3ec\uc6cc\ub529 \uae08\uc9c0).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3) \ub370\uc774\ud130 \ucc98\ub9ac \uc8fc\uc758(\ubb38\uc11c \uccad\ud06c\/\ub85c\uadf8)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ubb38\uc11c \uccad\ud06c\uc5d0 \uac1c\uc778\uc815\ubcf4\/\ubbfc\uac10\uc815\ubcf4\uac00 \uc11e\uc774\uba74, \uc694\uc57d \uacb0\uacfc\uc5d0 \uadf8\ub300\ub85c \ud280\uc5b4\ub098\uc62c \uc218 \uc788\uc5b4\uc694.<\/li>\n\n\n\n<li>\ub85c\uae45(\ud504\ub86c\ud504\ud2b8\/\uadfc\uac70 \uc800\uc7a5)\uc744 \ucf1c\ub450\uba74 \u201c\ud3b8\ud558\uc9c0\ub9cc \uc704\ud5d8\u201d\ud569\ub2c8\ub2e4. \uc6b4\uc601 \ubaa8\ub4dc\uc5d0\uc11c\ub294 \ucd5c\uc18c\ud654\ud558\uc138\uc694.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4) \ube44\uc6a9\/\uc0ac\uc6a9\ub7c9 \uc2a4\ud30c\uc774\ud06c(\uc2dc\uac04\/\uc790\uc6d0)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub9ac\ub7ad\ucee4\ub294 \ud6c4\ubcf4 \uc218\uc5d0 \ube44\ub840\ud574\uc11c \ub290\ub824\uc9d1\ub2c8\ub2e4(\ud2b9\ud788 CPU).<\/li>\n\n\n\n<li>\uc694\uc57d\uae4c\uc9c0 \ubd99\uc774\uba74 LLM \ud638\ucd9c\uc774 2\ubc88\uc774 \ub418\ubbc0\ub85c,\u00a0<strong>\uc751\ub2f5 \uc2dc\uac04\uc774 2\ubc30 \uac00\uae4c\uc774 \ub298 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5) \uc548\uc804 \uac80\uc99d \uccb4\ud06c\ub9ac\uc2a4\ud2b8 (How to verify safely) \u2705<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00a0<strong>\uadfc\uac70 \ubb38\ub2e8\uc744 \uac19\uc774 \ucd9c\ub825<\/strong>\ud588\ub294\uac00? (\ub2f5\ubcc0\ub9cc \ub0b4\ubcf4\ub0b4\uba74 \uc704\ud5d8)<\/li>\n\n\n\n<li>\u00a0\u201c\uadfc\uac70 \ubc16 \ub0b4\uc6a9 = \ucd94\uc815\u201d \uaddc\uce59\uc744 \uc801\uc6a9\ud588\ub294\uac00?<\/li>\n\n\n\n<li>\u00a0top-n \uadfc\uac70\ub97c \uc0ac\ub78c\uc774 10\ucd08\ub77c\ub3c4 \ud6d1\uc5b4\ubcf4\uba74 \u201c\ub9d0\uc774 \ub418\ub294\uc9c0\u201d \ud310\ub2e8 \uac00\ub2a5\ud55c\uac00?<\/li>\n\n\n\n<li>\u00a0\ub85c\uceec \ud3ec\ud2b8\uac00 \uc678\ubd80\uc5d0 \uc5f4\ub824 \uc788\uc9c0 \uc54a\uc740\uac00?<\/li>\n\n\n\n<li>\u00a0\ub85c\uadf8\/\uce90\uc2dc\uc5d0 \ubbfc\uac10\uc815\ubcf4\uac00 \ub0a8\uc9c0 \uc54a\ub294\uac00?<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5e38\u89c1\u95ee\u9898<\/h2>\n\n\n\n<p><strong>Q1. Re-rank\ub294 \uaf2d LLM\uc73c\ub85c \ud574\uc57c \ud558\ub098\uc694?<\/strong><br>A. \uaf2d\uc740 \uc544\ub2d9\ub2c8\ub2e4. \ud558\uc9c0\ub9cc Cross-Encoder \ub9ac\ub7ad\ucee4\ub294 \u201c\uc9c8\uc758+\ubb38\uc11c\u201d\ub97c \ud568\uaed8 \ubcf4\uace0 \uc810\uc218\ud654\ud574\uc11c top-k \uc7ac\uc815\ub82c\uc5d0 \uac15\ud55c \ubc29\uc2dd\uc73c\ub85c \uc790\uc8fc \uc18c\uac1c\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>Q2. RRF\ub294 \uc65c \uc4f0\ub098\uc694?<\/strong><br>A. BM25\uc640 \ubca1\ud130\ub294 \uc810\uc218 \uc2a4\ucf00\uc77c\uc774 \ub2ec\ub77c\uc11c \ub2e8\uc21c \ud569\uc0b0\uc774 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. RRF\ub294 \uc21c\uc704\ub9cc\uc73c\ub85c\u00a0<code>1\/(rank+k)<\/code>\u00a0\uc810\uc218\ub97c \ub9cc\ub4e4\uc5b4 \uc11e\uc5b4\uc8fc\ub294 \ubc29\uc2dd\uc73c\ub85c \ub110\ub9ac \uc124\uba85\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>Q3. Ollama\ub85c \uc784\ubca0\ub529\ub3c4 \ub9cc\ub4e4 \uc218 \uc788\ub098\uc694?<\/strong><br>A. \ub124. Ollama\ub294 \uc784\ubca0\ub529 \ubaa8\ub378\uc744 \uc9c0\uc6d0\ud558\uace0\u00a0<code>\/api\/embed<\/code>\ub85c \uc784\ubca0\ub529\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>Q4. \uc694\uc57d\uc740 \uc65c \ud544\uc694\ud55c\uac00\uc694? \ub2f5\ub9cc \uc798\ud558\uba74 \ub418\uc9c0 \uc54a\ub098\uc694?<\/strong><br>A. \uc2e4\ubb34\uc5d0\uc11c\ub294 \u201c\uac80\uc99d \uac00\ub2a5\uc131\u201d\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \uadfc\uac70 \uc694\uc57d\uc744 \ud568\uaed8 \uc8fc\uba74 \uc0ac\uc6a9\uc790\uac00 \ube60\ub974\uac8c \ub9de\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uc5b4\uc694.<\/p>\n\n\n\n<p><strong>Q5. \ubca1\ud130 \uac80\uc0c9 \uc608\uc2dc\ub294 \uc5b4\ub5a4 \uac8c \uc88b\uc544\uc694?<\/strong><br>A. \u201c\uac19\uc740 \uc758\ubbf8\uc778\ub370 \ud45c\ud604\uc774 \ub2e4\ub978 \uc9c8\ubb38\u201d\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \uc608: \u2018\uad8c\ud55c \ubd84\ub9ac\u2019 vs \u2018\uc720\uc800\ubcc4 \uc811\uadfc\uc81c\uc5b4\u2019, \u2018\uc7a5\uc560 \uc6d0\uc778\u2019 vs \u2018\uadfc\ubcf8 \uc6d0\uc778 \ubd84\uc11d\u2019. \ubca1\ud130\ub294 \uc774\ub7f0 \ud45c\ud604 \ucc28\uc774\ub97c \uc644\ud654\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>Q6. sqlite-vec\uc5d0\uc11c KNN \ucffc\ub9ac\uac00 \uc548 \ub3fc\uc694.<\/strong><br>A. \ud658\uacbd\uc5d0 \ub530\ub77c\u00a0<code>LIMIT<\/code>\u00a0\u6216\u00a0<code>k = ?<\/code>\u00a0\uac19\uc740 \uc81c\uc57d\uc774 \ud544\uc694\ud55c \uc774\uc288\uac00 \ubcf4\uace0\ub41c \uc801\uc774 \uc788\uc2b5\ub2c8\ub2e4. (SQLite \ubc84\uc804 \uc601\ud5a5 \uac00\ub2a5)<\/p>\n\n\n\n<p><strong>Q7. OpenAI \ud638\ud658 API\ub85c \ubd99\uc774\ub294 \uac8c \ub354 \uc88b\uc740\uac00\uc694?<\/strong><br>A. \ub3c4\uad6c \ud638\ud658\uc131(\uae30\uc874 SDK \uc7ac\uc0ac\uc6a9) \uce21\uba74\uc5d0\uc11c \uc7a5\uc810\uc774 \uc788\uc9c0\ub9cc, \uc9c0\uc6d0 \ubc94\uc704\ub294 \ubc84\uc804\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c8 \uc218 \uc788\uc73c\ub2c8 \uacf5\uc2dd \ubb38\uc11c \uae30\uc900\uc73c\ub85c \ud655\uc778\ud558\uc138\uc694.<\/p>\n\n\n\n<p><strong>Q8. \ub9ac\ub7ad\ucee4 \ubaa8\ub378\uc740 \ubb50\ubd80\ud130 \uc4f0\uba74 \ub3fc\uc694?<\/strong><br>A. bge-reranker \uacc4\uc5f4\ucc98\ub7fc \u201ctop-k \uc7ac\uc815\ub82c\u201d\uc744 \uc804\uc81c\ub85c \uc124\uba85\ub418\ub294 \ub9ac\ub7ad\ucee4\ubd80\ud130 \uc2dc\uc791\ud558\ub294 \ud3b8\uc774 \ubb34\ub09c\ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u603b\u7ed3<\/h2>\n\n\n\n<p>\uc774\ubc88 \ud3b8\uc758 \ud3ec\uc778\ud2b8\ub294 \ub531 \ud558\ub098\uc785\ub2c8\ub2e4:&nbsp;<strong>\u201c\uac80\uc0c9 \uacb0\uacfc\ub97c \ub354 \ub611\ub611\ud558\uac8c \uace0\ub974\uace0, \ub2f5\ubcc0\uc744 \uadfc\uac70 \uc911\uc2ec\uc73c\ub85c \uc815\ub9ac\ud558\ub77c.\u201d<\/strong><br>\ud558\uc774\ube0c\ub9ac\ub4dc RAG\ub294 \u201c\ucc3e\ub294 \ub2a5\ub825\u201d\uc744 \uc62c\ub9ac\uace0,&nbsp;<strong>\ub9ac\ub7ad\ud0b9+\uadfc\uac70 \uc694\uc57d\uc740 \u201c\uc124\ub4dd\ub825(\uac80\uc99d \uac00\ub2a5\uc131)\u201d\uc744 \uc62c\ub9bd\ub2c8\ub2e4.<\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>\ud558\uc774\ube0c\ub9ac\ub4dc RAG(=BM25+\ubca1\ud130 \uac80\uc0c9)\uae4c\uc9c0 \ub9cc\ub4e4\uc5c8\ub294\ub370\ub3c4 \u201c\ub2f5\uc774 \uc5b4\ub518\uac00 \uc560\ub9e4\ud558\ub2e4\u201d\uba74, \uc774\uc81c\ub294\u00a0(1) LLM\uc5d0 \ub123\ub294&#8230;<\/p>","protected":false},"author":3,"featured_media":6301,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[7],"tags":[1455,1446,1449,1453,1452,1454,1447,1451,1448,1450],"class_list":["post-6300","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-coding","tag-cross-encoder","tag-ollama-rag","tag-rerank","tag-rrf","tag-sqlite-rag","tag-two-stage-retrieval","tag-1447","tag-1451","tag-1448","tag--rag"],"taxonomy_info":{"category":[{"value":7,"label":"\uc778\uacf5\uc9c0\ub2a5(AI)"}],"post_tag":[{"value":1455,"label":"cross-encoder"},{"value":1446,"label":"Ollama RAG"},{"value":1449,"label":"rerank"},{"value":1453,"label":"RRF"},{"value":1452,"label":"SQLite RAG"},{"value":1454,"label":"two-stage retrieval"},{"value":1447,"label":"\uadfc\uac70 \uc694\uc57d"},{"value":1451,"label":"\ub9ac\ub7ad\ud0b9"},{"value":1448,"label":"\ubca1\ud130 \uac80\uc0c9 \uc608\uc2dc"},{"value":1450,"label":"\ud558\uc774\ube0c\ub9ac\ub4dc RAG"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2026\/01\/image-62-600x424.png",600,424,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/zh\/author\/tere\/"},"comment_info":0,"category_info":[{"term_id":7,"name":"\uc778\uacf5\uc9c0\ub2a5(AI)","slug":"ai-coding","term_group":0,"term_taxonomy_id":7,"taxonomy":"category","description":"","parent":20,"count":69,"filter":"raw","cat_ID":7,"category_count":69,"category_description":"","cat_name":"\uc778\uacf5\uc9c0\ub2a5(AI)","category_nicename":"ai-coding","category_parent":20}],"tag_info":[{"term_id":1455,"name":"cross-encoder","slug":"cross-encoder","term_group":0,"term_taxonomy_id":1455,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1446,"name":"Ollama RAG","slug":"ollama-rag","term_group":0,"term_taxonomy_id":1446,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1449,"name":"rerank","slug":"rerank","term_group":0,"term_taxonomy_id":1449,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1453,"name":"RRF","slug":"rrf","term_group":0,"term_taxonomy_id":1453,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1452,"name":"SQLite RAG","slug":"sqlite-rag","term_group":0,"term_taxonomy_id":1452,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1454,"name":"two-stage retrieval","slug":"two-stage-retrieval","term_group":0,"term_taxonomy_id":1454,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1447,"name":"\uadfc\uac70 \uc694\uc57d","slug":"%ea%b7%bc%ea%b1%b0-%ec%9a%94%ec%95%bd","term_group":0,"term_taxonomy_id":1447,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1451,"name":"\ub9ac\ub7ad\ud0b9","slug":"%eb%a6%ac%eb%9e%ad%ed%82%b9","term_group":0,"term_taxonomy_id":1451,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1448,"name":"\ubca1\ud130 \uac80\uc0c9 \uc608\uc2dc","slug":"%eb%b2%a1%ed%84%b0-%ea%b2%80%ec%83%89-%ec%98%88%ec%8b%9c","term_group":0,"term_taxonomy_id":1448,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1450,"name":"\ud558\uc774\ube0c\ub9ac\ub4dc RAG","slug":"%ed%95%98%ec%9d%b4%eb%b8%8c%eb%a6%ac%eb%93%9c-rag","term_group":0,"term_taxonomy_id":1450,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts\/6300","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/comments?post=6300"}],"version-history":[{"count":2,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts\/6300\/revisions"}],"predecessor-version":[{"id":6305,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts\/6300\/revisions\/6305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/media\/6301"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/media?parent=6300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/categories?post=6300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/tags?post=6300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}