{"id":5170,"date":"2025-12-11T09:52:00","date_gmt":"2025-12-11T00:52:00","guid":{"rendered":"https:\/\/secondlife.lol\/?p=5170"},"modified":"2025-12-11T21:55:15","modified_gmt":"2025-12-11T12:55:15","slug":"open-webui-ollama-python-api-summarize-part4","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/ja\/open-webui-ollama-python-api-summarize-part4\/","title":{"rendered":"Python\uc73c\ub85c Open WebUI Ollama API \ud638\ucd9c\ud574\uc11c \uba74\ub2f4 \uc694\uc57d\ud558\uae30"},"content":{"rendered":"<style>.kb-image5170_87b2aa-d4 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5170_87b2aa-d4\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"328\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-1-600x328.jpg\" alt=\"Open webui ollama - python\" class=\"kb-img wp-image-5171\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-1-600x328.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-1-300x164.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-1-768x419.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-1-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-1.jpg 1024w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uc9c4\uc9dc \uc2e4\uc804 \ucf54\ub529\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/secondlife.lol\/open-webui-ollama-local-chatgpt-part1\/\" data-type=\"post\" data-id=\"5130\">1<\/a>,<a href=\"https:\/\/secondlife.lol\/open-webui-ollama-settings-korean-api-part3\/\" data-type=\"post\" data-id=\"5151\">2<\/a>,<a href=\"https:\/\/secondlife.lol\/open-webui-ollama-settings-korean-api-part3\/\" data-type=\"post\" data-id=\"5151\">3<\/a>\ubd80\uc5d0\uc11c \uc6b0\ub9ac\ub294<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub9e5\ubd81\uc5d0 Ollama \uc124\uce58\ud558\uace0 \ubaa8\ub378(Qwen\u00b7Llama3\u00b7EXAONE \ub4f1) \ubc1b\uace0,<\/li>\n\n\n\n<li>Docker\ub85c Open WebUI Ollama \ucee8\ud14c\uc774\ub108\ub97c \ub744\uc6b0\uace0,<\/li>\n\n\n\n<li>Open WebUI Ollama \uc124\uc815\uc5d0\uc11c \ud55c\uad6d\uc5b4 \uc2dc\uc2a4\ud15c \ud504\ub86c\ud504\ud2b8\uc640 JWT \ud1a0\ud070\uae4c\uc9c0 \ud655\uc778\ud588\uc8e0.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c 4\ubd80\uc5d0\uc11c\ub294<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201c<a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noopener\">Python<\/a> \uc2a4\ud06c\ub9bd\ud2b8\uc5d0\uc11c Open WebUI \uc758 \/api\/chat\/completions \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uc9c1\uc811 \ubd88\ub7ec<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc870\uc9c1\ubb38\ud654 \uba74\ub2f4 \ud14d\uc2a4\ud2b8\ub97c \uc694\uc57d\ud574 \ubcf4\ub294 \uac83\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae4c\uc9c0 \ud55c \ubc88\uc5d0 \uac00\ubd05\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_3e61ef-71, .wp-block-kadence-advancedheading.kt-adv-heading5170_3e61ef-71[data-kb-block=\"kb-adv-heading5170_3e61ef-71\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_3e61ef-71 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_3e61ef-71[data-kb-block=\"kb-adv-heading5170_3e61ef-71\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_3e61ef-71 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_3e61ef-71[data-kb-block=\"kb-adv-heading5170_3e61ef-71\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_3e61ef-71 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_3e61ef-71\">1. \uc65c \uad73\uc774 Open WebUI Ollama API\ub97c Python\uc5d0\uc11c \uc368\uc57c \ud560\uae4c?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">UI\uc5d0\uc11c \uc9c1\uc811 \ucc44\ud305\ud558\uba74 \ub418\ub294\ub370,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uad73\uc774 \ucf54\ub4dc\ub97c \uc9dc\uc11c Open WebUI API\ub97c \ud638\ucd9c\ud558\ub294 \uc774\uc720\ub294 \ubb58\uae4c\uc694?<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_9605aa-cc, .wp-block-kadence-advancedheading.kt-adv-heading5170_9605aa-cc[data-kb-block=\"kb-adv-heading5170_9605aa-cc\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_9605aa-cc mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_9605aa-cc[data-kb-block=\"kb-adv-heading5170_9605aa-cc\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_9605aa-cc img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_9605aa-cc[data-kb-block=\"kb-adv-heading5170_9605aa-cc\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_9605aa-cc wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_9605aa-cc\">1-1. \ubc18\ubcf5 \uc791\uc5c5\uc744 \uc790\ub3d9\ud654\ud558\uae30 \uc704\ud574<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc870\uc9c1\ubb38\ud654 \uc9c4\ub2e8\ucc98\ub7fc \uba74\ub2f4\uc774 \uc218\uc2ed\u00b7\uc218\ubc31 \uac74 \uc313\uc774\ub294 \uacbd\uc6b0,<\/li>\n\n\n\n<li>\ub9e4\ubc88 Open WebUI \ud654\uba74\uc5d0 \ubd99\uc5ec \ub123\uace0 \uc694\uc57d \ubc1b\uace0\u2026<br>\u2192 \uc0ac\ub78c\uc774 \uc190\uc73c\ub85c \ud558\uae34 \ub108\ubb34 \ube44\ud6a8\uc728\uc801\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Python\uc73c\ub85c Open WebUI Ollama API\ub97c \uc4f0\uba74<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>interview_001.txt, interview_002.txt \u2026 \ud30c\uc77c\ub4e4\uc744<br>\ud55c \ubc88\uc5d0 \uc77d\uc5b4 \uc640\uc11c \uc77c\uad04 \uc694\uc57d \u2192 \uacb0\uacfc\ub97c \ud3f4\ub354\u00b7DB\uc5d0 \uc800\uc7a5<\/li>\n\n\n\n<li>\u201c\uc5b4\uc81c \uc0c8\ub85c \ub4e4\uc5b4\uc628 \uba74\ub2f4\ub9cc\u201d \uace8\ub77c\uc11c Open WebUI \uc5d0 \ub358\uc9c0\ub294 \uc790\ub3d9 \uc791\uc5c5\ub3c4 \uac00\ub2a5<\/li>\n<\/ul>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_22383c-da, .wp-block-kadence-advancedheading.kt-adv-heading5170_22383c-da[data-kb-block=\"kb-adv-heading5170_22383c-da\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_22383c-da mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_22383c-da[data-kb-block=\"kb-adv-heading5170_22383c-da\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_22383c-da img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_22383c-da[data-kb-block=\"kb-adv-heading5170_22383c-da\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_22383c-da wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_22383c-da\">1-2. \ub098\uc911\uc5d0 Django\u00b7Flask \uac19\uc740 \uc6f9\uc2dc\uc2a4\ud15c\uacfc \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc5f0\uacb0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubc88 4\ubd80\uc5d0\uc11c \ub9cc\ub4dc\ub294 Python \ucf54\ub4dc\uac00<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub300\ub85c 5\ubd80\uc758 \uc7a5\uace0 \ubdf0\/\uc11c\ube44\uc2a4 \ucf54\ub4dc\ub85c \uc62e\uaca8 \uac08 \uac81\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc989, \ud55c\ubc88 \uc798 \ub9cc\ub4e4\uc5b4 \ub193\uc740 Open WebUI \ud074\ub77c\uc774\uc5b8\ud2b8\ub294<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub2e8\ub3c5 \uc2a4\ud06c\ub9bd\ud2b8<\/li>\n\n\n\n<li>\uc8fc\uae30 \uc2e4\ud589 \ubc30\uce58 \uc791\uc5c5<\/li>\n\n\n\n<li>Django \ubc31\uc5d4\ub4dc \uc11c\ube44\uc2a4<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5b4\ub514\uc5d0\ub4e0 \uadf8\ub300\ub85c \ubc15\uc544 \ub123\uc744 \uc218 \uc788\ub294 \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c \ubaa8\ub4c8\uc774 \ub429\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_53e758-4e, .wp-block-kadence-advancedheading.kt-adv-heading5170_53e758-4e[data-kb-block=\"kb-adv-heading5170_53e758-4e\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_53e758-4e mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_53e758-4e[data-kb-block=\"kb-adv-heading5170_53e758-4e\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_53e758-4e img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_53e758-4e[data-kb-block=\"kb-adv-heading5170_53e758-4e\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_53e758-4e wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_53e758-4e\">2. Open WebUI API \uad6c\uc870 \ub2e4\uc2dc \ud55c \ubc88 \uc9da\uace0 \uac00\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI \ub294 \uae30\ubcf8\uc801\uc73c\ub85c OpenAI ChatCompletion \ud638\ud658 API\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc5d4\ub4dc\ud3ec\uc778\ud2b8<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>POST http:\/\/localhost:3000\/api\/chat\/completions<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud5e4\ub354<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Authorization: Bearer &lt;JWT \ub610\ub294 API \ud0a4&gt;\nContent-Type: application\/json<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ubc14\ub514 \uad6c\uc870<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n&nbsp; \"model\": \"qwen2.5:7b\",\n&nbsp; \"messages\": &#91;\n&nbsp; &nbsp; { \"role\": \"system\", \"content\": \"\uc5ed\ud560 \uc815\ud558\uae30\" },\n&nbsp; &nbsp; { \"role\": \"user\", \"content\": \"\uc0ac\uc6a9\uc790 \uc9c8\ubb38\" }\n&nbsp; ]\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc751\ub2f5 \uad6c\uc870(\uc694\uc57d)<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n&nbsp; \"choices\": &#91;\n&nbsp; &nbsp; {\n&nbsp; &nbsp; &nbsp; \"message\": {\n&nbsp; &nbsp; &nbsp; &nbsp; \"role\": \"assistant\",\n&nbsp; &nbsp; &nbsp; &nbsp; \"content\": \"\uc5ec\uae30\uc5d0 Open WebUI Ollama\uac00 \uc0dd\uc131\ud55c \uc694\uc57d \ud14d\uc2a4\ud2b8\"\n&nbsp; &nbsp; &nbsp; }\n&nbsp; &nbsp; }\n&nbsp; ]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc989, Python\uc5d0\uc11c\ub294 requests \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc8fc\uc18c\uc5d0 JSON \ud558\ub098 \ub358\uc9c0\uace0,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3cc\uc544\uc628 JSON\uc5d0\uc11c choices[0].message.content\ub9cc \ubf51\uc73c\uba74 \ub05d\uc785\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_55f035-d5, .wp-block-kadence-advancedheading.kt-adv-heading5170_55f035-d5[data-kb-block=\"kb-adv-heading5170_55f035-d5\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_55f035-d5 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_55f035-d5[data-kb-block=\"kb-adv-heading5170_55f035-d5\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_55f035-d5 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_55f035-d5[data-kb-block=\"kb-adv-heading5170_55f035-d5\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_55f035-d5 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_55f035-d5\">3. JWT \ud1a0\ud070 \uac12 \uc900\ube44\ud558\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubbf8 3\ubd80\uc5d0\uc11c \ud655\uc778\ud588\uc9c0\ub9cc, \ud55c \ubc88 \ub354 \uc815\ub9ac\ud574\ubcfc\uac8c\uc694.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c http:\/\/localhost:3000 \uc811\uc18d<\/li>\n\n\n\n<li>\uc6b0\uce21 \uc0c1\ub2e8 \ud504\ub85c\ud544 \uc544\uc774\ucf58 \u2192 \uc124\uc815(Setting) \u2192 \uacc4\uc815(Account)<\/li>\n\n\n\n<li>\uc544\ub798\ucabd\uc5d0 JWT \ud1a0\ud070 \uc601\uc5ed\uc774 \uc788\uace0, \uc810\uc120\uc73c\ub85c \uac00\ub824\uc9c4 \uac12 + \ub208 \uc544\uc774\ucf58 + \ubcf5\uc0ac \ubc84\ud2bc\uc774 \ubcf4\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ub208 \uc544\uc774\ucf58(\ubcf4\uae30) \ud074\ub9ad \u2192 \uc804\uccb4 \ud1a0\ud070 \uac12\uc774 \ub178\ucd9c<\/li>\n\n\n\n<li>\ubcf5\uc0ac \ubc84\ud2bc\uc744 \ub20c\ub7ec \uc774 \ubb38\uc790\uc5f4\uc744 \ud074\ub9bd\ubcf4\ub4dc\uc5d0 \ubcf5\uc0ac\ud574 \ub461\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 JWT \ud1a0\ud070\uc774 Open WebUI API \uc778\uc99d\uc6a9 \ube44\ubc00\ud0a4 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f \uaf2d .env \uc5d0 \ub123\uace0, \uae43\uc5d0\ub294 \uc62c\ub9ac\uc9c0 \uc54a\ub3c4\ub85d \uc8fc\uc758!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI Ollama\uac00 \ub85c\uceec\uc774\ub77c\ub3c4, \uc2b5\uad00\uc744 \uc548\uc804\ud558\uac8c \uac00\uc838\uac00\ub294 \uac8c \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_2736df-da, .wp-block-kadence-advancedheading.kt-adv-heading5170_2736df-da[data-kb-block=\"kb-adv-heading5170_2736df-da\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_2736df-da mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_2736df-da[data-kb-block=\"kb-adv-heading5170_2736df-da\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_2736df-da img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_2736df-da[data-kb-block=\"kb-adv-heading5170_2736df-da\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_2736df-da wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_2736df-da\">4. Python\uc5d0\uc11c Open WebUI Ollama API \uccab \ud638\ucd9c \u2013 \u201c\uc548\ub155?\u201d \ud14c\uc2a4\ud2b8<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6b0\uc120 \uc544\uc8fc \uac04\ub2e8\ud55c \ud14c\uc2a4\ud2b8\ubd80\ud130 \ud574\ubcfc\uac8c\uc694.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI Ollama\uc5d0 \u201c\uc548\ub155?\u201d \ubcf4\ub0b4\uace0, \uc798 \uc751\ub2f5\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uc218\uc900\uc785\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_4de2e6-7c, .wp-block-kadence-advancedheading.kt-adv-heading5170_4de2e6-7c[data-kb-block=\"kb-adv-heading5170_4de2e6-7c\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_4de2e6-7c mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_4de2e6-7c[data-kb-block=\"kb-adv-heading5170_4de2e6-7c\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_4de2e6-7c img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_4de2e6-7c[data-kb-block=\"kb-adv-heading5170_4de2e6-7c\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_4de2e6-7c wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_4de2e6-7c\">4-1. .env \ud30c\uc77c \ub9cc\ub4e4\uae30<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354\uc5d0 .env \ud30c\uc77c \ud558\ub098 \ub9cc\ub4e4\uace0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OPENWEBUI_BASE_URL=http:\/\/localhost:3000\n\nOPENWEBUI_API_KEY=\uc5ec\uae30\uc5d0_JWT_\ud1a0\ud070_\uac12_\ubd99\uc5ec\ub123\uae30\n\nOPENWEBUI_DEFAULT_MODEL=qwen2.5:7b<\/code><\/pre>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_ffd880-94, .wp-block-kadence-advancedheading.kt-adv-heading5170_ffd880-94[data-kb-block=\"kb-adv-heading5170_ffd880-94\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_ffd880-94 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_ffd880-94[data-kb-block=\"kb-adv-heading5170_ffd880-94\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_ffd880-94 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_ffd880-94[data-kb-block=\"kb-adv-heading5170_ffd880-94\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_ffd880-94 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_ffd880-94\">4-2. \ud30c\uc774\uc36c \ucf54\ub4dc \u2013 \ucd5c\uc18c \uc608\uc81c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">test_openwebui_client.py \uac19\uc740 \uc774\ub984\uc73c\ub85c \ud30c\uc77c \ud558\ub098 \ub9cc\ub4e4\uace0<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>import os\nimport json\nimport requests\nfrom dotenv import load_dotenv\n\n# .env \uc77d\uae30\nload_dotenv()\n\nOPENWEBUI_BASE_URL = os.getenv(\"OPENWEBUI_BASE_URL\", \"http:\/\/localhost:3000\")\nOPENWEBUI_API_KEY = os.getenv(\"OPENWEBUI_API_KEY\", \"\")\nOPENWEBUI_DEFAULT_MODEL = os.getenv(\"OPENWEBUI_DEFAULT_MODEL\", \"qwen2.5:7b\")\n\n\ndef call_openwebui_ollama(prompt: str) -&gt; str:\n    \"\"\"Open WebUI Ollama \/api\/chat\/completions \uac04\ub2e8 \ud638\ucd9c.\"\"\"\n    url = f\"{OPENWEBUI_BASE_URL}\/api\/chat\/completions\"\n\n    headers = {\n        \"Authorization\": f\"Bearer {OPENWEBUI_API_KEY}\",\n        \"Content-Type\": \"application\/json\",\n    }\n\n    payload = {\n        \"model\": OPENWEBUI_DEFAULT_MODEL,\n        \"messages\": &#91;\n            {\n                \"role\": \"system\",\n                \"content\": \"\ub108\ub294 \ud55c\uad6d\uc5b4\ub85c\ub9cc \ub2f5\ubcc0\ud558\ub294 \uce5c\uc808\ud55c AI \ube44\uc11c\uc57c.\"\n            },\n            {\n                \"role\": \"user\",\n                \"content\": prompt,\n            },\n        ],\n    }\n\n    resp = requests.post(url, headers=headers, json=payload, timeout=60)\n    resp.raise_for_status()\n    data = resp.json()\n\n    # \ub514\ubc84\uae45\uc774 \ud544\uc694\ud558\uba74 \uc804\uccb4 \uc751\ub2f5\uc744 \ucc0d\uc5b4\ubcfc \uc218 \uc788\ub2e4.\n    # print(json.dumps(data, ensure_ascii=False, indent=2))\n\n    return data&#91;\"choices\"]&#91;0]&#91;\"message\"]&#91;\"content\"]\n\n\nif __name__ == \"__main__\":\n    answer = call_openwebui_ollama(\"Open WebUI Ollama \uc870\ud569\uc774 \ubb50\uc57c? \uc138 \uc904\ub85c \uc124\uba85\ud574\uc918.\")\n    print(\"=== Open WebUI Ollama \uc751\ub2f5 ===\")\n    print(answer)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud130\ubbf8\ub110\uc5d0\uc11c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install python-dotenv requests\n\npython test_openwebui_client.py<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc5d0\ub7ec \uc5c6\uc774<br>=== Open WebUI Ollama \uc751\ub2f5 ===<br>\uc544\ub798\uc5d0 \ud55c\uad6d\uc5b4 \uc124\uba85\uc774 \ucb49 \ucd9c\ub825\ub418\uba74<br>\u2192 Python \u2194 Open WebUI Ollama \u2194 Ollama \u2194 LLM \ubaa8\ub378<br>\uc804\uccb4 \ud30c\uc774\ud504\ub77c\uc778\uc774 \uc81c\ub300\ub85c \uc5f0\uacb0\ub41c \uc0c1\ud0dc\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_814d61-0a, .wp-block-kadence-advancedheading.kt-adv-heading5170_814d61-0a[data-kb-block=\"kb-adv-heading5170_814d61-0a\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_814d61-0a mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_814d61-0a[data-kb-block=\"kb-adv-heading5170_814d61-0a\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_814d61-0a img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_814d61-0a[data-kb-block=\"kb-adv-heading5170_814d61-0a\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_814d61-0a wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_814d61-0a\">5. \uc870\uc9c1\ubb38\ud654 \uba74\ub2f4 \ud14d\uc2a4\ud2b8 \uc694\uc57d<\/h2>\n\n\n<style>.kb-image5170_878c88-82 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5170_878c88-82\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"328\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-2-600x328.jpg\" alt=\"Ollama summarizing\" class=\"kb-img wp-image-5172\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-2-600x328.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-2-300x164.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-2-768x419.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-2-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-2.jpg 1024w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uc9c4\uc9dc \uc2e4\uc804\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI API\ub97c \uc774\uc6a9\ud574\uc11c \uba74\ub2f4 \uc804\ubb38 \ud55c \uac74\uc744 \uc694\uc57d\ud574\ubcfc\uac8c\uc694.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_cd934b-15, .wp-block-kadence-advancedheading.kt-adv-heading5170_cd934b-15[data-kb-block=\"kb-adv-heading5170_cd934b-15\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_cd934b-15 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_cd934b-15[data-kb-block=\"kb-adv-heading5170_cd934b-15\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_cd934b-15 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_cd934b-15[data-kb-block=\"kb-adv-heading5170_cd934b-15\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_cd934b-15 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_cd934b-15\">5-1. \uc694\uc57d \ud568\uc218 \uc124\uacc4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">openwebui_summarizer.py \uac19\uc740 \ud30c\uc77c\ub85c \ubd84\ub9ac\ud574\ub450\uba74<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub098\uc911\uc5d0 Django\uc5d0\uc11c \uadf8\ub300\ub85c import \ud574\uc11c \uc4f0\uae30 \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>import os\nimport requests\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nOPENWEBUI_BASE_URL = os.getenv(\"OPENWEBUI_BASE_URL\", \"http:\/\/localhost:3000\")\nOPENWEBUI_API_KEY = os.getenv(\"OPENWEBUI_API_KEY\", \"\")\nOPENWEBUI_DEFAULT_MODEL = os.getenv(\"OPENWEBUI_DEFAULT_MODEL\", \"qwen2.5:7b\")\n\n\nclass OpenWebUISummarizer:\n    \"\"\"Open WebUI Ollama \uae30\ubc18 \uc694\uc57d \ub3c4\uc6b0\ubbf8 \ud074\ub798\uc2a4.\"\"\"\n\n    def __init__(self):\n        if not OPENWEBUI_API_KEY:\n            raise ValueError(\"OPENWEBUI_API_KEY\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\")\n\n    @property\n    def _headers(self):\n        return {\n            \"Authorization\": f\"Bearer {OPENWEBUI_API_KEY}\",\n            \"Content-Type\": \"application\/json\",\n        }\n\n    def _post_chat(self, payload: dict) -&gt; dict:\n        url = f\"{OPENWEBUI_BASE_URL}\/api\/chat\/completions\"\n        resp = requests.post(url, headers=self._headers, json=payload, timeout=120)\n        resp.raise_for_status()\n        return resp.json()\n\n    def summarize_interview(self, text: str, model: str | None = None) -&gt; str:\n        \"\"\"\uc870\uc9c1\ubb38\ud654 \uba74\ub2f4 \uc804\ubb38\uc744 \uc694\uc57d\ud574\uc11c \ubc18\ud658.\"\"\"\n        model_name = model or OPENWEBUI_DEFAULT_MODEL\n\n        system_prompt = \"\"\"\n        \ub108\ub294 \uc870\uc9c1\ubb38\ud654 \uc804\ubb38\uac00\uc774\uc790 \uc694\uc57d \uc804\ubb38 AI\uc57c.\n        \ubaa8\ub4e0 \ub2f5\ubcc0\uc740 \ud55c\uad6d\uc5b4(\uc874\ub313\ub9d0)\ub85c\ub9cc \uc791\uc131\ud574\uc57c \ud55c\ub2e4.\n        \uc544\ub798 \uba74\ub2f4 \ub0b4\uc6a9\uc744 \uc77d\uace0, \uc870\uc9c1\ubb38\ud654 \uad00\uc810\uc758 \ud575\uc2ec\uc744 \uad6c\uc870\ud654\ud574\uc11c \uc694\uc57d\ud574\uc918.\n\n        \ud615\uc2dd:\n        1. \uc778\ud130\ubdf0 \uac1c\uc694 (2~3\uc904)\n        2. \uae0d\uc815\uc801\uc778 \uc870\uc9c1\ubb38\ud654 \uc694\uc18c (3~5\uac1c bullet)\n        3. \uc6b0\ub824\ub418\ub294 \uc870\uc9c1\ubb38\ud654 \uc694\uc18c \/ \ub9ac\uc2a4\ud06c (3~5\uac1c bullet)\n        4. \uc2dc\uc0ac\uc810 \ubc0f \uac1c\uc120 \uc81c\uc548 (2~4\uc904)\n        \"\"\"\n\n        user_content = f\"\"\"\n        \uc544\ub798\ub294 \ud55c \uba85\uc5d0 \ub300\ud55c \uc870\uc9c1\ubb38\ud654 \uba74\ub2f4(\uc778\ud130\ubdf0) \uc804\uccb4 \uae30\ub85d\uc785\ub2c8\ub2e4.\n\n        --- \uc778\ud130\ubdf0 \uc804\ubb38 \uc2dc\uc791 ---\n        {text}\n        --- \uc778\ud130\ubdf0 \uc804\ubb38 \ub05d ---\n\n        \uc704 \ud615\uc2dd\uc5d0 \ub9de\ucdb0 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc694\uc57d\ud574 \uc8fc\uc138\uc694.\n        \uc2e4\uc81c \ubcf4\uace0\uc11c\uc5d0 \ubc14\ub85c \ubd99\uc5ec \ub123\uc744 \uc218 \uc788\ub3c4\ub85d \ubb38\uc7a5\uc744 \uc815\ub9ac\ud574 \uc8fc\uc138\uc694.\n        \"\"\"\n\n        payload = {\n            \"model\": model_name,\n            \"messages\": &#91;\n                {\"role\": \"system\", \"content\": system_prompt},\n                {\"role\": \"user\", \"content\": user_content},\n            ],\n        }\n\n        data = self._post_chat(payload)\n        return data&#91;\"choices\"]&#91;0]&#91;\"message\"]&#91;\"content\"]<\/code><\/pre>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_cb6a22-ab, .wp-block-kadence-advancedheading.kt-adv-heading5170_cb6a22-ab[data-kb-block=\"kb-adv-heading5170_cb6a22-ab\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_cb6a22-ab mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_cb6a22-ab[data-kb-block=\"kb-adv-heading5170_cb6a22-ab\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_cb6a22-ab img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_cb6a22-ab[data-kb-block=\"kb-adv-heading5170_cb6a22-ab\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_cb6a22-ab wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_cb6a22-ab\">5-2. \uc0ac\uc6a9 \uc608\uc2dc \u2013 \ud14d\uc2a4\ud2b8 \ud30c\uc77c \ud558\ub098 \uc694\uc57d\ud558\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>if __name__ == \"__main__\":\n    from pathlib import Path\n\n    # \uc608: data\/interviews\/interview_001.txt\n    text_path = Path(\"data\/interviews\/interview_001.txt\")\n    raw_text = text_path.read_text(encoding=\"utf-8\")\n\n    summarizer = OpenWebUISummarizer()\n    summary = summarizer.summarize_interview(raw_text)\n\n    print(\"=== \uc694\uc57d \uacb0\uacfc ===\")\n    print(summary)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud558\uba74 interview_001.txt\uc5d0 \ub4e4\uc5b4 \uc788\ub294 \uae34 \uba74\ub2f4 \uc804\ubb38\uc744<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI \u2192 Qwen2.5 \uc870\ud569\uc73c\ub85c \uc694\uc57d\ud574\uc11c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucf58\uc194\uc5d0 \ucd9c\ub825\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_7f29dc-ad, .wp-block-kadence-advancedheading.kt-adv-heading5170_7f29dc-ad[data-kb-block=\"kb-adv-heading5170_7f29dc-ad\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_7f29dc-ad mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_7f29dc-ad[data-kb-block=\"kb-adv-heading5170_7f29dc-ad\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_7f29dc-ad img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_7f29dc-ad[data-kb-block=\"kb-adv-heading5170_7f29dc-ad\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_7f29dc-ad wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_7f29dc-ad\">6. \ud14d\uc2a4\ud2b8\uac00 \ub108\ubb34 \uae38 \ub54c \u2013 \uccad\ud06c \ub098\ub204\uae30 + \uba54\ud0c0 \uc694\uc57d \ud328\ud134<\/h2>\n\n\n<style>.kb-image5170_3ce616-0d .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5170_3ce616-0d\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"328\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-3-600x328.jpg\" alt=\"Chunk split image\" class=\"kb-img wp-image-5173\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-3-600x328.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-3-300x164.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-3-768x419.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-3-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-3.jpg 1024w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\ud604\uc2e4\uc5d0\uc11c\ub294 \uc870\uc9c1\ubb38\ud654 \uba74\ub2f4\uc774 1~2\uc2dc\uac04\uc529 \uc774\uc5b4\uc9c0\ub2e4 \ubcf4\ub2c8<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud14d\uc2a4\ud2b8\uac00 \uc0c1\ub2f9\ud788 \uae38 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI Ollama\uc5d0 \ud55c \ubc88\uc5d0 \ub358\uc9c0\uae30 \ubd80\ub2f4\uc2a4\ub7ec\uc6b8 \ub9cc\ud07c \uae38\ub2e4\uba74:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\uba74\ub2f4 \uc804\ubb38\uc744 \uc77c\uc815 \uae38\uc774 \uae30\uc900\uc73c\ub85c \uccad\ud06c(chunk) \ub85c \ub098\ub204\uace0,<\/li>\n\n\n\n<li>\uac01 \uccad\ud06c\ub97c Open WebUI Ollama\ub85c 1\ucc28 \uc694\uc57d,<\/li>\n\n\n\n<li>1\ucc28 \uc694\uc57d\ub4e4\uc744 \ub2e4\uc2dc \ud55c \ubc88 Open WebUI Ollama\uc5d0 \ub358\uc838 \ucd5c\uc885 \uc694\uc57d\uc744 \ub9cc\ub4e4\uc5b4\ub0c5\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_211d74-27, .wp-block-kadence-advancedheading.kt-adv-heading5170_211d74-27[data-kb-block=\"kb-adv-heading5170_211d74-27\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_211d74-27 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_211d74-27[data-kb-block=\"kb-adv-heading5170_211d74-27\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_211d74-27 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_211d74-27[data-kb-block=\"kb-adv-heading5170_211d74-27\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_211d74-27 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_211d74-27\">6-1. \uac04\ub2e8 \uccad\ud06c \ud568\uc218<\/h3>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>def chunk_text(text: str, max_chars: int = 3000) -&gt; list&#91;str]:\n    \"\"\"\ub300\ucda9 \uae00\uc790 \uc218 \uae30\uc900\uc73c\ub85c \ud14d\uc2a4\ud2b8\ub97c \ub04a\uc5b4 \uc8fc\ub294 \uac04\ub2e8 \uccad\ud06c \ud568\uc218.\"\"\"\n    chunks: list&#91;str] = &#91;]\n    current = \"\"\n\n    for line in text.splitlines(keepends=True):\n        if len(current) + len(line) &gt; max_chars:\n            chunks.append(current)\n            current = \"\"\n        current += line\n\n    if current.strip():\n        chunks.append(current)\n\n    return chunks<\/code><\/pre>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_4d05aa-12, .wp-block-kadence-advancedheading.kt-adv-heading5170_4d05aa-12[data-kb-block=\"kb-adv-heading5170_4d05aa-12\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_4d05aa-12 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_4d05aa-12[data-kb-block=\"kb-adv-heading5170_4d05aa-12\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_4d05aa-12 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_4d05aa-12[data-kb-block=\"kb-adv-heading5170_4d05aa-12\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5170_4d05aa-12 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_4d05aa-12\">6-2. \uccad\ud06c \uc694\uc57d + \uba54\ud0c0 \uc694\uc57d\uc744 Open WebUI Ollama\ub85c \uc218\ud589<\/h3>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>def summarize_long_interview(text: str) -&gt; str:\n    summarizer = OpenWebUISummarizer()\n\n    chunks = chunk_text(text, max_chars=3000)\n    partial_summaries: list&#91;str] = &#91;]\n\n    # 1\ucc28: \uccad\ud06c\ubcc4 \ubd80\ubd84 \uc694\uc57d\n    for idx, chunk in enumerate(chunks, start=1):\n        print(f\"&#91;DEBUG] Open WebUI Ollama\ub85c \ubd80\ubd84 \uc694\uc57d {idx}\/{len(chunks)} \uc9c4\ud589 \uc911...\")\n        summary_i = summarizer.summarize_interview(\n            chunk\n        )\n        partial_summaries.append(f\"&#91;\ubd80\ubd84 \uc694\uc57d {idx}]\\n{summary_i}\\n\")\n\n    # 2\ucc28: \ubd80\ubd84 \uc694\uc57d\ub4e4\uc744 \ud558\ub098\uc758 \ucd5c\uc885 \uc694\uc57d\uc73c\ub85c\n    bundle_text = \"\\n\".join(partial_summaries)\n\n    system_prompt = \"\"\"\n    \ub108\ub294 \uc5ec\ub7ec \uac1c\uc758 \ubd80\ubd84 \uc694\uc57d\ub4e4\uc744 \uc77d\uace0,\n    \uc911\ubcf5\uc744 \uc81c\uac70\ud558\uace0 \ud575\uc2ec\ub9cc \ub0a8\uaca8 \ud558\ub098\uc758 \ucd5c\uc885 \uc694\uc57d\uc744 \ub9cc\ub4dc\ub294 \uc804\ubb38\uac00\uc57c.\n    \ud615\uc2dd\uc740 \uc774\uc804\uacfc \ub3d9\uc77c\ud558\uac8c \uc720\uc9c0\ud558\uace0, \ud45c\ud604\uc740 \ub354 \uac04\uacb0\ud558\uac8c \ub2e4\ub4ec\uc5b4\uc918.\n    \"\"\"\n\n    payload = {\n        \"model\": OPENWEBUI_DEFAULT_MODEL,\n        \"messages\": &#91;\n            {\"role\": \"system\", \"content\": system_prompt},\n            {\n                \"role\": \"user\",\n                \"content\": f\"\uc544\ub798 &#91;\ubd80\ubd84 \uc694\uc57d]\ub4e4\uc744 \uc77d\uace0 \ud558\ub098\uc758 \ucd5c\uc885 \uc694\uc57d\ubcf8\uc744 \ub9cc\ub4e4\uc5b4\uc918.\\n\\n{bundle_text}\",\n            },\n        ],\n    }\n\n    data = summarizer._post_chat(payload)\n    final_summary = data&#91;\"choices\"]&#91;0]&#91;\"message\"]&#91;\"content\"]\n    return final_summary<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud328\ud134\uc744 \uc4f0\uba74<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uba74\ub2f4\uc774 \uc544\ubb34\ub9ac \uae38\uc5b4\ub3c4<br>Open WebUI Ollama\uac00 \ucc98\ub9ac \uac00\ub2a5\ud55c \ub369\uc5b4\ub9ac\ub85c \ucabc\uac20 \ub4a4 \ub2e4\uc2dc \ud569\uce58\ub294 \uad6c\uc870\ub77c \uaf64 \uc548\uc815\uc801\uc73c\ub85c \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub098\uc911\uc5d0 \uc7a5\uace0\uc5d0\uc11c \uc774 \ud568\uc218\ub97c \uadf8\ub300\ub85c \uac00\uc838\ub2e4\uac00<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201c\uba74\ub2f4 1\uac74 \uc694\uc57d \ubc84\ud2bc\u201d\uc774\ub098 \u201c\ubd80\uc11c\ubcc4 \uc77c\uad04 \uc694\uc57d\u201d \uae30\ub2a5\uc73c\ub85c \ubd99\uc774\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_f4121b-17, .wp-block-kadence-advancedheading.kt-adv-heading5170_f4121b-17[data-kb-block=\"kb-adv-heading5170_f4121b-17\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_f4121b-17 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_f4121b-17[data-kb-block=\"kb-adv-heading5170_f4121b-17\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_f4121b-17 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_f4121b-17[data-kb-block=\"kb-adv-heading5170_f4121b-17\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_f4121b-17 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_f4121b-17\">7. \uc2e4\ubb34\uc5d0\uc11c \uc790\uc8fc \uc4f0\uac8c \ub420 Open WebUI Ollama API \ud65c\uc6a9 \ud328\ud134<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI Ollama API\ub97c \ud55c \ubc88 \ubd99\uc5ec\ub193\uc73c\uba74,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc694\uc57d \ub9d0\uace0\ub3c4 \uc774\ub7f0 \uc791\uc5c5\uc5d0 \uadf8\ub300\ub85c \uc7ac\ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\ubc88\uc5ed + \uc694\uc57d \ub3d9\uc2dc \uc218\ud589<br>\n<ul class=\"wp-block-list\">\n<li>\u201c\uc601\ubb38 \ubcf4\uace0\uc11c\ub97c \ud55c\uad6d\uc5b4\ub85c \ubc88\uc5ed\ud558\uba74\uc11c, \ub9c8\uc9c0\ub9c9\uc5d0\ub294 5\uc904 \uc694\uc57d\uc744 \ubd99\uc5ec\uc918.\u201d<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ud0a4\uc6cc\ub4dc\/\ud0dc\uadf8 \ucd94\ucd9c<br>\n<ul class=\"wp-block-list\">\n<li>\u201c\uc774 \uba74\ub2f4\uc5d0\uc11c \ubc18\ubcf5\uc801\uc73c\ub85c \ub4f1\uc7a5\ud558\ub294 \ud0a4\uc6cc\ub4dc\ub97c 10\uac1c \ubf51\uc544\uc918.\u201d<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\uac10\uc131\u00b7\uc704\ud5d8\ub3c4 \ub808\uc774\ube14\ub9c1<br>\n<ul class=\"wp-block-list\">\n<li>\u201c\uc870\uc9c1\ubb38\ud654 \uad00\uc810\uc5d0\uc11c \uc774 \uc751\ub2f5\uc740 \uae0d\uc815\/\uc911\ub9bd\/\uc6b0\ub824 \uc911 \uc5b4\ub514\uc5d0 \uac00\uae4c\uc6b4\uc9c0 \uc120\ud0dd\ud558\uace0 \uc774\uc720\ub97c \uc368\uc918.\u201d<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubaa8\ub4e0 \ub85c\uc9c1\uc774 \uacb0\uad6d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open WebUI Ollama API\uc5d0 \ud504\ub86c\ud504\ud2b8\ub9cc \ubc14\uafd4\uc11c \ub358\uc9c0\ub294 \uac83\uc774\uae30 \ub54c\ubb38\uc5d0,<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud3ec\ub9f7\uc744 \uc798 \uc7a1\uc544\ub450\uba74<\/li>\n\n\n\n<li>\ub098\uc911\uc5d0 \uc7a5\uace0 \ubaa8\ub378 \uba54\uc11c\ub4dc\ub098 Celery \uc791\uc5c5\uc73c\ub85c \uc62e\uae30\uae30\ub3c4 \uc26c\uc6cc\uc9d1\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5170_5a6105-39, .wp-block-kadence-advancedheading.kt-adv-heading5170_5a6105-39[data-kb-block=\"kb-adv-heading5170_5a6105-39\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5170_5a6105-39 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5170_5a6105-39[data-kb-block=\"kb-adv-heading5170_5a6105-39\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5170_5a6105-39 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5170_5a6105-39[data-kb-block=\"kb-adv-heading5170_5a6105-39\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5170_5a6105-39 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5170_5a6105-39\">8. 4\ubd80 \ub9c8\ubb34\ub9ac \u2013 \uc774\uc81c Open WebUI Ollama\ub294 \u201c\ub3c4\uad6c\u201d\uac00 \uc544\ub2c8\ub77c \u201c\uc5d4\uc9c4\u201d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubc88 4\ubd80\uc5d0\uc11c\ub294<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>.env\uc5d0 Open WebUI Ollama JWT \ud1a0\ud070\uacfc URL\uc744 \ub123\uace0,<\/li>\n\n\n\n<li>Python requests\ub85c \/api\/chat\/completions\uc5d0 \uc9c1\uc811 \uc694\uccad\uc744 \ubcf4\ub0b4\uace0,<\/li>\n\n\n\n<li>\uac04\ub2e8\ud55c \u201c\uc548\ub155?\u201d \ud14c\uc2a4\ud2b8\ub85c Open WebUI Ollama \ud1b5\uc2e0\uc744 \ud655\uc778\ud55c \ub4a4,<\/li>\n\n\n\n<li>\uc870\uc9c1\ubb38\ud654 \uba74\ub2f4 \uc804\ubb38\uc744 \uc694\uc57d\ud558\ub294 \uc804\uc6a9 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uace0,<\/li>\n\n\n\n<li>\uae34 \ud14d\uc2a4\ud2b8\ub97c \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \uccad\ud06c\u2192\ubd80\ubd84 \uc694\uc57d\u2192\ucd5c\uc885 \uc694\uc57d \ud328\ud134\uae4c\uc9c0 \uc0b4\ud3b4\ubd24\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c\ubd80\ud130 Open WebUI Ollama\ub294 \ub2e8\uc21c\ud55c \u201c\ucc57\ubd07 UI\u201d\uac00 \uc544\ub2c8\ub77c,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201c\ud30c\uc774\uc36c\u00b7\uc7a5\uace0 \ub4f1\uc5d0\uc11c \ub9c8\uc74c\uaecf \ud638\ucd9c\ud560 \uc218 \uc788\ub294 \ub85c\uceec LLM \uc5d4\uc9c4\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc73c\ub85c \uc778\uc2dd\ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \ub9c8\uc9c0\ub9c9 5\ubd80\uc5d0\uc11c\ub294 \uc774 Open WebUI Ollama \uc694\uc57d \uc5d4\uc9c4\uc744<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c Django \uc870\uc9c1\ubb38\ud654 \uad00\ub828 \uc6f9\uc2dc\uc2a4\ud15c\uc5d0 \ubd99\uc774\ub294 \uc774\uc57c\uae30\ub97c \uc815\ub9ac\ud574\ubcfc \uac70\uc608\uc694.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774\uc81c \uc9c4\uc9dc \uc2e4\uc804 \ucf54\ub529\uc785\ub2c8\ub2e4. 1,2,3\ubd80\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uc774\uc81c 4\ubd80\uc5d0\uc11c\ub294 \u201cPython \uc2a4\ud06c\ub9bd\ud2b8\uc5d0\uc11c&#8230;<\/p>","protected":false},"author":3,"featured_media":5171,"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":[],"class_list":["post-5170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-coding"],"taxonomy_info":{"category":[{"value":7,"label":"\uc778\uacf5\uc9c0\ub2a5(AI)"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-1-600x328.jpg",600,328,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/ja\/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":72,"filter":"raw","cat_ID":7,"category_count":72,"category_description":"","cat_name":"\uc778\uacf5\uc9c0\ub2a5(AI)","category_nicename":"ai-coding","category_parent":20}],"tag_info":false,"_links":{"self":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/comments?post=5170"}],"version-history":[{"count":4,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5170\/revisions"}],"predecessor-version":[{"id":5182,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5170\/revisions\/5182"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media\/5171"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media?parent=5170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/categories?post=5170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/tags?post=5170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}