Share
Embed
watsonx.ai Dojo #6 継続的なAIアプリ開発と展開
IBMビジネスパートナー・コミュニティである愛徳会のAI未来創造委員会主催の勉強会シリーズです。
最終回の第6回目は、これまで学習してきたことを組み合わせて、大規模言語モデルを利用したAIアプリの継続的な開発と展開の方法を学びます。素早くアプリを開発するために、watsonx.aiでAI推論を行う最低限のコードから出発し、StreamlitやFast APIを利用して、アプリを少しずつ変更しながら機能を強化することを体験します。企業独自のAIアプリだけではなく、AIを組み込んだソリューションの継続的な発展、パートナーエコシステムへの発展などを一緒に考えていきます。
Akira Onishi (IBM) PRO
January 13, 2025
Transcript
27 slides
-
ࣗݾհ 1SPQFSUZ 7BMVF ࢯ໊ େ জ Y-JOLFE*O POJBL *5ۀքྺ
ۙͷ৬ྺ Microsoft *#. )BTI5BH ͍͍Ͷ͐੩Ԭੜ׆RVBOUJD ࠲ӈͷ ౿·Εͯͳ্ཱ͓͕ͪΔಓͷ Α͘͏ٕ มͰࣗΛϙδςΟϒʹ IUUQTXXXGBDFCPPLDPNBLJSBPOJTIJ 'BDFCPPLʮ͓ʹ͋͘ʯͰݕࡧ -
ϋϯζΦϯڥ֬ೝ νϟοτʹΑΔճΛ͓ئ͍͠·͢ ࠲ֶฒͼʹϋϯζΦϯͷ༰%FNP ͠ڥ͕͍ͬͯͳ͍ํɺ४උΛ͠ͳ͕Β͝ཡ͍ͩ͘͞ ຊɺͲ͏ͯ͠ڥΛ͑ΒΕͳ͍ํɺ%FNPΛ͝ཡʹͳΓɺ ޙɺ͓ࢼ͍ͩ͘͠͞ օ͞ΜࣗͰͷϋϯζΦϯ
5VOJOH4UVEJPͷମݧ *OTUSVDU-BC$-*ͷΠϯετʔϧͱૢ࡞ͷ֬ೝ ຊͷྲྀΕ -
४උͷͨΊͷࢀߟࢿྉ IUUQTTQFBLFSEFDLDPNPOJBLJCNXBUTPOYBJEPKPQSFSFR ϋϯζΦϯڥͷ४උ ڥ ରऀ *#.5FDIOPMPHZ;POF *#.άϧʔϓࣾһ *#.1BSUOFS1MVTʹొࡁΈͷϏδωεɾύʔτφʔ༷ *#.XBUTPOYBJແྉධՁ൛ ҰൠͷࢀՃऀͰɺ*#.$MPVEͷΞΧϯτΛ͓࣋ͪͰͳ͍߹
ධՁ൛ͷΞΫηεʹΫϨδοτɾΧʔυෆཁ ܦաޙɺΫϨδοτɾΧʔυΛొ͢Δͱैྔ՝ۚΞΧϯτͱ ͯ͠ɺશͯͷ*#.$MPVEͷαʔϏε͕͝ར༻͍͚ͨͩ·͢ *#.$MPVE ҰൠͷࢀՃऀͰɺ*#.$MPVEͷΞΧϯτΛ͓࣋ͪͷ߹ -
• 3&45ʹΑΓXBUTPOY"1*Λར༻͢Δ • XBUTPOYαʔϏεΛ͍ͨ͘͢͠ΫϥΠΞϯτɾϥΠϒϥϦʔΛ͏ B XBUTPOY"1*Λར༻ͨ͠ΞϓϦΛ࡞Γɺల։͢Δ "*ΞϓϦ XBUTPOYαʔϏε 63- "*ΞϓϦ
3&45 3&45 IUUQTHJUIVCDPN*#.KBQBOUFDIOPMPHZUSFFNBJOXBUTPOYBJEPKP1SPNQU-BC XBUTPOY1ZUIPO ϥΠϒϥϦ "1* IUUQTHJUIVCDPN*#.KBQBOUFDIOPMPHZCMPCNBJOXBUTPOYBJEPKPSBHMDRBQZ "1*Ωʔ͔Βੜͨ͠ΞΫηετʔΫϯ 1SPKFDU*% Ϟσϧͷࢦఆ ύϥϝʔλͷࢦఆ ϓϩϯϓτจࣈྻ -
XBUTPOYBJ3VOUJNFʹσϓϩΠͨ͠αʔϏεʹΞΫηε͢Δ • 3&45αʔϏεʹΞΫηε͢Δ • XBUTPOYαʔϏεΛ͍ͨ͘͢͠ΫϥΠΞϯτɾϥΠϒϥϦʔΛ͏ C XBUTPOYBJ3VOUJNFʹ8FCαʔϏεΛల։͢Δ "*ΞϓϦ σϓϩΠͨ͠αʔϏε 3&45
IUUQTHJUIVCDPN*#.KBQBOUFDIOPMPHZUSFFNBJOXBUTPOYBJEPKPJOWPLFXFCBQJ "*ΞϓϦ XBUTPOY1ZUIPO ϥΠϒϥϦ 3&45 "1*Ωʔ͔Βੜͨ͠ΞΫηετʔΫϯ 1SPKFDU*% 4QBDF*% %FQMPZNFOU*% αʔϏεͷೖྗʢจࣈྻͳͲʣ -
from ibm_watsonx_ai import APIClient from ibm_watsonx_ai import Credentials from ibm_watsonx_ai.foundation_models
import ModelInference credentials = Credentials( url = "https://jp-tok.ml.cloud.ibm.com", api_key = ”<APIΩʔ>" ) client = APIClient(credentials) model = ModelInference( model_id="ibm/granite-3-8b-instruct", api_client=client, project_id=”<ϓϩδΣΫτID>", params = { "max_new_tokens": 500 } ) XBUTPOYBJݴޠϞσϧʹΑΔਪॲཧͷ࠷খίʔυ prompt = ”C#ΛͬͯONNXϞσϧΛݺͼग़͢ίʔυΛ࡞͍ͯͩ͘͠͞ɻ" print(model.generate_text(prompt)) -
ωοτϫʔΫܦ༝ͰΞϓϦʹΞΫηεͰ͖ΔΑ͏ʹ͢Δ ϢʔβʔɾΠϯλʔϑΣΠεΛ༻ҙͯ͠ɺϓϩϯϓτΛೖྗɺԠ͕දࣔ Ͱ͖ΔΑ͏ʹ͢Δ Ұൠతʹߟ͑Δͱɺ࣍ͷΑ͏ͳ͕ࣝඞཁ • 8FCαʔόʔ • )5.- $44 +BWB4DSJQU
• ಈతͳ8FCΞϓϦ ·ͣɺ1ZUIPOͱ؆୯ͳωοτϫʔΫͷࣝͰͲ͏ʹ͔͢Δ ϒϥβʔ͔ΒΞΫηεͰ͖Δ8FCΞϓϦͱͯ͠ల։͢Δ -
/HJOYΛϦόʔεɾϓϩΩγͱͯ͠ɺ"*ΞϓϦʹଓ ϒϥβ 4USFBNMJUΞϓϦͷల։ྫ ϦόʔεɾϓϩΩγ OHJOY NZEPNBJOBQQ "*ΞϓϦ BQQ QSPYZ@QBTT TUSFBNMJUSVOBQQQZTFSWFSBEESFTTTFSWFSQPSUTFSWFSCBTF6SM1BUIBQQTFSWFSFOBCMF$034GBMTF
# /etc/nginx/conf.d/default.conf location /app1/ { proxy_pass http://127.0.0.1:8501/app1/; proxy_redirect http:// https://; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } /HJOYͱ"*ΞϓϦ͕ಉ͡ίϯϐϡʔλʔ্ʹ͋Δ߹ IUUQTEPDTTUSFBNMJUJPLOPXMFEHFCBTFEFQMPZSFNPUFTUBSU -
from ibm_watsonx_ai import APIClient from ibm_watsonx_ai import Credentials from ibm_watsonx_ai.foundation_models
import ModelInference import time import logging API_KEY="<APIΩʔ>" PROJECT_ID="<Project ID>" credentials = Credentials( url = "https://jp-tok.ml.cloud.ibm.com", api_key = API_KEY ) logger = logging.getLogger('uvicorn') def connect_watsonx(): start = time.perf_counter() cli = APIClient(credentials) end = time.perf_counter() logger.info("watsonxͷ௨৴ཱ֬:"+str(end-start)) return cli TJNQMFBQJQZ def load_model(): start = time.perf_counter() m = ModelInference( model_id="ibm/granite-3-8b-instruct", api_client=connect_watsonx(), project_id=PROJECT_ID, params = { "max_new_tokens": 600 } ) end = time.perf_counter() logger.info("LLMͷઃఆྃ:"+str(end-start)) return m from fastapi import FastAPI app = FastAPI() model = load_model() @app.get("/prompt/") def read_item(q: str = None): start = time.perf_counter() generated_string = model.generate_text(q) end = time.perf_counter() logger.info("ਪ࣌ؒ:"+str(end-start)) return {"generated_text": generated_string} -
XBUTPOYBJͷΑ͏ͳ"*ϓϥοτϑΥʔϜ͕ඞཁͳཧ༝ ΞϓϦʢ8FCϢʔβʔΠϯλʔϑΣΠεʣ ΞϓϦɾϓϥοτϑΥʔϜ "*ΞϓϦ Ϗδωεɾ ϩδοΫ "*Ϟσϧ ϥΠϒϥϦ"1* "*ΞϓϦɾϓϥοτϑΥʔϜ ͍߹Θͤ
ੜ݁Ռ ཤྺ σʔλ ༻ྔ σʔλ "*ͷ࣮ݧΦʔϓϯιʔεͰՄೳ ҰํɺاۀϨϕϧͷల։՝͕ଟ͍ 4BB4൛ͷXBUTPOYBJΛ͑ɺ ΞϓϦ։ൃɺల։ɺӡ༻ʹूதͰ͖Δ -
ϫʔΫγϣοϓɺηογϣϯɺ͓Αͼࢿྉɺ*#.·ͨηογϣϯൃදऀʹΑͬͯ४උ͞ΕɺͦΕͧΕಠࣗͷݟղΛөͨ͠ͷͰ͢ɻͦΕΒใ ఏڙͷతͷΈͰఏڙ͞Ε͓ͯΓɺ͍͔ͳΔࢀՃऀʹରͯ͠๏త·ͨͦͷଞͷࢦಋॿݴΛҙਤͨ͠ͷͰͳ͘ɺ·ͨ*#.αʔϏε͕͓ ٬༷ʹద༻͋Δಛఆͷ๏ྩʹద߹͢Δ͜ͱΛอূ͢ΔͷͰ͋Γ·ͤΜɻຊߨԋࢿྉʹؚ·Ε͍ͯΔใʹ͍ͭͯɺશੑͱਖ਼֬ੑΛظ͢ΔΑ͏ Ί͓ͯΓ·͕͢ɺʮݱঢ়ͷ··ʯఏڙ͞Εɺ໌ࣔ·ͨࣔʹ͔͔ΘΒͣɺۀੑɺಛఆͷతͷద߹ੑɺඇ৵ੑΛؚΊɺ͍͔ͳΔอূΘͳ͍ ͷͱ͠·͢ɻຊߨԋࢿྉ·ͨͦͷଞͷࢿྉͷ༻ʹΑͬͯɺ͋Δ͍ͦͷଞͷؔ࿈ʹΑͬͯɺ͍͔ͳΔଛ͕ੜͨ͡߹ɺ*#.ΛෛΘͳ͍ ͷͱ͠·͢ɻ ຊߨԋࢿྉͰݴٴ͞ΕΔ*#.ɺϓϩάϥϜɺ·ͨαʔϏεɺ*#.͕ϏδωεΛߦ͍ͬͯΔͯ͢ͷࠃɾҬͰ͝ఏڙՄೳͳΘ͚ Ͱ͋Γ·ͤΜɻຊߨԋࢿྉͰݴٴ͞ΕΔকདྷͷలʢϦϦʔεػೳΛؚΉʣɺࢢػձ·ͨͦͷଞͷཁҼʹج͍ͮͯ*#.ಠࣗͷܾ ఆݖΛ͍ͬͯͭͰมߋͰ͖Δͷͱ͠ɺকདྷͷ·ͨػೳ͕༻ՄೳʹͳΔ͜ͱɺ͘͠ಛఆͷ݁ՌΛ֬͢Δ͜ͱΛҙਤ͢ΔͷͰ͋Γ ·ͤΜɻຊߨԋࢿྉɺݴٴ͞ΕΔ
*#.·ͨαʔϏεʹద༻͋Δܖ݅Λมߋ͢ΔͷͰɺՃͷද໌·ͨอূΛҙਤ͢ΔͷͰ͋Γ· ͤΜɻ ຊߨԋࢿྉʹؚ·Ε͍ͯΔ༰ɺࢀՃऀͷ׆ಈʹΑͬͯಛఆͷ݁Ռ͕ੜ͡Δͱड़Δɺ·ͨ҉ࣔ͢Δ͜ͱΛҙਤͨ͠ͷͰɺ·ͨͦͷΑ͏ͳ݁Ռ ΛੜΉͷͰ͋Γ·ͤΜɻ ύϑΥʔϚϯεɺཧ͞Εͨڥʹ͓͍ͯඪ४తͳ*#.ϕϯνϚʔΫΛ༻ͨ͠ଌఆͱ༧ଌʹج͍͍ͮͯ·͢ɻϢʔβʔ ͕ܦݧ͢Δ࣮ࡍͷεϧʔϓοτύϑΥʔϚϯεɺϢʔβʔͷδϣϒɾετϦʔϜʹ͓͚ΔϚϧνϓϩάϥϛϯάͷྔɺೖग़ྗߏɺετϨʔδߏɺ ͓Αͼॲཧ͞ΕΔϫʔΫϩʔυͳͲͷߟྀࣄ߲ΛؚΉɺଟ͘ͷཁҼʹԠͯ͡มԽ͠·͢ɻ͕ͨͬͯ͠ɺݸʑͷϢʔβʔ͕͜͜Ͱड़ΒΕ͍ͯΔͷͱ ಉ༷ͷ݁ՌΛಘΒΕΔͱ֬͢ΔͷͰ͋Γ·ͤΜɻهड़͞Ε͍ͯΔͯ͢ͷ͓٬༷ࣄྫɺͦΕΒͷ͓٬༷͕ͲͷΑ͏ʹ*#.Λ༻͔ͨ͠ɺ· ͨͦΕΒͷ͓٬༷͕ୡͨ݁͠Ռͷ࣮ྫͱͯࣔ͠͞ΕͨͷͰ͢ɻ࣮ࡍͷڥίετ͓ΑͼύϑΥʔϚϯεಛੑɺ͓٬༷͝ͱʹҟͳΔ߹͕͋Γ·͢ɻ • *#.ɺ*#.ϩΰɺJCNDPNɺ%C *#.XBUTPOY *#.$MPVEɺ ੈքͷଟ͘ͷࠃͰొ͞Εͨ*OUFSOBUJPOBM#VTJOFTT.BDIJOFT$PSQPSBUJPOͷඪͰ͢ɻଞͷ ໊͓ΑͼαʔϏε໊ɺͦΕͧΕ*#.·֤ͨࣾͷඪͰ͋Δ߹͕͋Γ·͢ɻݱ࣌Ͱͷ *#.ͷඪϦετʹ͍ͭͯɺXXXJCNDPNMFHBMDPQZUSBEFTIUNM Λ͝ཡ͍ͩ͘͞ɻ • %PDMJOH"QBDIFϥΠηϯεͰެ։͞Ε͍ͯΔΦʔϓϯιʔεͷϥΠϒϥϦʔͰ͢ɻ