Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
flutter_kaigi_2025.pdf
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kyohei Ito
November 13, 2025
Programming
1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
 flutter_kaigi_2025.pdf
Kyohei Ito
November 13, 2025
More Decks by Kyohei Ito
See All by Kyohei Ito
layerx_20241129.pdf
kyoheig3
2
520
flutterkaigi_2024.pdf
kyoheig3
0
1.8k
flutter_kaigi_2021.pdf
kyoheig3
0
1.2k
flutter_kmm_1.pdf
kyoheig3
1
1.2k
ca.swift_10.pdf
kyoheig3
0
720
iosdc_2018.pdf
kyoheig3
2
3.2k
orecon_vol1.pdf
kyoheig3
4
1.8k
iosdc_2017.pdf
kyoheig3
4
940
ca.swift_2.pdf
kyoheig3
9
1.4k
Other Decks in Programming
See All in Programming
Welcome to the "Parametricity" ðïž â Generic ã ãã© Specific ãªäžç â
guvalif
PRO
1
170
ITãã€ãªããããæŽçããŠã¿ã ïœã©ã€ããµã€ã¯ã«ãšåå ããèããåçºé²æ¢çïœ
koukimiura
1
110
åãéããsynthãéããããã§ãå±ãªã ãAIã®CDKã®æš©éãšã³ã¹ããæ©æ¢°ã§æ€èšŒããã / It Passes Type Checks, It Passes Synth Checks, but Itâs Still Risky â Automatically Verifying Permissions and Costs in AIâs CDK â
seike460
PRO
1
360
ã©ã³ãã¿ã€ã LTäŒ3åšå¹ŽïŒã©ã³ãã¿ã€ã LTäŒã3幎éç¶ããããã話
y0hgi
1
140
鹿éããã«èãïŒãTypeScriptã³ãŒãã¬ã·ãéãã§ç£šãå®è·µå
tonkotsuboy_com
4
1.1k
ãªãåãæžãã®ãïŒ TSKaigi2026ã§æ¹ããŠèãã #tskaigi_smarthr
kajitack
0
380
æèœïŒã»ã³ã¹ïŒç¥ããã ç¶ããããåã¡ã ã-- çµå©ã»åºç£ã»çãè¶ããŠãªããç§ããããã¯ããåµãç¶ããçç±
16bitidol
2
870
Foundation Models frameworkã§ç»ååæ
ryodeveloper
1
120
鳿¥œã®ããã®é¢æ°åããã°ã©ãã³ã°èšèªmimiumã«ããã倿®µéèšç®ã®æŽ»çš
tomoyanonymous
1
340
SREã¯ãMCPãšSRE Agentããã䜿ãïŒ
kazumax55
0
150
PHP ã«éšåé©çšãæ¥ããïŒâŠâŠãšããã§äœããïŒããããã®ïŒ #phpcon / phpcon-2026
shogogg
0
250
AI ãã³ãŒããæžãæä»£ã«ãããæ°åãšã³ãžãã¢ã®ä»äºé¢šæ¯ (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
Featured
See All Featured
Six Lessons from altMBA
skipperchong
29
4.3k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
Fireside Chat
paigeccino
42
4k
Are puppies a ranking factor?
jonoalderson
1
3.7k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Ten Tips & Tricks for a ð± transition
stuffmc
0
150
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
From Ï to Pie charts
rasagy
0
240
How GitHub (no longer) Works
holman
316
150k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
730
GitHub's CSS Performance
jonrohan
1033
470k
Transcript
ã¢ãã€ã«ç«¯æ«ã§åã LLM 㯠ã©ããŸã§å®çšçãªã®ã FlutterKaigi 2025
About Me äŒè€ãæå¹³ Github: KyoheiG3 X: @KyoheiG3
ãªãä»ããªã³ããã€ã¹ LLMããªã®ãïŒ
ã¯ã©ãŠã API ãšãªã³ããã€ã¹ LLM ã®æ¯èŒ æ¯èŒé ç® ã¯ã©ãŠã API ãªã³ããã€ã¹ LLM
å¿çé床 â³ (éä¿¡æéãçºç) â (éä¿¡äžèŠ) å©çšç°å¢ â (ã€ã³ã¿ãŒãããå¿ é ) â (ã©ãã§ã䜿ãã) ãã©ã€ãã·ãŒ â³ (ããŒã¿ãå€éšã«éä¿¡) â (端æ«å ã§å®çµ) ã³ã¹ã â³ (API å©çšæã»ãµãŒããŒ) ⯠(API å©çšæãŒã) ã¢ãã«æ§èœ/æ©èœ â (åžžã«ææ°ã»å·šå€§ã¢ãã«) â³ (å°åã¢ãã«ã»æ©èœå¶é)
åžå Žåå Apple Intelligence iOS 18.1 以éã§ãªã³ããã€ã¹ AI æ©èœãæäŸ Private Cloud
Compute ã§ã ã€ããªããåŠçãå®çŸ Writing ToolsãGenmojiã Image Playground ãæèŒ Gemini Nano Android 14 以éã®å¯Ÿå¿ç«¯æ«ã§ å©çšå¯èœ AICore çµç±ã§ã·ã¹ãã ã¬ãã« ã® AI ãæäŸ Pixel 8 以éãGalaxy S24 ã· ãªãŒãºãªã©ã§åäœ
æè¡ã®é²å ããŒããŠã§ã¢ ã¢ãã€ã«ãããã®æ§èœåäž çé»åå ã¢ãã« ã¢ãŒããã¯ãã£ã®é²å ãã¡ã€ã³ãã¥ãŒãã³ã° 軜éå
ããããã¯ãªã³ããã€ã¹ LLM ãäž»æµã«ïŒ
Agenda 1. ãªã³ããã€ã¹ LLM ã®åºç€ç¥è 2. Flutter ã§ LLM ãåããéžæè¢
3. ãªã³ããã€ã¹ LLM ã®å¿çšæ©èœ 4. ããã©ãŒãã³ã¹ãšå®è·µçãªèæ ®ç¹
Agenda 1. ãªã³ããã€ã¹ LLM ã®åºç€ç¥è 2. Flutter ã§ LLM ãåããéžæè¢
3. ãªã³ããã€ã¹ LLM ã®å¿çšæ©èœ 4. ããã©ãŒãã³ã¹ãšå®è·µçãªèæ ®ç¹
ãªã³ããã€ã¹ LLM ã®åºç€ç¥è 泚ç®ã®ã¢ãã« ãã©ã¡ãŒã¿æ° éåå
ã¢ãã€ã«ã§æ³šç®ã® LLM ã¢ãã« ç¹åŸŽ Google Gemma Google AI Edge ã«æé©å
Meta Llama ãªãŒãã³ãœãŒã¹ãè±å¯ãªã³ãã¥ãã㣠Microsoft Phi-3 å°èŠæš¡ãªãã髿§èœ DeepSeek é«ãæšè«ã»ã³ãŒãã£ã³ã°èœå Qwen Alibaba ã®å€èšèªå¯Ÿå¿ã¢ãã«
ãã©ã¡ãŒã¿æ°ãšã¯ïŒ LLM ãåŠç¿ã«ãã£ãŠåŸãç¥èãä¿æããããã®å€æ°ã®ç·æ°ã§ã䞻㫠ãéã¿ããšããã€ã¢ã¹ããšãã 2 çš®é¡ã®æ°å€ã§æ§æãããŠãã 4B = 40 ååã®ãã©ã¡ãŒã¿
7B = 70 ååã®ãã©ã¡ãŒã¿
ãã©ã¡ãŒã¿æ°ã¯å€ãã»ã©è¯ãã®ãïŒ è¡šçŸåãé«ããããé«å質ãªå¿ç ã¢ãã«ã®ãã¡ã€ã«ãµã€ãºã巚倧ã«ãªããåäœãããããã«å€§éã®ã¡ã¢ãª ãšé«ãèšç®èœåãå¿ èŠã«ãªã
éååïŒQuantizationïŒ éååãšã¯ãã¢ãã«ã®ããã©ã¡ãŒã¿æ°ããå€ããã«ãåãã©ã¡ãŒã¿ã 䜿çšããããŒã¿ã®ãµã€ãºãå°ããããæè¡ã§ãã¢ãã«ã®ãµã€ãºãšèšç® é床ãå€§å¹ ã«æ¹åããã ã¢ãã«ãµã€ãºãåçã«çž®å°ïŒäŸ: 14GB â 3.5GBïŒ èšç®é床ãå€§å¹ ã«åäž ãã¬ãŒããªããšããŠããããªç²ŸåºŠäœäž
éååã®ã€ã¡ãŒãž 32 ãããæµ®åå°æ°ç¹ïŒFP32ïŒ [0.17384529, -1.40821743, 0.98712456, -0.02941837, ...] â 8
åå§çž® 8 ãããæŽæ°ïŒINT8ïŒ ç¯å²: -128 ïœ 127 [14, -115, 80, -2, ...] â ããã« 2 åå§çž® 4 ãããæŽæ°ïŒINT4ïŒ ç¯å²: -8 ïœ 7 [7, -8, 4, -1, ...]
ãã©ã¡ãŒã¿æ°ãšéååã®é¢ä¿æ§ã®å ·äœäŸ éååå éåååŸ ãã©ã¡ãŒã¿æ° 7B (70 å) 7B (70 å)
ãããå¹ 32 ããã (FP32) 4 ããã (INT4) ãµã€ãºïŒæŠç®ïŒ çŽ 28GB çŽ 3.5GB â»éåååãµã€ãºæŠç®: 70 å Ã4 ãã€ã = çŽ 280 åãã€ã = çŽ 28GB â»éåååŸãµã€ãºæŠç®: 70 å Ã0.5 ãã€ã = çŽ 35 åãã€ã = çŽ 3.5GB
ãã¡ã€ã«åããèŠãéååã®çš®é¡ gemma-3n-E4B-it-int4.task ææš æå³ E4B 40 åãã©ã¡ãŒã¿ã¢ãã« it æç€ºãã¥ãŒãã³ã°ïŒãã¡ã€ã³ãã¥ãŒãã³ã°ïŒæžã¿ int4
4 ãããéåå
Agenda 2. Flutter ã§ LLM ãåããéžæè¢ 1. ãªã³ããã€ã¹ LLM ã®åºç€ç¥è
3. ãªã³ããã€ã¹ LLM ã®å¿çšæ©èœ 4. ããã©ãŒãã³ã¹ãšå®è·µçãªèæ ®ç¹
Flutter ã§ LLM ãåããéžæè¢ ã©ã®ãã©ãŒãããã®ã¢ãã«ã䜿ããã§ãå©çšããã©ã€ãã©ãªãå€ãã ã¢ãã«ãã©ãŒããã ã©ã€ãã©ãªäŸ GGUF llama.cpp ããŒã¹
TaskïŒLiteRT-LMïŒ MediaPipe ããŒã¹ Cactus Cactus Compute ããŒã¹
GGUF ãã©ãŒããã åºæ¬çã«ã¯ãã«ãã¢ãŒãã«æªå¯Ÿå¿ã®ããã¹ãããŒã¹ã¢ãã«ã§ãCPU ã§ ã®é«éæšè«ã«æé©åãããŠãã ã¢ãã«ãšããŒã¯ãã€ã¶ãäžäœåãããŠãã éååæžã¿ã¢ãã«ã®ãµããŒããå å® äžéšã®ã¢ãã«ã§ãã«ãã¢ãŒãã«å¯Ÿå¿ãå¯èœ llama_cpp_dart ãªã©ã®ããã±ãŒãžã§å©çšå¯èœ
llama_cpp_dartïŒããã¹ãïŒ Llama.libraryPath = 'bin/MAC_ARM64/libllama.dylib'; final llama = Llama( '/path/to/model.gguf', );
llama.setPrompt('2 + 2 = ?'); while (true) { var (token, done) = llama.getNext(); print(token); if (done) break; } llama.dispose();
llama_cpp_dartïŒç»å + ããã¹ãïŒ Llama.libraryPath = 'bin/MAC_ARM64/libmtmd.dylib'; final llama = Llama(
'/path/to/model.gguf', ... '/path/to/mmproj-model.gguf', ); final image = LlamaImage.fromFile(File('/path/to/image.png')); final prompt = """ <start_of_turn>user <image> ç»åã«ã€ããŠèª¬æããŠãã ããã <start_of_turn>model """; final stream = llama.generateWithMedia(prompt, inputs: [image]); await for (final token in stream) { print(token); } llama.dispose();
TaskïŒLiteRT-LMïŒãã©ãŒããã ãã«ãã¢ãŒãã«å¯Ÿå¿ã§ GPU ã NPU ãæŽ»çšããé«éæšè«ã«æé©åã ããŠããŠããã¡ã€ã«èªäœã¯ unzip å¯èœ ãã«ãã¢ãŒãã«å¯Ÿå¿ïŒããã¹ããç»åãªã©ïŒ
GPU ã NPU ãæŽ»çšããé«éæšè« ãã¡ã€ã«ã¯ unzip å¯èœã§äžèº«ã確èªã§ãã flutter_gemma ã ai_edge ãªã©ã®ããã±ãŒãžã§å©çšå¯èœ
flutter_gemmaïŒããã¹ãïŒ await FlutterGemma.installModel( modelType: ModelType.gemmaIt, ).fromNetwork( 'url_to_model', ).install(); final model
= await FlutterGemma.getActiveModel(); final chat = await model.createChat(); await chat.addQueryChunk(Message.text( text: '2 + 2 = ?', isUser: true, )); await for (final response in chat.generateChatResponseAsync()) { if (response is TextResponse) { print(response.token); } } await chat.close(); await model.close();
flutter_gemmaïŒç»å + ããã¹ãïŒ final model = await FlutterGemma.getActiveModel( preferredBackend: PreferredBackend.gpu,
supportImage: true, ); final chat = await model.createChat(supportImage: true); await chat.addQueryChunk(Message.withImage( text: ' ç»åã«ã€ããŠèª¬æããŠãã ããã', imageBytes: imageBytes, isUser: true, )); await for (final response in chat.generateChatResponseAsync()) { if (response is TextResponse) { print(response.token); } } await chat.close(); await model.close();
Cactus ãã©ãŒããã ãªã³ããã€ã¹ã§ã®å©çšã«ç¹åããŠããã ARM CPU ã¢ãŒããã¯ãã£ ã«æé©åãããŠãã ARM CPU ã¢ãŒããã¯ãã£ã«æé©å
FFI ãå©çšããã¯ãã¹ãã©ãããã©ãŒã å¯Ÿå¿ FlutterãReact NativeãKMP ã§å©çšå¯èœ cactus-flutter ããã±ãŒãžã§å©çšå¯èœ
cactus-flutterïŒããã¹ãïŒ final lm = CactusLM(); await lm.downloadModel(model: 'qwen3-0.6'); await lm.initializeModel();
final streamedResult = await lm.generateCompletionStream( messages: [ChatMessage(content: '2 + 2 = ?', role: 'user')], ); await for (final chunk in streamedResult.stream) { print(chunk); } lm.unload();
cactus-flutterïŒé³å£°ïŒ final stt = CactusSTT(); await stt.download(model: 'whisper-tiny'); await stt.init(model:
'whisper-tiny'); final result = await stt.transcribe(); print(result.text); stt.dispose();
ai_edge MediaPipe ããŒã¹ ã¢ãã«ã®ããŠã³ããŒã ãã«ãã¢ãŒãã«å¯Ÿå¿
ai_edge ã§ã®å®è¡äŸ final downloader = ModelDownloader(); final result = await
downloader.downloadModel( Uri.parse('url_to_model'), ); await AiEdge.instance.initialize( modelPath: result.filePath, ); final stream = AiEdge.instance.generateResponseAsync('2 + 2 = ?'); await for (final event in stream) { print(event.partialResult); }
èšå®å¯èœãªãã©ã¡ãŒã¿äŸ await aiEdge.initialize( modelPath: '/path/to/model.task', // å¿ é : ã¢ãã«ãã¡ã€ã«ã®ãã¹ maxTokens: 2048,
// æå€§çæããŒã¯ã³æ° preferredBackend: PreferredBackend.gpu, // ããŒããŠã§ã¢ããã¯ãšã³ã maxNumImages: 3, // ãã«ãã¢ãŒãã«å ¥åæã®æå€§ç»åæ° temperature: 0.7, // ã©ã³ãã æ§ã®å¶åŸ¡ïŒ0.0-1.0 ïŒ randomSeed: 42, // åçŸæ§ã®ããã®ä¹±æ°ã·ãŒã topK: 50, // Top-K ãµã³ããªã³ã° topP: 0.95, // Top-P ïŒnucleus ïŒãµã³ããªã³ã° supportedLoraRanks: [4, 8], // LoRA ã¢ããã¿ãŒã®ã©ã³ã¯ïŒãã¡ã€ã³ãã¥ãŒãã³ã°çšïŒ loraPath: '/path/to/lora_adapter.bin', // LoRA ã¢ããã¿ãŒã®ãã¹ enableVisionModality: true, // Vision æ©èœã®æå¹å );
å®è¡æã®æ³šæç¹ ã¡ã¢ãªã¯ã¢ãã«ãµã€ãºã«å¿ã㊠4-8GB 以äžå¿ èŠ ã¢ãã«ãµã€ãºã倧ããå Žåã¯ã¢ããªã®èšå®å€æŽãå¿ èŠ å·šå€§ãªã¢ãã«ã®ã¢ããªãžã®ãã³ãã«ã¯äžå¯èœ <dict> <key>com.apple.developer.kernel.increased-memory-limit</key> <true/> </dict>
<application android:largeHeap="true" ... >
HuggingFace AI ã¢ãã«ãå ±æã»å ¬éãããã©ãããã©ãŒã ã§ãã¢ã«ãŠã³ãç»é²ãè¡ ãããšã§æ°äžçš®é¡ã®åŠç¿æžã¿ã¢ãã«ãç¡æã§å©çšå¯èœ ã¢ãã«ã«ãã£ãŠã¯ã©ã€ã»ã³ã¹åæãå¿ èŠïŒLlamaãGemma ãªã©ïŒ huggingface_hubïŒPythonïŒ ã Web ããããŠã³ããŒãå¯èœ
åçšå©çšæã¯ã¢ãã«ããšã®ã©ã€ã»ã³ã¹æ¡é ãå¿ ã確èª
Agenda 3. ãªã³ããã€ã¹ LLM ã®å¿çšæ©èœ 1. ãªã³ããã€ã¹ LLM ã®åºç€ç¥è 2.
Flutter ã§ LLM ãåããéžæè¢ 4. ããã©ãŒãã³ã¹ãšå®è·µçãªèæ ®ç¹
ãªã³ããã€ã¹ LLM ã®å¿çšæ©èœ ã¢ãã«ãåŠç¿ããæç¹ãŸã§ã®ç¥èãããªã ä»äœæïŒ â ãªã¢ã«ã¿ã€ã ã®æå»ãããããªã 仿¥ã®æ±äº¬ã®å€©æ°ã¯ïŒ â ææ°ã®å€©æ°æ å ±ãååŸã§ããªã
2025 幎ã®åºæ¥äºã¯ïŒ â åŠç¿æç¹ä»¥éã®æ å ±ãæããªã
Function Calling ïŒToolïŒ
Function CallingïŒToolïŒ LLM ã«å€éšã®é¢æ°ã API ãåŒã³åºãããä»çµã¿ã§ãã¢ãã«ã®ç¥èã è£å®ããææ°æ å ±ãç¹å®ã®æ©èœãå©çšå¯èœã«ãã å€©æ°æ å ±ã®ååŸ èšç® ããŒã¿ããŒã¹æ€çŽ¢
etc.
Function CallingïŒToolïŒ ã®æµã 1. å©çšå¯èœãªé¢æ°ã®ã¹ããŒãïŒååã»åŒæ°ã»èª¬æïŒãå®çŸ© 2. ãŠãŒã¶ãŒã®ãªã¯ãšã¹ããšé¢æ°ã¹ããŒãã LLM ã«æž¡ã 3.
LLM ãå¿ èŠãªé¢æ°ãšåŒæ°ã JSON 圢åŒã§è¿ç 4. ã¢ããªåŽã§å®éã®é¢æ°ãå®è¡ 5. 颿°ã®å®è¡çµæã LLM ã«æž¡ã 6. LLM ãçµæãèžãŸããŠãŠãŒã¶ãŒã«æçµåçãçæ
ai_edge ã§ã®é¢æ°èšå®äŸ final getWeather = FunctionDeclaration( name: 'get_weather', description: 'Get
current weather for a location', properties: [ FunctionProperty( name: 'location', description: 'City name', type: PropertyType.string, required: true, ), ], ); await aiEdge.setFunctions([getWeather]);
ai_edge ã§ã®é¢æ°å®è¡äŸ final response = await aiEdge.sendMessage( Message(role: 'user', text:
' 仿¥ã®æ±äº¬ã®å€©æ°ãæããŠãã ããã'), ); if (response.functionCall != null) { final call = response.functionCall!; switch (call.name) { case 'get_weather': final location = call.args.fields['location'] as String; final weather = await getWeather(location); final functionResponse = FunctionResponse( functionCall: call, response: {'result': weather}, ); final finalResponse = await aiEdge.sendFunctionResponse(functionResponse); print(finalResponse.text); } }
å®è£ æã®æ³šæç¹ LLM ãæå³ããªãå€ã JSON ã§è¿ãå¯èœæ§ããã å®è¡ãã颿°ãå¶éã»æ€èšŒããŠã»ãã¥ãªãã£ã®å¯Ÿçãå¿ èŠ
ai_edge ãå©çšãã Function Calling ã®å¶çŽ Android ã§ããå©çšã§ããŸããïŒçŸç¶ã§ã¯ïŒ
iOS ã§ã®å®è£ ã«ææŠããŸããã... FST å¶çŽã®å®è£ ããªããAndroid çšãã€ããªã®æäŸãããããŠããªã å¥ã®ã©ã€ãã©ãªãçµã¿èŸŒãå¿ èŠããã
FST å¶çŽãšã¯ïŒ LLM ã®åºåãç¹å®ã®åœ¢åŒãã«ãŒã«ã«åŸãããå¶çŽããæè¡ JSON ãªã©ã®æ§é åãã©ãŒãããã®å³å¯ãªéµå®ãåŒ·å¶ åºåã®äžè²«æ§ãšä¿¡é Œæ§ãåäž æå³ããªããå 容ãã¯è¿ãããå¯èœæ§ããã
ããã³ãããšã³ãžãã¢ãªã³ã°ã«ãã FST ã®ä»£æ¿ ããã³ããèšèšã«ãã颿°åŒã³åºãã®åœ¢åŒãæš¡å£å¯èœ FST å¶çŽãªãã§å®è£ ã§ãããããã©ãŒãããéµå®ã®ä¿¡é Œæ§ã¯äœäž ã·ã¹ãã : ããªãã¯å€©æ°æ å ±ãæäŸãã颿° get_weather(location: "location")
ãæã£ãŠããŸãã 倩æ°ã«é¢ãã質åã«ã¯ä»¥äžã®ãã㪠json 圢åŒã§å¿ èŠãªé¢æ°ãåŒã³åºããŠãã ãã `{ "function": "get_weather", "args": { "location": " æ±äº¬" } }` ãŠãŒã¶ãŒ: 仿¥ã®å€§éªã®å€©æ°ãæããŠãã ããã
ããã³ãããšã³ãžãã¢ãªã³ã°ã®æ³šæç¹ 颿°åŒã³åºãã®ãã©ãŒããããæç¢ºã«å®çŸ©ãã Few-shot äŸã瀺ã㊠LLM ã«ãã©ãŒããããåŠç¿ããã å°åã¢ãã«ã§ã¯æç€ºã«åŸããªãã±ãŒã¹ããã JSON ããŒã¹ãšã©ãŒãžã®å¯Ÿå¿ãå¿ é
Function CallingïŒToolïŒãŸãšã 颿°åŒã³åºããš SaaS API ãªã©ã®çµã¿åããã§ææ°æ å ±ãååŸå¯èœ ããã³ãããšã³ãžãã¢ãªã³ã°ãšããä»£æ¿ææ®µããã
Retrieval Augmented Generation ïŒRAGïŒ
Retrieval Augmented GenerationïŒRAGïŒ èšå€§ãªããã¥ã¡ã³ãããé¢é£æ§ã®é«ãæ å ±ãæ€çŽ¢ããLLM ã«åèæ å ±ãšããŠæž¡ãããšã§ãã¢ãã«ã®ç¥èãè£å®ããä»çµã¿ 瀟å FAQ ã·ã¹ãã æè¡ããã¥ã¡ã³ãæ€çŽ¢
補åããã¥ã¢ã«å¯Ÿå¿
RAG ã®æµã 1. ããã¹ãã®ã¯ãªãŒãã³ã°ãšãã£ã³ã¯åå² 2. ãã¯ãã«åïŒEmbeddingïŒ 3. Vector DB ã®æ§ç¯
4. ã¯ãšãªã®ãã¯ãã«åãšæ€çŽ¢ 5. æ€çŽ¢çµæãåºã«åçãçæ
RAG ã·ã¹ãã ã®æ§æèŠçŽ èŠçŽ èª¬æ Tokenizer ããã¹ããããŒã¯ã³ã«åå² Embedder ããŒã¯ã³ããã¯ãã«ã«å€æ Vector DB
ãã¯ãã«ãšããã¹ããä¿åã»æ€çŽ¢ Retriever æ€çŽ¢ããã»ã¹å šäœãçµ±æ¬
ai_edge ã§ã®å®è¡äŸ await aiEdge.createEmbeddingModel( tokenizerModelPath: '/path/to/tokenizer.model', embeddingModelPath: '/path/to/embedding.tflite', modelType: EmbeddingModelType.gemma,
vectorStore: VectorStore.sqlite, preferredBackend: PreferredBackend.gpu, ); await aiEdge.memorizeChunks([ 'Flutter 㯠UI ãã¬ãŒã ã¯ãŒã¯', 'Python ã§æ©æ¢°åŠç¿ãå®è£ ', 'Dart èšèªã§ã¢ããªéçº', ]);
ai_edge ã§ã®æ€çŽ¢äŸ final stream = aiEdge.generateResponseAsync( 'Flutter ã®ç¹åŸŽãæããŠãã ããã', ); await
for (final event in stream) { print(event.partialResult); }
RAG å®è£ æã®æ³šæç¹ å©çšããããã¥ã¡ã³ãã®ååŠçãšãã£ã³ã¯åå²ãé©åã«è¡ã æ€çŽ¢çµæãšããã³ããã®ããŒã¯ã³äžéã管ç
ai_edge ãå©çšãã RAG ã®å¶çŽ Android ã§ããå©çšã§ããŸããïŒçŸç¶ã§ã¯ïŒ
iOS ã§ã®å®è£ ã«ææŠããŸããã... Android çšã®ãã€ããªããæäŸãããŠããªã Text Chunking ã EmbeddingãVector DB ã®å®è£ ãå¿ èŠ
å®å šæš¡å£ããã«ã¯ Function Calling ããå®è£ ããŒãã«ãé«ããã
Text Chunking ãšã¯ïŒ ããã¹ããæå³çãªåäœã«åå²ããããã»ã¹ã§ãæ€çŽ¢ç²ŸåºŠãåŠçå¹ç ãåäžããã èªç¶ãªæã®å¢çã§åå²ïŒäŸ: æã段èœãã»ã¯ã·ã§ã³ïŒ ãã£ã³ã¯ãµã€ãºã®æé©åïŒäŸ: 500 ããŒã¯ã³çšåºŠïŒ
é·ãããã¥ã¡ã³ãïŒäŸ: æè¡ææžã3000 ããŒã¯ã³ïŒ â Text Chunking ãã£ã³ã¯1: "LLM ãšã¯å€§èŠæš¡èšèªã¢ãã«ã®ããšã§..." (500 ããŒã¯ã³) ãã£ã³ã¯2: " éååã¯ã¢ãã«ãµã€ãºãåæžããæè¡ã§..." (500 ããŒã¯ã³) ãã£ã³ã¯3: "RAG ã¯å€éšç¥èãæŽ»çšããææ³ã§..." (500 ããŒã¯ã³) ãã£ã³ã¯4: "Flutter ã§ã®å®è£ æ¹æ³ãšããŠ..." (500 ããŒã¯ã³) ...
Embedding ãšã¯ïŒ ããã¹ãããŒã¿ãæ°å€ãã¯ãã«ã«å€æããæè¡ã§ãæå³çãªé¡äŒŒæ§ã èšç®å¯èœã«ãã äºååŠç¿æžã¿ã®è»œéã¢ãã«ãå©çš ãã¯ãã«ç©ºéã§ã®é¡äŒŒåºŠèšç® " ç«ã奜ã" â Tokenizer
[" ç«", " ã", " 奜ã"] â [1234, 5, 6789] â Embedder [0.23, -0.41, 0.87, 0.15, ...] â æå šäœã®ãã¯ãã«ïŒäŸ: 384 次å ïŒ
Vector DB ãšã¯ïŒ ãã¯ãã«åãããããã¥ã¡ã³ããä¿åããé«éãªé¡äŒŒåºŠæ€çŽ¢ãå¯èœã« ããããŒã¿ããŒã¹ ã€ã³ã¡ã¢ãªå®è£ ãŸãã¯æ°žç¶åå®è£ ãéžæå¯èœ FAISSãObjectBoxãSQLite + ãã¯ãã«æ¡åŒµãªã©ãå©çšå¯èœ Vector
DB: ID | å ã®æç« ã | ãã¯ãã« 1 | "Flutter 㯠UI ãã¬ãŒã ã¯ãŒã¯" | [0.23, -0.41, 0.87, 0.15, ...] 2 | "Python ã§æ©æ¢°åŠç¿ãå®è£ " | [0.11, 0.34, -0.56, 0.78, ...] 3 | "Dart èšèªã§ã¢ããªéçº" | [-0.45, 0.67, 0.12, -0.34, ...] ... æ€çŽ¢çµæ: ID 1 ( é¡äŒŒåºŠ 0.98), ID 3 ( é¡äŒŒåºŠ 0.85)
RAG ãŸãšã å ¬éã§ããªãç€Ÿå ææžãæ©å¯æ å ±ãå«ããåççæ ãã¯ãã«æ€çŽ¢ãšæšè«ã®äž¡æ¹ã®åŠçã®è² è·ã«æ³šæ
Agenda 4. ããã©ãŒãã³ã¹ãšå®è·µçãªèæ ®ç¹ 1. ãªã³ããã€ã¹ LLM ã®åºç€ç¥è 2. Flutter ã§
LLM ãåããéžæè¢ 3. ãªã³ããã€ã¹ LLM ã®å¿çšæ©èœ
ã¢ãã«ïŒã©ã€ãã©ãªïŒã®éžæã«ã€ã㊠ã©ããããè€éãªã¿ã¹ã¯ã®åŠçãå¿ èŠã ãã«ãã¢ãŒãã«ã«å¯Ÿå¿ããå¿ èŠãããã æ¥æ¬èªã®å ¥åºåãå¿çé床ã®èŠä»¶
ããã€ã¹ã«ã€ã㊠ã¡ã¢ãªã¯ã¢ãã«ã«å¿ã㊠4-8GB 以äžãæšå¥š 宿©ã§ã®æšè«é床㯠1B-4B ã¢ãã«ã§ 5-20 ããŒã¯ã³/ç§çšåºŠ
ã¢ããªãžã®çµã¿èŸŒã¿ã«ã€ã㊠ã¢ãã«ã®ãµã€ãºã倧ããããã¢ããªã«ãã³ãã« ã¯å°é£ ååèµ·åæãªã©ã«å¥éããŠã³ããŒãããä»çµã¿ ãçšæãã 倧ããã¢ãã«ãå©çšããå Žåã¯ã¢ããªã®èšå®å€ æŽãå¿ èŠ
ã¢ããªã® UX ã«ã€ã㊠å®åã®æåå ¥åãé³å£°å ¥åãªã©ãå ¥åäœéšãå·¥ 倫ããå¿ èŠããã ããŒã¯ã³ã®äžéãå°ããã®ã§ãé·ãäŒè©±ã®å±¥æŽ ã®ä¿æãé£ãã æååºåã®äœéšãšããŠã¯ã¹ããªãŒãã³ã°ã奜㟠ãããã Function
Calling ãªã©ãšçžæ§ãæªã å Žåããã
Function Calling ã®æšè«åæ° final response = await aiEdge.sendMessage( Message(role: 'user',
text: ' 仿¥ã®æ±äº¬ã®å€©æ°ãæããŠãã ããã'), ); if (response.functionCall != null) { final call = response.functionCall!; switch (call.name) { case 'get_weather': final location = call.args.fields['location'] as String; final weather = await getWeather(location); // å床æšè«ã¯è¡ããã«ã颿°ã®å®è¡çµæããŠãŒã¶ãŒã«è¿ãããã«å·¥å€«ãã } }
å¿çé床ãšåçåè³ªã®æ¹å ãã©ã¡ãŒã¿æ°ãå€ãã»ã©é«å質ã ãã軜éãªã¢ãã«ã®æ¹ãéã æ¥æ¬èªããè±èªã®æ¹ããã³ã¹ããé床ãå質ã®é¢ã§æå© ã·ã¹ãã ããã³ããã Few-shot åŠç¿ã掻çšããŠåçã®å質ãåäž
ãªã³ããã€ã¹ LLM ã§å©çšã§ããã©ã€ãã©ãª ã©ã€ãã©ãª ç»åå ¥å é³å£°å ¥å Function Calling RAG llama_cpp_dart
(ããã³ãã) flutter_gemma (ããã³ãã) ai_edge (æªå®è£ ) (Android) (Android) cactus-flutter
ãŸãšã Flutter ã§ã®å®è£ ãåŸã ã«çŸå®çã«ãªã£ãŠããŠãã ã¢ãã«éžæãããã©ãŒãã³ã¹æé©åãUX ãã¶ã€ã³ãæåã®éµ äžè¬ãŠãŒã¶ãŒåãã®ã¢ããªã§ã¯ãŸã ãŸã 課é¡ãå€ã
åè URL ai_edge: https://github.com/KyoheiG3/ai_edge llama_cpp_dart: https://github.com/netdur/llama_cpp_dart flutter_gemma: https://github.com/DenisovAV/flutter_gemma cactus-flutter: https://github.com/cactus-compute/cactus-
flutter HuggingFace: https://huggingface.co/
Thanks! Github: KyoheiG3 X: @KyoheiG3