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
Kyohei Ito
November 13, 2025
Programming
1.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.9k
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
210
ãå¯ãŠãŠãä»äºãé²ããClaude Codeã§çµã第äºã®è³
tomoyafujita2016
0
310
PHP ã«éšåé©çšãæ¥ããïŒâŠâŠãšããã§äœããïŒããããã®ïŒ #phpcon / phpcon-2026
shogogg
0
600
Claude CodeãšAgentCore Gatewayãç¹ãéã®èªèšŒèªå¯ / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
260
é²åãç¶ããGo toolsã®çŸåšå° / The Current State of Ever-Evolving Go Tools
hond0413
0
160
5åã§å蚺ïŒComposer ã»ãã¥ãªãã£å¥åº·èšºæ
codmoninc
0
920
AIæä»£ã®PHPerçåæŠç¥ ïœãèšèªããããªãã§ããããªãïŒãã«æ¬æ°ã§åãåãïœ
vivion
0
310
ããã£ãŠ Effect ã§ã§ããã®ã§ã¯? / TSKaigi Mashup Kansai #2
susisu
0
150
ç¶ç¶ã¢ãããšãªã¢ã¯ãã£ãããã°ã©ãã³ã°
yukikurage
3
700
Apache Hive: ãããŠCloud Native Lakehouseãž
okumin
1
210
ããããã解説 èšèšç·šã»äžçŽ #1ãäžã€ã®è»ã«ãé転æã¯äžäººãïœããå庫ã·ã¹ãã ã®äºäŸããïœ
panda728
PRO
0
210
èšèã®æ Œéæã®ã¹ã¹ã¡ïœçŽãšãã³ãšèšèããå§ããããã£ãªã¢ã®æãæ¹ïœ
progresscicada
2
140
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
460
What's in a price? How to price your products and services
michaelherold
247
13k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Technical Leadership for Architectural Decision Making
baasie
3
470
Discover your Explorer Soul
emna__ayadi
2
1.2k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
ãã³ãããã£ã³ã¹ã«ïŒæªæ¥ãã€ãããããã¯ãããŒãããã #pmconf2020
aki_iinuma
128
56k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
990
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