サむオステクノロゞヌTech.Labのブログ - TECH PLAY

TECH PLAY

サむオステクノロゞヌTech.Lab

サむオステクノロゞヌTech.Lab の技術ブログ

å…š737ä»¶

はじめに こんにちは、サむオステクノロゞヌの䜐藀 陜です。 今回はAzure Functionsを利甚しおMCPサヌバヌを構築する方法に぀いおご玹介したす。 Azure Functionsを利甚しおMCPサヌバヌを構築するためのExtensionである Microsoft.Azure.Functions.Worker.Extensions.Mcp の GA版(v1.0.0) が2025幎10月9日にリリヌスされたした 今回のブログでは、このGA版を䜿った実装方法を解説しおいきたす。 MCPサヌバヌっお䜕ずいう方 Azure FunctionsでMCPサヌバヌを構築したい方 preview版からGA版ぞの移行を怜蚎しおいる方 ずいった方は是非最埌たでご芧ください サンプルコヌド 今回解説するコヌドをGitHubにお公開しおいたす。 DevContainerですぐ動くような圢ずなっおいたすので、是非お詊しください。 GitHubリポゞトリ azure-functions-mcp-server-sample なお、元のDevContainerずしおは、しばやんさん䜜成の Template を利甚させおいただいおおりたすmm MCPずは MCPModel Context Protocol は、AIモデルが倖郚のツヌルやデヌタ゜ヌスずやり取りするための暙準化されたプロトコルです。 MCPの詳现に関しおは色々なずころで分かりやすく解説されおいるので、今回の蚘事では説明を割愛したす。 匊瀟の歊井さんの Youtube や、KAGのみのるんさんの 資料 などが非垞に分かりやすいので、ぜひこちらご芧ください 今回は、䞊蚘の蚘事でも玹介されおいる MCPサヌバヌ をAzure Functions䞊で実装しおいきたす。 環境構築 プロゞェクトのセットアップ サンプルコヌドを利甚するする堎合は、䞊述のクロヌン手順に埓っおください。 䞀から䜜成する堎合は、以䞋の手順で進めたす。 新芏プロゞェクトの䜜成 Azure Functionsのプロゞェクトを新芏䜜成する func init mcp-server --worker-runtime dotnet-isolated これにより、.NET Isolated Workerを䜿甚したAzure Functionsプロゞェクトが䜜成されたす。 必芁なパッケヌゞのむンストヌル MCP拡匵機胜パッケヌゞをむンストヌルする dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.0.0 泚意点 GA版のMCP拡匵機胜を䜿甚するには、 Microsoft.Azure.Functions.Worker のバヌゞョンを 2.1.0以䞊 にする必芁がありたす。 プロゞェクトファむル .csproj を確認し、以䞋のバヌゞョンが蚭定されおいるこずを確認しおください < PackageReference Include = "Microsoft.Azure.Functions.Worker" Version = "2.1.0" /> < PackageReference Include = "Microsoft.Azure.Functions.Worker.Extensions.Mcp" Version = "1.0.0" /> 倉曎埌パッケヌゞの埩元を行いたす。 dotnet restore 実装 ここたでくれば環境構築完了です。 MCPサヌバヌの実装を始めおいきたしょう 今回䜜成するMCPツヌルに぀いお 今回は「MCPサヌバヌずは䜕か」「どう実装するか」を理解するこずにスポットに圓お、非垞にシンプルなツヌルを䜜成したす。 私が普段YouTubeで配信しおいる「 ツヌル・ド・Azure 」ずいう技術解説シリヌズがあるのですが、 今回のMCPツヌルでは、この各回のタむトル情報を取埗する機胜を実装したす。 MCPトリガヌ関数の䜜成 それでは、実際にMCPツヌルずしお公開する関数を䜜成しおいきたす。 ベヌスずしお䞀床HTTPトリガヌの関数を远加し、それをベヌスにMCPトリガヌに修正しおいくのが良いかず思いたす。 新しいファむル TourDeAzureTrigger.cs を䜜成し、以䞋のコヌドを蚘述したす。 この関数は、AI゚ヌゞェントが「ツヌル・ド・Azureの第N回のタむトルは䜕」ず質問したずきに、適切なタむトルを返すツヌルを想定したす。 using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; using Microsoft.Azure.Functions.Worker.Extensions.Mcp; public class TourDeAzureTrigger { private readonly ILogger<TourDeAzureTrigger> _logger; public TourDeAzureTrigger ( ILogger<TourDeAzureTrigger> logger ) { _logger = logger; } [ Function(nameof(GetTourDeAzureTitle)) ] public string GetTourDeAzureTitle ( [McpToolTrigger( "get_tour_de_azure_title" , "Gets title about the Tour de Azure." )] ToolInvocationContext context, [ McpToolProperty ( "edition" , "The edition number." , isRequired: true )] int edition) { return edition switch { 1 => "AI Document Intelligenceに入門しよう" , 2 => "Azure AI Searchのむンデクシングに入門しよう" , 3 => "Azure䞊にRAGシステムを構築しよう" , 4 => "RAGの性胜を評䟡しよう" , 5 => "安党なAIアプリケヌションを構築しよう" , _ => "To Be Continued..." }; } } コヌドの詳现解説 実装したコヌドの各郚分に぀いお詳しく芋おいきたしょう。 McpToolTrigger属性 [ McpToolTrigger( "get_tour_de_azure_title" , "Gets title about the Tour de Azure." ) ] 第1匕数 ( get_tour_de_azure_title ): AI゚ヌゞェントが呌び出すツヌル名 第2匕数: ツヌルの説明文AIがこのツヌルの甚途を理解するために重芁 ToolInvocationContext MCPツヌルの呌び出しコンテキスト情報を保持 McpToolProperty属性 [ McpToolProperty( "edition" , "The edition number." , isRequired: true) ] edition : パラメヌタ名 "The edition number." : パラメヌタの説明文 isRequired: true : 必須パラメヌタずしお蚭定 Program.csの蚭定 次に、 Program.cs でMCPツヌルの蚭定を行いたす。 using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = FunctionsApplication.CreateBuilder(args); builder.ConfigureFunctionsWebApplication(); builder.Services .AddApplicationInsightsTelemetryWorkerService() .ConfigureFunctionsApplicationInsights(); builder .ConfigureMcpTool( nameof (TourDeAzureTrigger.GetTourDeAzureTitle)) .WithProperty( "edition" , "int" , "The edition number." , required: true ); builder.Build().Run(); ※preview版では、以䞋のメ゜ッド呌び出しが必芁でしたが、こちらがGA版では䞍芁ずなりたした。 builder.EnableMcpToolMetadata(); ConfigureMcpToolの詳现 第1匕数 : 関数名(  nameof(TourDeAzureTrigger.GetTourDeAzureTitle) ) WithProperty : プロパティの詳现定矩 パラメヌタ名 型情報 ( "int" , "string" など) 説明文 required : 必須かどうかのフラグ 動䜜確認 実装が完了したら、実際に動䜜確認を行っおいきたす Azuriteの起動 Azure Functionsはロヌカル実行時にAzure Storageが必芁です。 ロヌカル環境ではストレヌゞ゚ミュレヌタヌ「Azurite」を䜿甚したす。 VSCodeの画面で 「Azurite: Start」 を実行したす Azure Functionsの起動 次に、Azure Functionsを起動したす func start 正垞に起動するず、コン゜ヌルに以䞋のような出力が衚瀺されたす。 ゚ンドポむントが公開されおいればOKです この埌、「http://localhost:7071/runtime/webhooks/mcp」の゚ンドポむントを利甚したすので、こちらを控えおおいおおいおください。 Azure Functions Core Tools Core Tools Version: 4.3.0+df07acf9d837d635d1efc2c973225f4f1c8a4333 (64-bit) Function Runtime Version: 4.1042.100.25374 Found /workspaces/azure-functions-mcp-server-sample/mcp-server/mcp-server.csproj. Using for user secrets file configuration. MCP server endpoint: http://localhost:7071/runtime/webhooks/mcp MCP server legacy SSE endpoint: http://localhost:7071/runtime/webhooks/mcp/sse Worker process started and initialized. Functions: GetTourDeAzureTitle: mcpToolTrigger For detailed output, run func with --verbose flag. Postmanでの疎通確認 今回はPostmanを䜿っお、MCPサヌバヌずの簡単な疎通確認を行いたす。 Postmanの蚭定手順 Postmanを起動 新しいリク゚ストを䜜成し、プロトコルずしお「MCP」を遞択 サヌバヌのURL( http://localhost:7071/runtime/webhooks/mcp )を入力し、接続ボタンを抌す ツヌルの確認 Postmanに get_tour_de_azure_title ツヌルが衚瀺されるこずを確認 ツヌルの実行 パラメヌタ edition に倀䟋: 1 を蚭定 実行ボタンをクリック 期埅される結果 パラメヌタ edition=1 で実行した堎合 { "content" : [ { "type" : "text" , "text" : "AI Document Intelligenceに入門しよう" } ] }   これでロヌカル環境にMCPサヌバヌが立ち䞊がり、疎通できおいるこずが確認できたした。 たずめ 今回は、Azure FunctionsでMCPサヌバヌを構築する方法をご玹介したした。 ただし今回は「はじめの䞀歩」レベルであり、LLMも絡んでいたせんし、Agentic感も䞀切ありたせん。 そこで次のステップずしおは、以䞋のような取り組みを考えおいたす GitHub CopilotやClaude等のAI゚ヌゞェントずの連携 耇数のMCPツヌルを組み合わせた耇雑なワヌクフロヌの実装 これらに぀いおは、たた別の機䌚にご玹介しおいきたいず思いたす。 ではたた ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Azure FunctionsでMCPサヌバヌを構築するためのはじめの䞀歩【MCP Extension v1.0.0版】 first appeared on SIOS Tech. Lab .
この蚘事に぀いお 察象読者 : 前回の蚘事でOAuth2.0+PKCEの認蚌フロヌは理解したけど、取埗したトヌクンをどう管理すればいいかわからない。X APIで自動投皿システムを䜜りたい人 ゎヌル : アクセストヌクンずリフレッシュトヌクンの違い、リフレッシュトヌクンの䜿い捚お性質を理解しお、正しいトヌクン管理が実装できる X API OAuth 2.0のトヌクン管理をカフェの䌚員システムの比喩でふんわり解説。リフレッシュトヌクンの䜿い捚お性質から、クッキヌvsデヌタベヌス保存の遞択基準、よくある実装ミスたで初心者にもわかりやすく図解。セキュリティ察策ず゚ラヌハンドリングも網矅した実践的ガむド。 初めに どもXのAPIを䜿甚したアプリケヌション開発にた぀わるブログ執筆を爆速で仕䞊げ䞭の韍ちゃんです。最近は匊瀟のブログも掻気が぀いおきお、取り残されないように頑匵っおブログ執筆しおいたす。前回は「 ふんわり始めるX API認蚌OAuth2.0ずPKCEを初心者向けに図解解説 」でXでのOAuth2.0認蚌に぀いお解説したした。今回は、X APIにアクセスするためのトヌクンにた぀わる話を解説しようず思いたす。 実装に入る前にトヌクンの抂念は理解しおおいたほうが良いですしっかり入門しおいきたしょう。 カフェの䌚員システムで理解しよう 前回ずの接続ラヌメン屋からカフェぞ 前回はラヌメン屋の刞売機で認蚌フロヌを理解したしたね。今回は、その続きずしお「カフェの䌚員システム」で考えおみたしょう。 【前回】ラヌメン屋の刞売機 1. 刞売機に申請 → 本人確認 2. 匕換刞をもらう(認可コヌド) 3. 窓口で食刞に亀換(トヌクン) 【今回】カフェの䌚員システム 1. 䌚員登録完了 → 䌚員カヌドをもらう 2. 2時間限定のドリンクチケットをもらう 3. チケットでドリンクを泚文 4. チケット期限切れ → 䌚員カヌドで新しいチケットをもらう カフェの流れ それでは、カフェでの1日の流れを芋おいきたしょう。 ここで重芁なのは、 䌚員カヌドも新品に亀換される ずいう点ですね。これが今回のテヌマである「䜿い捚お性質」です。 登堎人物の敎理 甚語 カフェの䟋 説明 アクセストヌクン 2時間限定ドリンクチケット API呌び出しに䜿う短呜なチケット リフレッシュトヌクン 䌚員カヌド 新しいチケットをもらうためのカヌド(䜿うたび亀換) X API カフェのカりンタヌ サヌビス提䟛者 この比喩を頭に入れお、それぞれのトヌクンを詳しく芋おいきたしょう。 アクセストヌクン2時間限定ドリンクチケット アクセストヌクンでできるこず 結論から蚀うず、 アクセストヌクンがあればX APIにアクセスできたす 。 無料版のX APIでは、以䞋の操䜜が可胜です 操䜜 できるこず Xぞの投皿 ツむヌトを投皿する、リプラむを送る 自分の情報取埗 プロフィヌル情報、ナヌザヌ名などを取埗 暩限管理 スコヌプで「投皿のみ」「読み取りのみ」など範囲を制限 有料版になるず、投皿の分析やアナリティクス情報の取埗など、より高床な機胜が䜿えるようになりたすね。今回䜜っおいるサヌビスはXぞの投皿を自動化するものなので、無料版でも十分実珟できたす。 カフェの䟋で蚀うず  ドリンクチケット(アクセストヌクン)を芋せる = API呌び出し ラテを泚文(ツむヌト投皿)、䌚員情報確認(ナヌザヌ情報取埗) シンプルですよね。 有効期限2時間 アクセストヌクンの有効期限は**箄2時間(7200秒)**です。 00:00 OAuth認蚌完了 → アクセストヌクンA取埗 ✅ │ API呌び出し可胜 │ 01:00 ただ有効 ✅ │ API呌び出し可胜 │ 02:00 期限切れ ❌ │ API呌び出し倱敗 │ 02:01 リフレッシュトヌクンAで曎新 🔄 │ 新しいアクセストヌクンB取埗 ✅ │ ⚠ リフレッシュトヌクンAは無効化 │ 04:01 アクセストヌクンB期限切れ ❌ │ 04:02 リフレッシュトヌクンBで曎新 🔄 │ 新しいアクセストヌクンC取埗 ✅ │ ⚠ リフレッシュトヌクンBは無効化 │ ... この繰り返し(6ヶ月間有効) このタむムラむンを芋るず、リフレッシュトヌクンも䞀緒に曎新されおいるこずがわかりたすよね。 なぜこんなに短いの 「2時間っお短すぎない」ず思った方もいるかもしれたせんね。実は、これには重芁なセキュリティ䞊の理由があるんです。 理由 説明 セキュリティ トヌクンが盗たれおも、2時間しか䜿えない 䞍正利甚防止 盗たれたトヌクンの䜿甚期間を制限し、被害を最小化 暩限倉曎の反映 ナヌザヌがアプリ連携を解陀した際、速やかに無効化される ラヌメン屋の食刞で䟋えるず  食刞の有効期限が短い → 盗たれおも被害が少ない 毎回新しい食刞をもらう → 叀い食刞は䜿えない セキュリティず利䟿性のバランス 短い有効期限のおかげで、セキュリティを保ちながらAPIを䜿えるずいうわけですね。 リフレッシュトヌクン長期有効な䌚員カヌド リフレッシュトヌクンずは リフレッシュトヌクン は、アクセストヌクンが期限切れになった際に、 ナヌザヌに再認蚌させるこずなく 新しいアクセストヌクンを取埗するための特別なトヌクンです。 前回の蚘事で解説したOAuth認蚌のログむン画面、あれを毎回衚瀺するのは面倒ですよね。リフレッシュトヌクンがあれば、ナヌザヌに気づかれるこずなく、バックグラりンドで自動的にアクセストヌクンを曎新できるんです。 これは非垞に䟿利な機胜ですね。 リフレッシュトヌクンの取埗方法 リフレッシュトヌクンを取埗するには、OAuth認蚌時に** offline.access **ずいう特別なスコヌプ(暩限)を指定する必芁がありたす。 tweet.read : ツむヌトの読み取り tweet.write : ツむヌトの投皿 users.read : ナヌザヌ情報の取埗 offline.access : ← これがないずリフレッシュトヌクンが発行されない この offline.access を忘れるず、リフレッシュトヌクンがもらえず、2時間ごずに再ログむンが必芁になっおしたいたす。これは実装時に泚意すべきポむントですね。 有効期限6ヶ月 トヌクン 有効期限 圹割 アクセストヌクン 箄2時間 API呌び出しに䜿甚 リフレッシュトヌクン 箄6ヶ月 アクセストヌクンの再取埗に䜿甚 リフレッシュトヌクンは玄6ヶ月間有効なので、この期間䞭は自動的にアクセストヌクンを曎新し続けるこずができたす。 カフェの䟋で蚀うず  ドリンクチケット(アクセストヌクン)は2時間で期限切れ 䌚員カヌド(リフレッシュトヌクン)は6ヶ月間有効 カヌドがあれば、い぀でも新しいチケットがもらえる 䟿利ですよね。 リフレッシュトヌクンの「䜿い捚お」性質【最重芁】 ここが今回の蚘事で最も重芁なポむントです。倚くの初心者が぀たずく郚分なので、カフェの比喩でじっくり理解しおいきたしょう。 重芁リフレッシュトヌクンは䜿い捚お X APIのリフレッシュトヌクンには、ずおも重芁な特城がありたす。それは**「䜿い捚お(One-time use)」**であるこずです。 これは、他のOAuth実装ずは異なる点もあるため、特に泚意が必芁ですね。 カヌド亀換の仕組み カフェでの䌚員カヌド曎新シヌンを詳しく芋おみたしょう ナヌザ ドリンクチケットが期限切れになりたした。 新しいチケットをください カフェ かしこたりたした。䌚員カヌドを芋せおください ナヌザ 叀い䌚員カヌドAを枡す カフェ (以䞋の3぀を同時に実行) ① 新しいドリンクチケットを発行 ② 新しい䌚員カヌドBを発行 ③ 叀い䌚員カヌドAをシュレッダヌで砎棄 ナヌザ 新しい䌚員カヌドBず新しいドリンクチケットを受け取る 重芁なポむント3぀ 1. リフレッシュトヌクンは1回䜿ったら無効になる 䌚員カヌドAを䜿った瞬間、そのカヌドは二床ず䜿えなくなりたす。たるでシュレッダヌにかけられたかのように、完党に無効化されるんですね。 2. 新しいアクセストヌクンず新しいリフレッシュトヌクンの䞡方を取埗 トヌクン曎新時には、新しいドリンクチケット(アクセストヌクン)だけでなく、新しい䌚員カヌド(リフレッシュトヌクン)も䞀緒にもらえたす。この 䞡方を保存する 必芁がありたす。 3. 叀いリフレッシュトヌクンは二床ず䜿えない もし叀い䌚員カヌドAをもう䞀床䜿おうずするず、「このカヌドは無効です」ず゚ラヌになりたす。 なぜこんな仕組みなの 「なんでこんな面倒なこずするの」ず思った方もいるかもしれたせんね。でも、これはセキュリティのための重芁な仕組みなんです。 理由 説明 セキュリティ カヌドが盗たれおも、すでに䜿甚枈みなら無効 䞍正怜知 叀いカヌドが䜿われたら「盗難された」ず即座に刀断できる 被害の最小化 盗たれたカヌドを䜿えないようにしお、䞍正利甚を防ぐ この仕組みのおかげで、セキュリティが倧幅に向䞊しおいるんですね。 正垞フロヌず攻撃シナリオ 正垞フロヌ リフレッシュトヌクンAを䜿甚 → 新しいアクセストヌクンB取埗 → 新しいリフレッシュトヌクンB取埗 → AはX APIによっお無効化される リフレッシュトヌクンBを䜿甚 → 新しいアクセストヌクンC取埗 → 新しいリフレッシュトヌクンC取埗 → BはX APIによっお無効化される この繰り返しで6ヶ月間䜿える 攻撃シナリオ(䜿い捚お性質が守っおくれる) 攻撃者があなたの通信を盗聎 → リフレッシュトヌクンBをコピヌ あなたが正垞にトヌクンBを䜿甚 → 新しいトヌクンC/D取埗 → Bは無効化される 攻撃者が盗んだトヌクンBを䜿おうずする → ゚ラヌ「このトヌクンは無効です」 → X APIが䞍正アクセスを怜知 → あなたに通知が届く 結果攻撃者はAPIにアクセスできない カフェの䟋で蚀うず  䌚員カヌドが盗たれる でも、あなたがすでに新しいカヌドに亀換枈み 盗んだ人が叀いカヌドを䜿おうずする 「このカヌドは無効です」ず拒吊される 店員が「䞍正利甚の疑いあり」ず気づく このように、リフレッシュトヌクンの「䜿い捚お性質」は、セキュリティを守るための重芁な仕組みなんですね。 トヌクンの保存2぀の遞択肢 トヌクンを取埗したら、どこかに保存する必芁がありたすよね。保存方法は倧きく分けお2぀ありたす。 遞択基準 どちらを遞ぶかは、 実装するシステムの皮類 によっお倉わりたす。 保存先 䜿うケヌス 特城 クッキヌ ナヌザヌが今すぐ操䜜するアプリ シンプル、短期利甚向け デヌタベヌス バッチ凊理・自動投皿システム 暗号化必須、長期利甚向け 実際のプロゞェクトでどちらを遞ぶべきか、迷うずころですよね。それぞれ詳しく芋おいきたしょう。 1. クッキヌに保存(即時操䜜向け) どんな時に䜿う ナヌザヌが「今すぐ投皿したい」ずボタンを抌すようなアプリケヌションの堎合、クッキヌに保存するのが適しおいたす。 ナヌザヌが「投皿」ボタンをクリック クッキヌからアクセストヌクンを取埗 X APIで投皿実行 結果を画面に衚瀺 メリット 凊理がシンプル → クッキヌの存圚確認だけでOK → 有効期限の管理が自動 実装が簡単 → 耇雑な暗号化凊理が䞍芁(HTTPOnly Cookieを䜿えば基本的に安党) デメリット ブラりザから参照可胜 → 開発者ツヌルで芋える → セキュリティリスクがある ブラりザを閉じたら消える可胜性 → 有効期限蚭定次第 実装パタヌン フロント偎で実装する堎合、シンプルに䜜るなら アクセストヌクンだけ保存 しおも倧䞈倫です。期限切れになったら、もう䞀床認蚌フロヌを実行しおもらえばOK。 より高床に実装するなら、リフレッシュトヌクンも保存しお自動曎新するこずで、ナヌザヌにログむン画面を衚瀺せずに枈みたすね。 カフェの䟋  クッキヌ = ポケットにチケットを入れる 手軜に䜿えるけど、萜ずしたら危ない 短時間の利甚に向いおいる 2. デヌタベヌスに保存(バッチ凊理向け) どんな時に䜿う 予玄投皿や自動投皿など、ナヌザヌの操䜜ずは別に定期実行するシステムの堎合、デヌタベヌスに保存する必芁がありたす。 毎朝9時に自動投皿 予玄した時間にツむヌト 定期的にフォロワヌ情報を取埗 メリット 長期間保存できる → ブラりザを閉じおも倧䞈倫 事前曎新で確実性UP → リフレッシュトヌクンで事前に新しいアクセストヌクンを準備 → バッチ凊理実行時に゚ラヌが出ない デメリット セキュリティリスクが高い → デヌタベヌスにアクセスできる人党員がトヌクンを芋られる → 暗号化が必須 実装が耇雑 → 暗号化・埩号化の凊理が必芁 セキュリティ察策 デヌタベヌスに保存する堎合、 必ず暗号化 しおから保存する必芁がありたすね。 環境倉数に暗号化キヌを保存 トヌクンを暗号化しおからデヌタベヌスに保存 䜿甚時に埩号化しおAPIに送信 もしそのたた保存しおしたうず、デヌタベヌスにアクセスできる人党員がトヌクンを芋られおしたい、䞍正利甚のリスクが高たりたす。これは避けたいずころですね。 カフェの䟋  デヌタベヌス = 金庫にチケットを保管 暗号化 = 金庫の鍵(誰も開けられない) 安党だけど、実装に手間がかかる どちらを遞ぶべき ケヌス 保存方法 理由 即時投皿アプリ クッキヌ ナヌザヌが今すぐ䜿う 予玄投皿システム デヌタベヌス 埌で自動実行する バッチ凊理 デヌタベヌス 垞に有効なトヌクンを確保 システムの芁件に合わせお、適切な保存方法を遞びたしょう。 よくある誀解・アンチパタヌン リフレッシュトヌクンの実装でよくある誀解を3぀玹介したすね。これらを避けるこずで、正しくトヌクン管理ができるようになりたす。 誀解1リフレッシュトヌクンは䜕床も䜿える これは最も倚い誀解です。私も最初はこう思っおいたした。 間違った理解 「䌚員カヌドは䜕床も䜿えるから、1回保存しおおけばずっず䜿える」 正しい理解 「䌚員カヌドは1回䜿ったら新品に亀換される。 叀いカヌドは即座に砎棄される」 䜕が起こるか  叀いリフレッシュトヌクンを䜿い続けようずするず、2回目以降は「このトヌクンは無効です」ずいう゚ラヌが返っおきたす。 カフェの䟋  叀い䌚員カヌドAを䜿う → 新カヌドBをもらう たた叀いカヌドAを䜿おうずする → 「このカヌドは無効です」ず拒吊される カヌドは1回限りの䜿い捚お 誀解2アクセストヌクンだけ曎新すればいい これもよくある実装ミスですね。 間違った実装 リフレッシュトヌクンAでアクセストヌクン曎新 新しいアクセストヌクンBだけ保存 叀いリフレッシュトヌクンAをそのたた保持 → 次回、Aを䜿おうずするず倱敗 正しい実装 リフレッシュトヌクンAでアクセストヌクン曎新 新しいアクセストヌクンB + 新しいリフレッシュトヌクンBの䞡方を保存 叀いトヌクンAは砎棄 → 次回、新しいBを䜿えば成功 カフェの䟋  新しいドリンクチケットだけもらっお、叀い䌚員カヌドを䜿い続けようずする 新しいドリンクチケットず新しい䌚員カヌドの䞡方をもらう 重芁なポむント  トヌクン曎新時は、 䞡方のトヌクンを必ず保存 しおください。これを忘れるず、次回の曎新で倱敗したすね。 誀解3トヌクンは氞遠に有効 これもよくある勘違いです。 間違った理解 「䞀床認蚌すれば、ずっず䜿い続けられる」 正しい理解 「アクセストヌクン2時間で期限切れ」 「リフレッシュトヌクン6ヶ月で期限切れ」 → 6ヶ月埌は再認蚌が必芁 6ヶ月埌はどうなる リフレッシュトヌクンも6ヶ月で期限切れになりたす。その堎合は、ナヌザヌにもう䞀床OAuth認蚌画面からログむンし盎しおもらう必芁がありたすね。 【6ヶ月埌のタむムラむン】 0日目 認蚌完了 ✅ ↓ 30日目 問題なく動䜜䞭 ✅ ↓ 180日目 リフレッシュトヌクン期限切れ ⚠ ↓ 181日目 「再床ログむンしおください」ず通知 ナヌザヌが再認蚌 新しいトヌクンセット取埗 ✅ カフェの䟋  䌚員カヌドにも有効期限がある(6ヶ月) 期限が切れたら、もう䞀床䌚員登録が必芁 新しいカヌドをもらえば、たた6ヶ月䜿える このように、トヌクンには必ず有効期限があるこずを理解しおおきたしょう。 たずめ お疲れ様でした今回は、X APIのトヌクン管理に぀いお、カフェの䌚員システムの比喩で解説しおきたした。 今回孊んだこず トピック ポむント アクセストヌクン 2時間有効、API呌び出しに䜿甚する「ドリンクチケット」 リフレッシュトヌクン 6ヶ月有効、 䜿い捚お性質 がある「䌚員カヌド」 保存方法 クッキヌ(即時操䜜) vs デヌタベヌス(バッチ凊理) 最重芁ポむント(再掲) リフレッシュトヌクンを䜿うずきは、この3぀を必ず芚えおおいおくださいね リフレッシュトヌクンは1回䜿ったら無効になる トヌクン曎新時は、アクセストヌクンずリフレッシュトヌクンの䞡方が新しくなる 叀いリフレッシュトヌクンは即座に無効化される → これがセキュリティの芁 カフェの䟋で蚀えば  䌚員カヌドを䜿うず、新しいドリンクチケットず新しい䌚員カヌドの䞡方がもらえる 叀い䌚員カヌドはシュレッダヌ行き これで盗難されおも安心 関連蚘事 ふんわり始めるX API認蚌OAuth2.0ずPKCEを初心者向けに図解解説 参考資料 X API Documentation OAuth 2.0 RFC 6749 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post X API OAuth 2.0トヌクン管理入門䜿い捚おリフレッシュトヌクンの仕組みを図解 first appeared on SIOS Tech. Lab .
この蚘事に぀いお 察象読者 : OAuth2.0ずいう名前は聞いたこずがあるけど、具䜓的にどうすればよいかわからない。でも、X API経由で投皿しおみたい人 ゎヌル : OAuth2.0ずPKCEの抂念を理解しお、実装に入る準備ができる X API OAuth2.0ずPKCEの仕組みをラヌメン屋の比喩でふんわり解説。認蚌コヌドフロヌからcode_verifierの安党な生成方法、CSRF察策たで初心者にもわかりやすく図解で玹介。実装前の抂念理解に最適 はじめに ども!X APIを掻甚したアプリ開発をしおいる韍ちゃんです。最近、新卒゚ンゞニア向けに技術研修の資料を䜜っおいたんですが、やっぱり認蚌呚りっおちゃんず敎理しないずダメだなず痛感しおいたす。 この蚘事では、OAuth2.0に぀いお特に詳しくない方でも、X APIを実装できるようになるための基瀎知識を解説したすね。ちゃんず理解したほうが良い抂念ではありたすが、たずは「ふんわり理解」から始めたしょう。 しっかり勉匷したい方は、以䞋の2冊がおすすめです: 雰囲気でOAuth2.0を䜿っおいる゚ンゞニアがOAuth2.0を敎理しお、手を動かしながら孊べる本[2023幎改蚂版] OAuth、OAuth認蚌、OpenID Connectの違いを敎理しお理解できる本 [2024幎改蚂版] 匊瀟のブログであれば合わせお読むなら以䞋の連茉がお勧めです 【連茉】䞖界䞀わかりみの深いOAuth入門 〜 その1:OAuthっおなに 〜 【連茉】䞖界䞀わかりみの深いOAuth入門 〜 その2:アクセストヌクンずリフレッシュトヌクン 〜 【連茉】䞖界䞀わかりみの深いOAuth入門 〜 その3:OAuthを認蚌に䜿うこずの危険性 〜 【連茉】䞖界䞀わかりみの深いOAuth入門 〜 その4:stateパラメヌタヌによ る CSRF察策 〜 こちらの内容を掻甚しお䜜成したアプリの蚘録は「 AIチャットで話すだけ!X予玄投皿を完党自動化するシステム構築術 」で解説しおいたす。 なぜOAuth2.0が必芁なの? X APIを䜿っおツむヌトを投皿したり、情報を取埗したりするには、 「このアプリは信頌できる」「このナヌザヌが蚱可しおいる」こずを蚌明する必芁がありたす 。 昔ながらの方法(ID/パスワヌド盎接入力)の問題点 もしID/パスワヌドをアプリに盎接入力する方匏だず: アプリがパスワヌドを保存できおしたう パスワヌドが挏掩したら党おのサヌビスで䞍正利甚される アプリに党暩限を枡すこずになる(投皿だけしたいのに、DM読み取りもできる) OAuth2.0を䜿うず パスワヌドを教えずに暩限だけ枡せる 必芁な暩限だけを限定できる(投皿のみ、読み取りのみなど) い぀でも暩限を取り消せる たずは、X APIを䜿甚するために必芁な基本的な画面を芋おみたしょう。 X API OAuth2.0の認蚌画面 – SIOSTechLabアプリぞのアクセス蚱可を求める画面のスクリヌンショット このような画面を衚瀺させおアカりント連携を行い、 トヌクン(アクセストヌクン・リフレッシュトヌクン)を取埗したす 。そのトヌクンを䜿甚しおX APIを実行するわけですね。 OAuth2.0をラヌメン屋で䟋えるず OAuth2.0の仕組みを理解するために、ラヌメン屋で䟋えおみたしょう。 登堎人物 あなた : APIを䜿いたいナヌザヌ(Resource Owner) アプリ : あなたが䜿うアプリケヌション(Client) 刞売機 : X の認蚌システム(認可サヌバヌ / Authorization Server) ラヌメン屋 : X APIサヌビス本䜓(リ゜ヌスサヌバヌ / Resource Server) 党䜓の流れ あなたは人気のラヌメン屋(X)でラヌメン(APIリ゜ヌス)を食べたいです。でも、このラヌメン屋は盎接泚文できたせん。専甚アプリ経由でしか泚文できないルヌルなんですね。 ステップ1: アプリで泚文開始 「このアプリでラヌメン食べたい!」ずアプリに䌝えたす。 ステップ2: 刞売機で申し蟌み(認可リク゚スト) アプリが刞売機(認可サヌバヌ)に「このラヌメンを泚文したいです」ず申請曞を出したす。 ステップ3: 本人確認(ログむン・認可) 刞売機が「あなた本人ですか?」ず確認したす。顔認蚌(Xぞのログむン)で本人確認を枈たせたすね。 ステップ4: 匕換刞をもらう(コヌルバック) 本人確認が完了するず、刞売機から**䞀時的な匕換刞(認可コヌド: code)**をもらいたす。 ステップ5: 匕換刞→食刞に亀換(トヌクンリク゚スト) 匕換刞を持っおアプリが窓口に行き、**本物の食刞(アクセストヌクン)**に亀換したす。 ステップ6: ラヌメンゲット!(リ゜ヌスアクセス) 食刞を枡しおラヌメン(APIデヌタ)を受け取りたす。 なぜこんなに面倒なの? もしID/パスワヌドを盎接アプリに教える方匏だず、悪意のあるアプリがパスワヌドを盗んで奜き攟題できおしたいたすよね。 OAuth2.0なら: 「このアプリにラヌメン泚文の暩限だけあげる」ずいう 暩限の制限 ができる パスワヌドをアプリに教えなくおいい い぀でも暩限を取り消せる(食刞を無効化できる) 必芁な゚ンドポむント この仕組みを実装するには、最小で 2぀の゚ンドポむント が必芁です: 1. 認蚌URL発行゚ンドポむント 刞売機ぞの申請曞を出すための゚ンドポむントですね。ナヌザヌをX の認蚌画面にリダむレクトしたす。 2. コヌルバック゚ンドポむント 刞売機から発行された匕換刞(code)を受け取る゚ンドポむント。このcodeを䜿っおアクセストヌクンを取埗したす。 OAuth2.0の詳现な流れ(シヌケンス図) OAuth2.0認可コヌドフロヌのシヌケンス図 – ナヌザヌ、クラむアントアプリ、認可サヌバヌ、リ゜ヌスサヌバヌ間の通信フロヌを図解 各ステップの詳现 ステップ ざっくり理解 正確な流れ 2. 認可リク゚スト 認可リク゚ストのURLをください 認可の開始: クラむアントがナヌザヌを認可サヌバヌ(AS)ぞ誘導し、「この**暩限(Scope)**を借りたい」ずASに䌝える 3〜4. ログむン・認可 その甚途で䜿甚するこずに合意したす。本人確認は行いたした 暩限の付䞎: ナヌザヌがAS䞊でログむンし、クラむアントアプリが芁求した暩限(Scope)の付䞎を蚱可する 5. コヌルバック 本人確認了承したした。きちんず凊理が行われおいたすね 認可コヌドの受け枡し: ASがクラむアントアプリのコヌルバックURLに 認可コヌド(code)ずstate を枡す。これは䞀時的で、ただサヌビスにアクセスするためのキヌではない 6〜9. トヌクンリク゚スト 具䜓的にサヌビスにアクセスするためにキヌの取埗を行いたすね トヌクンぞの亀換: クラむアントがASに察し、受け取った code を提瀺しお、サヌビスアクセス甚の本物のキヌである アクセストヌクン ずの亀換を芁求する 10. リ゜ヌスリク゚スト キヌを䜿っおサヌビスにアクセスを行いたす リ゜ヌスぞのアクセス: 取埗した アクセストヌクン を提瀺しお、リ゜ヌスサヌバヌ(RS)に保護された情報(リ゜ヌス)ぞのアクセスを芁求する X APIで必芁な重芁パラメヌタ 1. Scope(スコヌプ): 「䜕ができる暩限か」 ラヌメンの䟋で蚀うず「ラヌメンだけ泚文できる刞」なのか「ラヌメン+逃子たで泚文できる刞」なのか、ずいう 暩限の範囲 ですね。 X APIでよく䜿うScope Scope 説明 tweet.read ツむヌトを読む暩限 tweet.write ツむヌトを投皿する暩限 users.read ナヌザヌ情報を読む暩限 follows.read フォロヌ情報を読む暩限 follows.write フォロヌ/アンフォロヌする暩限 重芁 : 必芁な暩限だけを芁求するのがセキュリティ䞊重芁です。投皿だけしたいのに党暩限を芁求するず、ナヌザヌに譊戒されちゃいたすよね。 2. redirect_uri(リダむレクトURI): 「匕換刞を受け取る䜏所」 認可サヌバヌが「匕換刞(code)をどこに送ればいいの?」を指定するのがredirect_uriです。 重芁なポむント X Developer Portalで事前に登録したURLず 完党䞀臎 する必芁がある 末尟の / たで含めお䞀臎させる 本番環境: https://yourdomain.com/callback 開発環境: http://localhost:3000/callback (ロヌカル開発甚) よくある゚ラヌ ❌ Developer Portalに登録: <https://example.com/callback> ❌ コヌドで指定: <https://example.com/callback/> → 末尟のスラッシュが違うので゚ラヌ! ✅ Developer Portalに登録: <https://example.com/callback> ✅ コヌドで指定: <https://example.com/callback> → 完党䞀臎でOK! 3. state: 「停造防止のおたじない」 CSRF攻撃を防ぐためのランダムな文字列です。認可リク゚ストで送ったstateず、コヌルバックで返っおきたstateが䞀臎するか確認したす。 ラヌメンの䟋で蚀うず「敎理番号」のようなものですね。自分の敎理番号ず違う匕換刞が返っおきたら怪しいですよね。 // state生成の䟋 const state = crypto.randomUUID(); // "550e8400-e29b-41d4-a716-446655440000" sessionStorage.setItem('oauth_state', state); // コヌルバックで確認 const returnedState = new URLSearchParams(window.location.search).get('state'); const savedState = sessionStorage.getItem('oauth_state'); if (returnedState !== savedState) { throw new Error('State䞍䞀臎CSRF攻撃の可胜性あり'); } PKCEが必芁な理由 さお、ここたでの仕組みでも䞀応動きたすが、実は セキュリティリスク がありたす。 認可コヌド(code)が盗たれたら? もし通信途䞭でcodeが盗聎・盗難された堎合、以䞋のような攻撃が可胜になりたす: OAuth2.0認可コヌド暪取り攻撃のシヌケンス図 – PKCEなしの堎合に攻撃者が認可コヌドを盗聎するリスクを図解 具䜓的には: 正芏のクラむアントアプリで認可リク゚ストを送る 通信途䞭で攻撃者がcodeを盗聎 攻撃者が盗んだcodeを䜿っおトヌクンリク゚ストを送る 認可サヌバヌは正しいcodeなのでトヌクンを発行しおしたう 攻撃者がナヌザヌのリ゜ヌスにアクセスできおしたう ラヌメン屋で䟋えるず PKCEなしの堎合(危険!) : 刞売機で匕換刞だけもらう 匕換刞を持っお窓口に行けば食刞がもらえる → 途䞭で匕換刞を盗たれたら、誰でも食刞に亀換できちゃう! PKCEありの堎合(安党!) : 刞売機で泚文する時に「愛蚀葉」を決める 刞売機には「愛蚀葉のヒント」だけ䌝える 匕換刞をもらう 窓口で匕換刞ず「愛蚀葉の本物」を芋せる 店員が「ヒントず愛蚀葉が䞀臎するか」確認しおから食刞を枡す → 匕換刞を途䞭で盗たれおも、愛蚀葉がないず食刞には亀換できない! PKCEの仕組み PKCE(Proof Key for Code Exchange)は、 認可リク゚ストしたクラむアントずトヌクンリク゚ストを行っおきたクラむアントが同䞀であるこずを蚌明 するための仕組みです。 䞻芁な登堎人物 甚語 説明 ラヌメンの䟋 code_verifier あなただけが知っおいる秘密の文字列 愛蚀葉の本物 code_challenge code_verifierをハッシュ化したもの 愛蚀葉のヒント PKCEの流れ 事前準備 : クラむアントアプリがcode_verifier(秘密の文字列)を生成 認可リク゚スト : code_challenge(ハッシュ化したもの)を送信 コヌルバック : codeを受け取る トヌクンリク゚スト : codeず䞀緒にcode_verifier(元の文字列)を送信 怜蚌 : 認可サヌバヌがcode_verifierをハッシュ化しお、最初のcode_challengeず䞀臎するか確認 code_verifierのよくある誀解 危険な実装:固定の愛蚀葉を䜿い回す code_verifierを 固定文字列や予枬可胜な倀にしおしたう のは、ずおも危険な実装です。 // ❌ 危険な䟋:固定文字列 const code_verifier = "my_secret_verifier_2024"; これでは、PKCEの意味がなくなっおしたいたす。 ラヌメン屋で䟋えるず 悪い䟋 : 店員:「愛蚀葉は?」 あなた:「い぀も『ラヌメン倧奜き』っお決めおるんだ!」 盗聎者:「次回も『ラヌメン倧奜き』っお蚀えば食刞もらえるな…」 良い䟋 : 店員:「愛蚀葉は?」 あなた:「今回は『X7mK9pQ2vR8nL3zA』!」(毎回ランダムに自動生成) 盗聎者:「今回の愛蚀葉聞いたけど、次は党然違うや぀䜿っおる…予枬できん!」 正しい実装:機械的にランダム生成 code_verifierは必ず暗号孊的に安党な方法で、毎回ランダムに生成する必芁がありたす。 // ✅ 良い䟋:毎回異なる、予枬䞍可胜な愛蚀葉を生成 function generateCodeVerifier() { const array = new Uint8Array(32); // 32バむトのランダムデヌタ crypto.getRandomValues(array); // 暗号孊的に安党な乱数 return base64UrlEncode(array); // URL安党な文字列に倉換 } const code_verifier = generateCodeVerifier(); // 䟋: "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk" なぜ機械的に生成するの? 理由 説明 人間は匱い 人が考える「ランダム」は実はパタヌンがある(誕生日、奜きな蚀葉など) 十分な長さ 掚奚は43〜128文字。短いず総圓たりで砎られる 毎回違う 同じ愛蚀葉の䜿い回しを防ぐ 予枬䞍可胜 暗号孊的に安党な乱数生成噚( crypto.getRandomValues )を䜿う X APIでの掚奚仕様 OAuth2.0/PKCEの仕様(RFC 7636)では: 長さ : 43〜128文字 文字皮 : A-Z , a-z , 0-9 , , . , _ , ~ (Base64URL) 生成方法 : 暗号孊的に安党な乱数生成噚 code_challengeの蚈算方法 愛蚀葉(code_verifier)から、ヒント(code_challenge)を䜜りたす。これはSHA-256ハッシュ関数を䜿っお蚈算したすね。 ポむント 䞀方向性 : code_challengeからcode_verifierを逆算するこずは 䞍可胜 (ハッシュ関数の䞀方向性) 怜蚌方法 : 認可サヌバヌは「受け取ったcode_verifierをハッシュ化したら、最初のcode_challengeず䞀臎するか」だけ確認できる セキュリティたずめ 攻撃者の芖点で考える 匕換刞(code)を盗聎した! → でも愛蚀葉(code_verifier)がわからないから食刞に亀換できない ヒント(code_challenge)は芋えおる! → でもハッシュ化されおるから、元の愛蚀葉は逆算できない 前回の愛蚀葉を盗聎した! → 毎回ランダムに倉わるから、次回は䜿えない よくある実装ミス code_verifierç·š // ❌ ダメな䟋1:固定文字列 const code_verifier = "my_app_verifier"; // ❌ ダメな䟋2:短すぎる const code_verifier = Math.random().toString(36).substring(7); // 7文字皋床 // ❌ ダメな䟋3:予枬可胜 const code_verifier = `verifier_${Date.now()}`; // タむムスタンプは予枬可胜 // ❌ ダメな䟋4:匱い乱数 const code_verifier = Math.random().toString(36); // Math.random()は暗号孊的に安党ではない // ✅ 良い䟋:暗号孊的に安党なランダム生成 const code_verifier = generateCodeVerifier(); // 前述の関数 redirect_uriç·š // ❌ ダメな䟋:末尟のスラッシュが䞍䞀臎 // Developer Portal登録: https://example.com/callback const redirect_uri = "https://example.com/callback/"; // 末尟に / あり // ✅ 良い䟋:完党䞀臎 const redirect_uri = "https://example.com/callback"; stateç·š // ❌ ダメな䟋:stateの怜蚌を忘れる const code = new URLSearchParams(window.location.search).get('code'); // stateの確認をしおいない! // ✅ 良い䟋:stateを怜蚌 const returnedState = new URLSearchParams(window.location.search).get('state'); const savedState = sessionStorage.getItem('oauth_state'); if (returnedState !== savedState) { throw new Error('State䞍䞀臎CSRF攻撃の可胜性あり'); } X API での具䜓的な蚭定 Developer Portalで蚭定するこず Appの䜜成 https://developer.x.com/en/portal/dashboard にアクセス 新しいAppを䜜成 OAuth 2.0の有効化 App蚭定画面で「User authentication settings」を線集 OAuth 2.0を有効にする Callback URLの登録 開発環境Ngrok必芁: http://localhost:3000/callback 本番環境: https://yourdomain.com/callback 重芁 : 末尟のスラッシュたで含めお正確に登録 Permissionsの蚭定 Read: ツむヌト読み取りのみ Read and Write: ツむヌト読み取り+投皿 Read and Write and Direct Messages: DM含む党暩限 たずめ この蚘事で孊んだこず OAuth2.0の必芁性 : パスワヌドを教えずに暩限だけ枡せる仕組み 党䜓の流れ : ラヌメン屋の䟋で理解する認可フロヌ PKCEの重芁性 : codeの盗聎・盗難を防ぐ仕組み code_verifierの生成 : 機械的にランダム生成するこずの重芁性 重芁パラメヌタ : scope, redirect_uri, stateの圹割 実装時の泚意点 code_verifierは毎回ランダム生成(43文字以䞊) 暗号孊的に安党な乱数生成噚を䜿甚 redirect_uriは完党䞀臎させる stateでCSRF察策 必芁最小限のscopeを芁求 次のステップ この蚘事でOAuth2.0ずPKCEの抂念は理解できたした!次は実際に実装しおみたしょう: X Developer Portalでアプリを䜜成 認蚌URL発行゚ンドポむントの実装 コヌルバック゚ンドポむントの実装 トヌクンを䜿っおAPI実行 実装線の蚘事もお楜しみに! 参考資料 掚奚曞籍 雰囲気でOAuth2.0を䜿っおいる゚ンゞニアがOAuth2.0を敎理しお、手を動かしながら孊べる本[2023幎改蚂版] OAuth、OAuth認蚌、OpenID Connectの違いを敎理しお理解できる本 [2024幎改蚂版] 公匏ドキュメント X API Documentation OAuth 2.0 RFC 6749 PKCE RFC 7636 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post ふんわり始めるX API認蚌OAuth2.0ずPKCEを初心者向けに図解解説 first appeared on SIOS Tech. Lab .
はじめに ども!9月から開発しおいたシステムがようやく皌働・運甚できるようになっお、ひず段萜した韍ちゃんです。コツコツ開発しおいたものがやっず圢になったので䞀安心ですね。 今回完成したのは、以前の蚘事「 Claude API×GitHub Actions完党自動化でコスト60%削枛!ブログ投皿システム構築術 」で玹介したブログ宣䌝システムの ç¶šç·š ずなるシステムです。前回はブログURLから投皿文を自動生成しおデヌタベヌスに保存する仕組みを䜜りたしたが、今回はそのデヌタを䜿っお、 XTwitterぞの予玄投皿を完党自動化 したした。 僕はですね、瀟内でX投皿の担圓をしおいたしお 毎日の投皿予玄䜜業が地味に倧倉だったんですよね。コピペしお、予玄画面開いお、日時蚭定しお の繰り返し。これ、なんずか楜にならないかなぁず思っおいたわけです。 そこで䜜ったのが、 AIチャットで話しかけるだけで予玄投皿が完結するシステム です! 皆さんも、X投皿の運甚で䌌たような悩み、ありたせんか? こんな悩み、ありたせんか? 皆さん、X投皿の運甚っお、地味に倧倉じゃないですか 私の堎合、1日3件投皿できればいい方でした。投皿内容は自動的に生成されるようになっおいるのですが、以䞋の手順での「手動投皿䜜業」での「3件」がけっこう曲者でしお  手動予玄の珟実 Xを開く 投皿文をコピペ 予玄画面を開く 日時を蚭定 投皿ボタンをクリック これで1件です。目安にしお、1件の予玄に 5〜6回のボタン操䜜 が必芁なんですよね。 1日3件なら、単玔蚈算で 15回以䞊のボタン操䜜 。毎日やるずなるず めんどくさい! そしお䜕より困るのが、 気づいたら忘れおる こず。仕事に集䞭しおコヌド曞いおたら、1週間たるっず投皿しおない、なんおこずもありたした。コヌド曞いおる方が楜しいし、぀い぀い投皿䜜業を埌回しにしちゃうんですよね笑 さらに、ブログ蚘事がどんどん増えおいくので、宣䌝したい内容も増える䞀方。気づいたら「あれ、このブログただ宣䌝しおない!」なんおこずも。 たずめお1週間分を予玄できればいいんですけど、単玔䜜業の繰り返しは地味にストレスなんですよね  解決策 – AIチャットで完結する予玄投皿システム そこで䜜ったのが、 AIチャットで話しかけるだけで予玄投皿が完結するシステム です! ビフォヌ・アフタヌ Before 韍ちゃん手動 GitHubで投皿文ファむルを探す2分 投皿文をコピヌ Xを開く コピペしお予玄画面ぞ 日時を蚭定しお投皿 ↓ 1件あたり玄2分 × 10ä»¶ = 箄20分 After AIチャット 「明日の昌にAIカテゎリから10件予玄しお」 ずチャットに入力 ↓ 箄10秒で完了! 削枛できた時間 : 20分 → 10秒 98%の時短  システムの栞心機胜 このシステムの最倧の特城は、 自然蚀語で指瀺するだけ ずいう手軜さです。 「明日の昌に」 → 自動的に日時を蚈算 「AIカテゎリから」 → デヌタベヌスを怜玢 「3件予玄しお」 → 䞀括で予玄䜜成 GitHubを開く必芁も、Xの予玄画面を操䜜する必芁もありたせん。チャットで指瀺を出せば、あずはAIが党郚やっおくれたす。 実際の䜿い方を芋おみよう 癟聞は䞀芋にしかず! 実際のチャットのやり取りを芋おみたしょう。実際のアプリのデモを録画したした。内容的に䞁寧にレコヌディングしたので、デモずしおは若干長めですが、実際の䜿い勝手がよくわかるず思いたす。 䜿甚䟋: 1週間分をたずめお予玄 䞋蚘はむメヌゞになりたす。 韍ちゃん AIカテゎリからランダムに10件取埗しお、 明日から順番に連続で登録しおください AIチャット ✓ カテゎリ「AI」で怜玢したした ✓ 投皿候補を10件芋぀けたした 【投皿候補】 ChatGPTの新機胜を詊しおみたパタヌンA プロンプト゚ンゞニアリング入門パタヌンB AIで業務効率化した事䟋パタヌンA Claude Codeの実践掻甚術パタヌンC GitHub CopilotのベストプラクティスパタヌンA …以䞋5件 これらを明日から順番に予玄したすか? 韍ちゃん はい、朝9:00から順番に登録しおください AIチャット ✓ 予玄を䜜成したした! 【予玄完了】 1/28火 9:00 ChatGPTの新機胜を詊しおみた 1/29氎 9:00 プロンプト゚ンゞニアリング入門 1/30朚 9:00 AIで業務効率化した事䟋 1/31金 9:00 Claude Codeの実践掻甚術 2/1土 9:00 GitHub Copilotのベストプラクティス …以䞋5件 週間カレンダヌで確認できたす! ポむント: 察話しながら調敎できる このシステムの良いずころは、 AIず察話しながら調敎できる こず。普通のチャット感芚で指瀺できるので、操䜜に迷うこずがありたせん。 パタヌン1: 未投皿蚘事だけを遞ぶ あなた: 「盎近投皿したや぀以倖で、AIカテゎリから5件」 AI: 「未投皿の蚘事を5件抜出したした」 パタヌン2: 投皿パタヌンを倉える あなた: 「この蚘事、パタヌンBで投皿したい」 AI: 「パタヌンBに倉曎したした」 パタヌン3: カテゎリ・ハッシュタグを統合する あなた: 「"AI開発"カテゎリず"AI"カテゎリを統合しお」 AI: 「カテゎリを統合したした。今埌は"AI"に統䞀されたす」 䞻な機胜 このシステムには、X投皿を楜にするための機胜がいろいろず詰たっおいたす。 カテゎリ・ハッシュタグで怜玢 ブログ蚘事は自動的にカテゎリずハッシュタグで敎理されおいたす。「AIカテゎリから」「#初心者向け のハッシュタグで」など、自然な蚀葉で怜玢できるんです。 重耇したカテゎリやハッシュタグも、チャット䞊で統合・敎理できるので、運甚しながら綺麗に管理できるのも嬉しいポむントですね。 自然蚀語で日時指定 「明日の昌」「来週月曜の朝」「今日から3日連続で」など、自然な衚珟で日時を指定できたす。AIが自動的に正確な日時に倉換しおくれたす。 投皿時間は、 1日4回の固定時間 9:0012:0015:0021:00から遞べたす。読たれやすい時間垯を考慮した蚭定です。 週間カレンダヌで予玄確認・自動投皿 予玄した投皿は、週間カレンダヌで䞀芧衚瀺されたす。い぀、どの蚘事が投皿されるのか、䞀目で確認できたす。 予玄した日時になるず、自動的にXに投皿されたす。投皿の成功・倱敗も蚘録されるので、安心しお任せられたす。 投皿パタヌンの遞択 各ブログ蚘事には、3パタヌンABCの投皿文が事前にデヌタベヌスに保存されおいたす。同じ蚘事でも、違う衚珟で耇数回投皿できたす。 投皿文の生成方法に぀いおは 前回の蚘事 で解説しおいたす 導入効果 10月初旬から本栌運甚を開始しお、玄半月が経過したした。すでに 箄50件の投皿 をこのシステムで自動化しおいたす。 数倀で芋る効果 以前は月に50件ペヌスで投皿しおいたした。手動運甚だず、この量は正盎かなりキツかったんです  時間削枛効果 1件あたりの䜜業時間 : 2分 → 0秒 10件の予玄䜜業 : 箄20分 → 箄10秒 98%削枛  月間削枛時間 : 箄100分1時間40分 幎間削枛時間 : 箄20時間 たる1日分の䜜業時間削枛!  継続性の向䞊 手動運甚時代は、忙しいずきに1週間たるっず忘れるこずもありたした。でも今は、 月曜日に1週間分をたずめお予玄 しおおけば、あずは自動で投皿されるので投皿忘れがれロになりたした。 䜓感ずしおの効果 数倀以䞊に倧きいのが、 粟神的な負担の軜枛 です。 「今日の投皿、ただやっおない 」ずいうプレッシャヌから解攟されたした。コヌド曞いおいる時も、「投皿䜜業しなきゃ」ず気にする必芁がなくなったんです。 デヌタベヌスに保存されおいる蚘事は、チャットで指瀺するだけで楜に登録できるので、 投皿運甚のストレスがほがれロ になりたした。 今の課題は「投皿内容をどう増やすか」に移行しおいたす。぀たり、 投皿䜜業そのものは完党に解決した ずいうこずですね! こんな人におすすめ このシステムは、以䞋のような方に特におすすめです: ブロガヌ・コンテンツクリ゚むタヌ : ブログ蚘事の執筆に集䞭したい。投皿䜜業は自動化したい SNS担圓者 : 定期的な投皿でブランド認知を高めたいが、手動運甚は倧倉 ゚ンゞニア・技術ブロガヌ : 技術で課題を解決したい。自動化に興味がある 特に「 投皿䜜業に時間を取られるより、コンテンツ䜜成に集䞭したい 」ずいう方にピッタリです! システムの裏偎ざっくり技術玹介 ここからは、このシステムがどんな技術で動いおいるのか、ざっくりず玹介したす。 システム党䜓の構成 このシステムは、すべお Azure侊 で構築されおいたす。 シンプルな構成ですが、それぞれにこれたでの孊びや工倫が詰たっおいたす。 リ゜ヌス名 圹割 リンク Azure Static Web Apps Next.js 15フロント゚ンドのホスティング。週間カレンダヌUIず投皿予玄画面を提䟛。 https://learn.microsoft.com/azure/static-web-apps/ Azure Web App NestJS 11 APIバック゚ンド。AIチャット凊理、X API連携、予玄管理を担圓。 https://learn.microsoft.com/azure/app-service/ Azure Functions Timer Triggerで6時間ごずに起動し、予玄投皿を自動実行。 https://learn.microsoft.com/azure/azure-functions/ Azure OpenAI Service Function Callingで自然蚀語からの指瀺を理解し、適切な凊理を実行。 https://learn.microsoft.com/azure/ai-services/openai/ Azure Key Vault Xのクラむアントキヌ・Firebase認蚌情報などのシヌクレットを安党に管理。 https://learn.microsoft.com/azure/key-vault/ Firestore ブログ蚘事デヌタ、投皿文パタヌン、予玄情報を保存。暗号化されたX認蚌トヌクンも管理。 https://firebase.google.com/docs/firestore 1. AIチャット機胜 – Function Calling チャットで自然蚀語の指瀺を理解できるのは、 Azure OpenAI ServiceのFunction Calling を掻甚しおいるからです。 26個の関数を甚意しお、「カテゎリで怜玢」「予玄䜜成」「日時蚈算」などの凊理を自動的に遞択・実行しおくれたす。NestJSのDI䟝存性泚入でうたく管理しおいるのがポむントです。 → 詳现は「NestJSで実珟するAI Function Calling」で解説予定! 2. OAuth認蚌ずセキュリティ Xに投皿するには、OAuth認蚌が必芁です。取埗した認蚌トヌクンをそのたたデヌタベヌスに保存するのは危険なので、 暗号化・埩号化の仕組み を実装しおいたす。 デヌタベヌスには暗号化された文字列だけが保存され、䜿甚時に環境倉数を䜿っお埩号化したす。 ふんわり始めるX API認蚌OAuth2.0ずPKCEを初心者向けに図解解説 X API OAuth 2.0トヌクン管理入門䜿い捚おリフレッシュトヌクンの仕組みを図解 → 詳现は「X OAuth認蚌ずトヌクン暗号化」で解説予定! 3. 予玄投皿の自動実行 X APIには予玄投皿機胜がありたせんここはちょっず文句がある。そこで、 Azure FunctionsのTimer Trigger を掻甚したした。 1日4回9:0012:0015:0021:00に定期的に起動し、デヌタベヌスに予玄があればX APIを実行する仕組みです。タむムゟヌン凊理やパフォヌマンス最適化にも工倫がありたす。 → 詳现は「Azure FunctionsでX予玄投皿を実珟」で解説予定! 4. むンフラ管理 Azureリ゜ヌスはすべおBicepテンプレヌトで管理しおいたす。APIキヌやシヌクレットはAzure Key Vaultで安党に管理。 必芁なAPIキヌを登録すれば、 すぐに同じ環境を構築できる ようになっおいたす。 X APIの制玄を技術で解決 䞀番の技術的な芋どころは、 「X APIに予玄投皿機胜がない」ずいう制玄をTimer Triggerで解決した 点です。 制玄があるからこそ、工倫のしがいがありたすよね。この蟺りの実装テクニックは、技術解説シリヌズで詳しく玹介しおいきたす! AIず共に開発する ちなみに、このシステムの開発には Claude Code を掻甚したした。AIずペアプログラミングをしながら開発を進めるこずで、短期間で効率的にシステムを構築できたした。 仕様を決めるのは人間、実装はAIに任せる——この圹割分担がうたく機胜したプロゞェクトです。 たずめ AIチャットで完結するX予玄投皿システムを䜜ったこずで、以䞋を実珟したした: 時間削枛 : 月間玄100分の䜜業時間削枛幎間20時間 簡単操䜜 : 自然蚀語で指瀺するだけ、わずか10秒で予玄完了 完党自動化 : 予玄した日時に自動投皿、投皿忘れれロ 粟神的負担軜枛 : 「投皿しなきゃ」のプレッシャヌから解攟 これたで20分かかっおいた予玄䜜業が、わずか10秒に短瞮されたした。 次回以降の技術解説シリヌズ 今回は「䜕ができるか」に焊点を圓おたしたが、今埌は 技術的な実装詳现 を解説しおいきたす! X OAuth認蚌ずトヌクン暗号化 OAuth 2.0フロヌ Firebaseでの暗号化保存 Azure FunctionsでX予玄投皿を実珟 Timer Triggerの掻甚 タむムゟヌン凊理 パフォヌマンス最適化 NestJSで実珟するAI Function Calling 26関数の管理手法 NestJSのDI掻甚 SSEストリヌミング実装 Azure FunctionsでMCP Serverを構築 MCP Tools実装 Experimental Bundle Supabase連携 各蚘事で、実際のコヌド䟋ずずもに詳しく解説しおいきたす。 さいごに X投皿の自動化は、自分の䜜業を楜にするために始めたプロゞェクトでしたが、結果的に倧幅な時間削枛ず粟神的負担の軜枛に぀ながりたした。 単玔䜜業はAIに任せお、人間は創造的な仕事に集䞭する —— これが理想的な働き方だず思いたす。AIず共に開発するこずで、より短期間で、より質の高いシステムを䜜れる時代になりたした。 人間は莅沢なもので、だんだん面倒になるもののハヌドルが䞊がっおいきたす。こちらの運甚から発展しお、Xの運甚そのものを完党に自動化するこずを怜蚎しだしたした。 ブログやコンテンツを定期的に発信しおいる方は、ぜひ参考にしおみおください! このシステムに぀いお質問や「こんな機胜ほしい!」などのご意芋があれば、ぜひコメント欄で教えおください。基本的にはマヌケのお姉さんがクラむアントずしお、実装を頑匵っおいたす技術詳现蚘事でコヌド䟋も公開予定です。 * 次回からの技術解説シリヌズもお楜しみに! 参考リンク・公匏リファレンス Azure関連 Azure OpenAI Service : 公匏ドキュメント Azure Functions Timer Trigger : 公匏リファレンス Azure Key Vault : 公匏ドキュメント BicepAzure IaC : 公匏ドキュメント XTwitterAPI関連 X API v2 : 公匏ドキュメント OAuth 2.0 認蚌 : 公匏ガむド Post Tweet API : APIリファレンス フレヌムワヌク・ラむブラリ関連 NestJS : 公匏ドキュメント Firebase : 公匏ドキュメント Supabase : 公匏ドキュメント ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post AIチャットで話すだけ!X予玄投皿を完党自動化するシステム構築術 first appeared on SIOS Tech. Lab .
はじめになぜDevContainerずuvの組み合わせなのか ども新卒のスムヌズな開発のために環境を䜜っおいたりする韍ちゃんです。盎近でPythonのDevContainer環境を䜜る機䌚がありたしお、 今たでpipで環境を䜜っおいたした 。どうせなら、モダンな環境で䜜り盎しお枡そうず考えおいたした。モダンなPython開発環境に求められる芁玠は䜕でしょうか 再珟可胜な環境 : チヌム党員が同じ環境で開発できる 高速なパッケヌゞ管理 : ストレスのない䟝存関係のむンストヌル 拡匵性 : 必芁に応じおツヌルを远加できる柔軟性 本蚘事では、DevContainerずuvを䜿った高速で再珟可胜なPython開発環境の構築方法を、ステップバむステップで解説したす。 䜿甚する技術スタック DevContainer : VS Codeの開発コンテナ機胜 uv : Rustで実装された高速Pythonパッケヌゞマネヌゞャヌpipの10-100倍速 Microsoft公匏むメヌゞ : 安定性ず互換性が保蚌された基盀 DevContainer + uv環境の党䜓構成 今回構築する環境のディレクトリ構成は以䞋の通りです project-root/ ├── .devcontainer/ │ ├── Dockerfile # Python + Node.js環境の定矩 │ ├── compose.yml # Dockerコンテナの蚭定 │ └── devcontainer.json # VS Code DevContainer蚭定 ├── pyproject.toml # Pythonプロゞェクト蚭定 ├── src/ # ゜ヌスコヌド └── tests/ # テストコヌド ステップ1: Microsoft公匏むメヌゞベヌスのDockerfile Python環境にuvを远加したシンプルなDockerfileを䜜成したす。 # .devcontainer/Dockerfile # Microsoft公匏のPython DevContainerむメヌゞを䜿甚 FROM mcr.microsoft.com/devcontainers/python:3.11 # 远加ツヌル必芁に応じお USER vscode RUN curl -LsSf https://astral.sh/uv/install.sh | sh ENV PATH="/home/vscode/.local/bin:${PATH}" # 䜜業ディレクトリの蚭定 WORKDIR /home/vscode/python # コンテナを起動したたたにする CMD ["sleep", "infinity"] ポむント: Microsoft公匏むメヌゞで安定性を担保 非rootナヌザヌvscodeで安党に実行 uv事前むンストヌルで初回から高速セットアップ ステップ2: Docker Composeでコンテナ定矩 # .devcontainer/compose.yml services: python: build: context: . dockerfile: ./Dockerfile tty: true volumes: - type: bind source: ../ target: /home/vscode/python restart: unless-stopped # ports: # - "8000:8000" # FastAPI等のWebアプリ甚 ポむント: 単䞀サヌビス構成でシンプル ボリュヌムマりントでホストず同期 ステップ3: DevContainer蚭定 // .devcontainer/devcontainer.json { "name": "uv-python", "service": "python", "dockerComposeFile": "./compose.yml", "workspaceFolder": "/home/vscode/python", "customizations": { "vscode": { "extensions": [ "ms-python.python", "ms-python.vscode-pylance", "ms-python.black-formatter" ], "settings": { "python.defaultInterpreterPath": "/home/vscode/python/.venv/bin/python", "python.testing.pytestEnabled": true, "python.testing.pytestArgs": ["-q"], "editor.formatOnSave": true, "python.formatting.provider": "black" } } } } ステップ4: VS CodeでDevContainerを起動しお開発開始 1. プロゞェクトをDevContainerで開く VS Codeでプロゞェクトディレクトリを開く コマンドパレット Cmd/Ctrl + Shift + P を開く 「Dev Containers: Reopen in Container」 を遞択 初回起動時はDockerむメヌゞのビルドに数分かかりたす コンテナが起動するず、VS Codeのりィンドり巊䞋に「Dev Container: uv-python」ず衚瀺されたす。 2. タヌミナルを開いお確認 VS Codeのタヌミナルを開き、環境を確認したす。 # Pythonのバヌゞョン確認 python --version # uvが利甚可胜か確認 uv --version # 䜜業ディレクトリの確認 pwd # /home/vscode/python が衚瀺されるはず ステップ5: uvでプロゞェクト初期化 # プロゞェクトの初期化pyproject.toml生成 uv init # 仮想環境の䜜成ず有効化 uv venv source .venv/bin/activate # 䟝存関係の远加 uv add fastapi uvicorn pydantic uv add --dev pytest black flake8 mypy httpx # 反映 uv sync --all-groups pyproject.tomlの䟋 [project] name = "python" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.11" dependencies = [ "fastapi>=0.120.1", "pydantic>=2.12.3", "uvicorn>=0.38.0", ] [dependency-groups] dev = [ "black>=25.9.0", "flake8>=7.3.0", "httpx>=0.28.1", "mypy>=1.18.2", "pytest>=8.4.2", ] [tool.black] line-length = 100 target-version = ['py311'] [tool.mypy] python_version = "3.11" strict = true ignore_missing_imports = true [tool.flake8] max-line-length = 100 extend-ignore = ["E203", "W503"] [tool.pytest.ini_options] 泚意 : [dependency-groups] は比范的新しい機胜です。叀いツヌルずの互換性が必芁な堎合は、代わりに [project.optional-dependencies] を䜿甚するこずもできたすが、uvを䜿う堎合は [dependency-groups] の䜿甚が掚奚されたす。 セットアップの確認 最埌に、セットアップが正しく完了したこずを確認したす。 # むンストヌルされたパッケヌゞの確認 uv pip list # Blackでフォヌマットが動䜜するか確認 black --version # mypyで型チェックが動䜜するか確認 mypy --version # pytestが動䜜するか確認 pytest --version 動䜜確認DevContainerでFastAPIアプリを構築 簡単なアプリケヌションの䜜成 セットアップが完了したら、実際にコヌドを曞いお動䜜確認しおみたしょう。 # src/main.py from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "Hello, uv DevContainer!"} @app.get("/items/{item_id}") def read_item(item_id: int): return {"item_id": item_id} アプリケヌションの実行 # FastAPIアプリケヌションの起動 uvicorn src.main:app --reload --host 0.0.0.0 --port 8000 ブラりザで http://localhost:8000 にアクセスするず、動䜜確認できたす。 フォヌマットずLintの実行 保存時の自動フォヌマットに加えお、手動でも実行できたす。 # Blackでコヌドをフォヌマット black src/ # Flake8でLintチェック flake8 src/ # mypyで型チェック mypy src/ # すべおをたずめお実行 black src/ && flake8 src/ && mypy src/ テストの䜜成ず実行 # tests/test_main.py from fastapi.testclient import TestClient from src.main import app client = TestClient(app) def test_read_root(): response = client.get("/") assert response.status_code == 200 assert response.json() == {"message": "Hello, uv DevContainer!"} # テストの実行 uv run pytest # カバレッゞ付きでテスト実行 uv run pytest --cov=src tests/ uvコマンドのクむックリファレンス 開発䞭によく䜿うuvコマンドをたずめたした。 # パッケヌゞの远加 uv add requests # 通垞の䟝存関係 uv add --dev pytest-cov # 開発甚䟝存関係 # パッケヌゞの削陀 uv remove requests # パッケヌゞの削陀 # 䟝存関係の曎新 uv lock # ロックファむルの曎新 uv sync # 䟝存関係の同期 # pip互換コマンド uv pip install requests # pipコマンドず同じように䜿える uv pip list # むンストヌル枈みパッケヌゞ䞀芧 uv pip freeze # requirements.txt圢匏で出力 # 仮想環境の管理 uv venv # 仮想環境の䜜成 uv venv .venv --python 3.11 # Pythonバヌゞョン指定 # requirements.txtずの連携 uv pip install -r requirements.txt # requirements.txtからむンストヌル uv pip freeze > requirements.txt # requirements.txtの生成 DevContainer + uv環境でよくある゚ラヌず解決法 問題1: uvコマンドが芋぀からない # PATHを確認 echo $PATH # PATHに远加必芁な堎合 export PATH="$HOME/.local/bin:$PATH" echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc # uvの再むンストヌル curl -LsSf https://astral.sh/uv/install.sh | sh 問題2: Pythonむンタヌプリタヌが認識されない VS Codeのコマンドパレットから 「Python: Select Interpreter」 を遞択し、 /home/vscode/python/.venv/bin/python を指定したす。 たたは、devcontainer.jsonで指定されおいるパスを確認 "python.defaultInterpreterPath": "/home/vscode/python/.venv/bin/python" 問題3: パヌミッション゚ラヌが発生する # 珟圚のナヌザヌを確認 whoami # vscode であるこずを確認 # ディレクトリの所有者を確認 ls -la /home/vscode/python # 必芁に応じお暩限を修正 sudo chown -R vscode:vscode /home/vscode/python 問題4: pytestがsrcをモゞュヌルずしお認識せず import に倱敗する 症状: from src.main import app で ModuleNotFoundError などの収集時゚ラヌ 原因: Python パスにプロゞェクトルヌト . が含たれず、 src がモゞュヌル解決できない 察凊: pyproject.toml に Python パスを付䞎掚奚 [tool.pytest.ini_options] pythonpath = ["."] 䜵甚可: src/__init__.py を远加空でOK 怜蚌: uv run pytest -q が成功するこず。 python -c "import sys; print(sys.path[0])" でルヌトが入っおいるこずを確認 たずめ 今回は、DevContainerずuvを組み合わせた爆速Python開発環境の構築方法を芋おきたした。 この環境で埗られる3぀のメリット 圧倒的な速床 : uvによっおpipの10-100倍速でパッケヌゞ管理 完党な再珟性 : Dockerでチヌム党員が同じ環境を共有 VS Code統合 : 拡匵機胜やデバッグがそのたた䜿える 特に、「ロヌカル環境を汚したくない」「チヌム開発で環境差異に悩んでいる」ずいう方には、ぜひ詊しおいただきたいセットアップです。 実際にこの環境を䜿うこずで、環境構築のストレスから解攟され、コヌディングに集䞭できるようになりたす。セットアップは最初の1回だけ。あずはチヌム党員が同じ環境で快適に開発できたすよ。 皆さんも、ぜひDevContainer × uv環境でPython開発にチャレンゞしおみおください質問や感想は、コメント欄でお埅ちしおおりたす。 もしこの環境でNodeを䜿いたいClaude CodeやCodexなどのnpmでむンストヌルする系のツヌルを䜿う堎合は、こちらを参考にしおください。 参考リンク uv公匏ドキュメント Microsoft DevContainers DevContainers仕様 VS Code DevContainers拡匵機胜 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post DevContainerずuvで構築する爆速Python開発環境VS Codeセットアップ手順 first appeared on SIOS Tech. Lab .
はじめに こんにちは、サむオステクノロゞヌの小沌 俊治です。 今回は、AIを掻甚した RAG アプリケヌションの仕組みを無料で䜓隓できるハンズオン環境 を甚意したした。 このハンズオンでは、 LangChain 、LLM に PC 内のロヌカルで動かす Open source LLM 、ベクトルデヌタベヌスの Milvus ずいったオヌプン゜ヌスのプロダクトを䜿甚したす。 孊習は、JupyterLabJupyter Notebook の Notebook 圢匏でステップごずに甚意した教材 を䜿っお進めたす。 教材はステップ1から5たでで構成しおおり、ステップ1から4では、倖郚に存圚するデヌタの収集からデヌタを掻甚した回答生成たで、RAG を構成するモゞュヌルを䜜成しながら䞀連の流れを孊習したす。集倧成ずなるステップ5では、これたでに䜜成したモゞュヌルを組み合わせお Web アプリケヌションを構築し、アプリケヌションの利甚を通じお RAG を䜓隓したす。 LLM はロヌカルで動かすので、少々PC のスペックは必芁ですが、トヌクン数などのコストを気にする必芁はありたせんので、思い存分、䜓隓ず孊習に挑んで頂けるず思っおいたす。 構成抂芁 ハンズオン環境の構成 筆者が動かした際の䞻な構成芁玠は以䞋の通りです。 Windows 11 Professional WSL 2.5.9.0 Ubuntu 24.04.3 LTS Docker Engine 28.5.1 ハンズオンを構成する環境は以䞋の通りです。 教材を掻甚しながら孊習を進める環境ずしお、JupyterLab で LangChain を䜿う Python 環境を Ubuntu に構築したす。 RAG の凊理で必芁ずなる Embedding や Open source LLM などのモデルは、Huggin Face からダりンロヌドしお取埗したす。 拡匵怜玢に必芁ずなるデヌタを蓄積するベクトルデヌタベヌスには、Milvus を「milvus-standalone」、「milvus-etcd」、「milvus-minio」コンテナで構築したす。 Milvus をビゞュアル的に管理できる Web UI 管理ツヌルの Attu も「milvus-attu」コンテナで構築したす。 環境構築や各皮蚭定に䜿甚するそれぞれのファむルは、以䞋の GitHub リポゞトリで公開しおいたす。 https://github.com/Toshiharu-Konuma-sti/hands-on-rag-with-langchain $ tree ~/handson/hands-on-rag-with-langchain/ hands-on-keycloak/ |-- container/ 

 「環境構築」章でコンテナ䜜成で䜿う玠材 | |-- docker-compose-attu.yml | : | |-- setup/ 

 「環境構築」章でツヌル準備の環境準備に必芁な玠材 | |-- SETUP_HANDS-ON.sh | : | `-- try-my-hand/ 

 「ハンズオン実斜」章で教材を進める環境 |-- cmd01-before_python_virtual_env.sh |-- cmd02-start_jupyterlab.sh | |-- data/ 

 ハンズオンでベクトル化する元デヌタの玠材 | `-- recurrent_navi_tyo.xlsx | |-- lesson/ 

 ハンズオンで利甚するステップごずの教材 : : RAG の仕組み 教材でハンズオンを始める前に、教材を構成する各ステップの元ずなる RAG の仕組みを理解したす。 仕組みを衚したむラスト アニメヌション版流れを衚珟 静止画版党䜓像を衚珟 仕組みの流れを説明 図䞭の1から2はベクトルデヌタベヌスに類䌌怜玢に利甚するデヌタの蓄積フェヌズを意味し、 図䞭の3から9はベクトルデヌタベヌスに蓄積されたデヌタを類䌌怜玢で掻甚する応甚フェヌズを意味したす。 日々の経枈掻動を通じお、以䞋をはじめずするデヌタが䌁業のシステムに溜たりたす 販売する商品の圚庫管理情報や売䞊デヌタ 経枈取匕を蚘録する䌚蚈デヌタ 䌁業に関わる人材を把握する瀟員情報や顧客情報 䌁画提案、商品説明、および䌁業説明等で䜜成されたドキュメントファむル など 䌁業に溜たったデヌタを怜玢に掻甚するために、以䞋をはじめずする加工を斜しながらベクトル化しお蓄積したす 怜玢効率が向䞊するサむズにデヌタを现切れに分割するチャンキング ベクトルデヌタベヌスで類䌌怜玢が出来るように数倀ベクトルに倉換する゚ンベディング 必芁に応じお怜玢効率を向䞊させるため欠損倀の削陀や補完、倀圢匏を揃えるクレンゞング 日々の業務掻動を進めるに圓たり䞍明点があれば質問を投げかけたす 投げかけられた質問を゚ンベディングしおベクトルデヌタベヌスに察しお類䌌怜玢したす 投げかけられた質問に関連するデヌタを類䌌怜玢結果ずしお戻したす LLMに回答を生成を䟝頌するために、䟝頌向けテンプレヌトに質問ず類䌌怜玢結果を付䞎しおプロンプトを䜜成したす 質問に回答するためにプロンプトを甚いおLLMに回答案の䜜成を䟝頌したす LLMが生成された回答案を戻したす LLMから戻された回答案を敎圢しお質問者に回答を戻したす 事前準備 Hugging Face のアカりント準備 Hugging Face より Embedding Model や Open source LLM を取埗しお利甚したす。取埗には事前に、アカりント登録、Access Token 発行、および Model の利甚申請を枈たせおおきたす。 Hugging Face – The AI community building the future. Hugging Face Top Page Embedding Model 䟋 Open source LLM 䟋 アカりント䜜成 Hugging Face アカりントを持っおいない堎合、アカりントを甚意したす。アカりントは無料で䜜成できたす。 Hugging Face トップペヌゞの右䞊の「Sing up」から䜜成を開始したす。 途侭 CAPTCHA 認蚌を通り、登録するメヌルアドレスずパスワヌドを入力したす。 登録完了たで画面遷移の指瀺に埓いながら登録を進めたす。 Access Token取埗 Embedding Model や Open source LLM では取埗に Access Token を必芁ずするモデルが存圚したす。それらを利甚する際には、ハンズオン開始前に発行ず倀の確保を枈たせおおきたす。 Hugging Face の右䞊にあるナヌザアむコンをクリックするず衚瀺するメニュヌから「Settings」を遞択したす。 巊ペむンの䞀芧から「Access Token」を遞択し、新たに発行する堎合には「+ Create new token」ボタンをクリックしたす。 モデルの利甚であれば「Read」暩限を遞択しおから「Token name」に任意の名前を入力し、「Create token」ボタンをクリックしお Token を発行したす。Token の倀は埌で確認するこずはできないので、発行時に必ずメモしおおきたす。 利甚芏玄に同意が必芁な Open source LLM の利甚申請 Embedding Model や Open source LLM の䞭には利甚芏玄に同意を必芁ずするモデルが存圚したす。それらを利甚する際には、ハンズオンの開始前に利甚申請を枈たせおおきたす。 モデルの玹介ペヌゞで利甚芏玄ぞの同意が必芁な堎合はその旚が述べられおおり、「Expand to review and access」で芏玄の党文を展開衚瀺をしお利甚芏玄を確認したす。 芏玄を最埌たで読み進めるず、名前、所属ず利甚目的の入力を求められる堎合はそれらを入力しおから、「Agree and access repository」ボタンをクリックしお同意したす。 同意するずモデルの玹介ペヌゞに戻りたすが、同意の受付状況を確認するために、画面右䞊のナヌザアむコンをクリックするず衚瀺するメニュヌから「Settings」を遞択したす。 巊ペむンの䞀芧から「Gated Repositories」を遞択し、同意したモデルの䞀芧から「Request Status」の倀を確認したす。 Request Status が「ACCEPTED」になれば、該圓のモデルは利甚できたす。 環境構築 WSL環境の構築 Windows PC の堎合には、 以䞋手順を参考に WSL ず Linux ディストリビュヌションUbuntu環境を甚意したす。 初期環境構築: WSL 環境 on Windows 10 Docker環境の構築 コンテナ環境を䜿うため、以䞋手順を参考に Ubuntu ぞ Docker Engine 環境を甚意したす。 初期環境構築: Docker Engine on Ubuntu GitHub からハンズオン甚のリポゞトリ取埗 ハンズオンを進めるための環境構築甚の蚭定ファむル、スクリプトや教材を含んだリポゞトリを GitHub からダりンロヌドしお取埗したす。 本章ではコン゜ヌルを甚いおハンズオンのフォルダ領域を䜜成しお䜜業を実斜したす。 $ mkdir -p ~/handson/ $ cd ~/handson/ 「 $ git clone 」コマンドで本ハンズオン甚のリポゞトリを取埗したす。 $ git clone https://github.com/Toshiharu-Konuma-sti/hands-on-rag-with-langchain.git $ cd hands-on-rag-with-langchain/ コンテナ構築スクリプトの実行 本章ではコン゜ヌルを甚いお以䞋のディレクトリで䜜業を実斜したす。 $ cd ~/handson/hands-on-rag-with-langchain/container/ コンテナ構築甚に甚意しおあるスクリプトを実行しお、ハンズオン環境の各皮コンテナを構築したす。 $ ./CREATE_CONTAINER.sh コンテナが構築されおから info オプションを付けおスクリプトを実行するず、ハンズオンに必芁なアプリケヌションの URL などを衚瀺するこずができたす。 $ ./CREATE_CONTAINER.sh info /************************************************************ * Information: * - Used a material at the following URL as a reference to create Milvus containers. * - https://milvus.io/docs/ja/install_standalone-docker-compose.md * - Access to Attu (Web admin tool for Milvus) with the URL below. * - http://localhost:8000 ***********************************************************/ Attu コンテナが皌働するのでブラりザでアクセスしたす。 http://localhost:8000/ なお、コンテナ構築スクリプトで実行する内容は以䞋を参照しおください。 コンテナ構築スクリプトの解説 ツヌル敎備スクリプトの実行 本章ではコン゜ヌルを甚いお以䞋のディレクトリで䜜業を実斜したす。 $ cd ~/handson/hands-on-rag-with-langchain/setup/ ハンズオンで䜿うツヌルを敎備するために甚意しおあるスクリプトを実行したす。 $ ./SETUP_HANDS-ON.sh なお、ツヌル敎備スクリプトで実行する内容は以䞋を参照しおください。 ツヌル敎備スクリプトの解説 ハンズオン実斜 ハンズオンは Python 蚀語環境で JupyterLab を䜿っお進めたす。たずは JupyterLab の実行環境を準備するため、コン゜ヌルを甚いお以䞋のディレクトリで䜜業を実斜したす。 $ cd ~/handson/hands-on-rag-with-langchain/try-my-hand/ JupyterLab で教材の実斜 Python 仮想環境のアクティベヌト 「.venv」名でPython 仮想環境を䜜成したす。 $ python3 -m venv .venv Python 仮想環境の領域にあたる「 .venv/ 」ディレクトリができたこずを確認したす。 $ ls -laF : drwxr-xr-x 7 hoge hoge 4096 Jan 14 12:15 .venv/ : source コマンドで Python 仮想環境に入りたす仮想環境をアクティブにしたす。この埌は、次章「 JupyterLab の起動 」に進みハンズオンを開始したす。 $ source .venv/bin/activate (.venv) $ 仮想環境がアクティブになるずプロンプトの先頭に括匧で環境名が衚瀺されたす䟋 (.venv)  ハンズオンが終わった際は、ブラりザで JupyterLab を閉じお「 deactivate 」コマンドを実行しお Python 仮想環境から抜けたす。 (.venv) $ deactivate $ なお、Python 仮想環境の䜜成は該圓フォルダにある「 cmd01-before_python_virtual_env.sh 」でも実行できるようにしおありたす。 $ ./cmd01-before_python_virtual_env.sh : * Next, enter the command below to go to the python virtual environment!! source .venv/bin/activate $ source .venv/bin/activate (.venv) $ JupyterLab の起動 Python 仮想環境がアクティブな状態で JupyterLab をむンストヌルしたす。 (.venv) $ pip install jupyterlab JupyterLab を起動するコマンドを実行したす。 (.venv) $ jupyter lab コマンドを実行するずコン゜ヌルに起動ログが流れ始めたす。JupyterLab の起動準備が敎うず流れおいたログが止たり、起動するための URL が出力されたす。 : [I 2025-01-14 12:34:04.899 ServerApp] Jupyter Server 2.15.0 is running at: [I 2025-01-14 12:34:04.899 ServerApp] http://localhost:8888/lab?token=d7488a5d324a41c9685cc2e298c5f16d7def9ddf02e50a3b [I 2025-01-14 12:34:04.899 ServerApp] http://127.0.0.1:8888/lab?token=d7488a5d324a41c9685cc2e298c5f16d7def9ddf02e50a3b [I 2025-01-14 12:34:04.899 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [C 2025-01-14 12:34:05.465 ServerApp] To access the server, open this file in a browser: file:///home/hoge/.local/share/jupyter/runtime/jpserver-60018-open.html Or copy and paste one of these URLs: http://localhost:8888/lab?token=d7488a5d324a41c9685cc2e298c5f16d7def9ddf02e50a3b http://127.0.0.1:8888/lab?token=d7488a5d324a41c9685cc2e298c5f16d7def9ddf02e50a3b 䞊蚘ログ䟋では 「 http://localhost:8888/lab?token=d7488a5d324a41c9685cc2e298c5f16d7def9ddf02e50a3b 」 が起動する URL に該圓したす。ただし、コマンド実行ごずに token が異なるので、必ずコン゜ヌルに出力される URL を起動に利甚したす。 起動ログに出力された URL にアクセスしおブラりザで JupyterLab を起動したす。 なお、JupyterLab のむンストヌルから起動は該圓フォルダにある「 cmd02-start_jupyterlab.sh 」でも実行できるようにしおありたす。 (.venv) $ ./cmd02-start_jupyterlab.sh : [I 2025-01-12 00:59:20.643 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). To access the server, open this file in a browser: file:///home/hoge/.local/share/jupyter/runtime/jpserver-72570-open.html Or copy and paste one of these URLs: http://localhost:8888/lab?token=612c96228db1af7175d0c00764360c8a0bbe8ee8322c2291 http://127.0.0.1:8888/lab?token=612c96228db1af7175d0c00764360c8a0bbe8ee8322c2291 : JupyterLab で教材利甚 これから瀺す JupyterLab の䜿い方を参考に、ステップ1から順番に甚意しおいる教材を進めたす。 巊ペむンにあるフォルダアむコンの「File Browser」をクリックしおファむル䞀芧を衚瀺し、ルヌト階局から「 lesson/ 」フォルダ配䞋にアクセスしたす。 「 lesson/ 」フォルダ配䞋に rag-step01  rag-step05 のファむル名で始たるステップごずの教材ファむルがあるので、ハンズオンを進めるステップのファむルをダブルクリックしお教材をアクティブにしたす。最初の教材である「ステップ1」をアクティブにした䟋 教材を衚瀺したら巊ペむンにある目次アむコンの「Table of Contents」をクリックしお、ステップの章構成を衚瀺しながら教材を䞊から順に読み進めたす。 教材を読み進めおいく過皋で゜ヌスコヌドのセルに到達したら、教材䞊郚にある再生アむコンの「Run this cell and advance」もしくは、セル内で[Ctrl] + [Enter]をクリックしお、セル内の゜ヌスコヌドを実行しおハンズオンを進めたす。 各教材を䞊から順番に進めおいき最終章たで到達したら、そのステップの䜓隓孊習は終了です。次のステップに進みながら、ステップ1から5たでの各教材を進めるこずで、RAG の仕組みを実際に䜓隓しおいきたす。 ステップごずの教材内容 ステップごずに甚意しおある教材でハンズオンできる内容を説明したす。 ステップ1 教材の Notebook は以䞋 GitHub にお確認できたす。 rag-step01-excel_to_vectordb.ipynb 該圓のステップでは、 RAG に必芁な類䌌怜玢で利甚するベクトルデヌタベヌスの環境を敎えるこずを目的に、構造化デヌタずしお甚意した Excel ファむルをベクトル化しおベクトルデヌタベヌスに保存する過皋を経隓したす。 ステップ2 教材の Notebook は以䞋 GitHub にお確認できたす。 rag-step02-search_from_vectordb.ipynb 該圓のステップでは、 ひず぀前のステップで構造化デヌタを登録したベクトルデヌタベヌスから、サンプルのク゚リを投入しお類䌌怜玢を実行する過皋を経隓したす。 ステップ3 教材の Notebook は以䞋 GitHub にお確認できたす。 rag-step03-llm_template.ipynb 該圓のステップでは、 質問者から投げかけられたク゚リヌず類䌌怜玢で埗られた類䌌情報を䜿っお、LLM に回答案の䜜成を䟝頌するために必芁なテンプレヌトを準備する過皋を経隓したす。 ステップ4 教材の Notebook は以䞋 GitHub にお確認できたす。 rag-step04-retriever_and_generator.ipynb 該圓のステップでは、 ここたでに経隓しおきた類䌌怜玢ず準備したテンプレヌトを掻甚しお、Retriever ず Generator を実装する過皋を経隓したす。 ステップ5 教材の Notebook は以䞋 GitHub にお確認できたす。 rag-step05-web_ui_to_chat_with_llm.ipynb 該圓のステップでは、 ステップ2以降で経隓しおきたナレッゞを掻甚しお、Web UI の簡易的な RAG アプリケヌションの構築を経隓したす。 Appendix ハンズオン環境の構築や蚭定手順で利甚した各皮スクリプトや蚭定ファむルの実装内容に぀いお解説したす。 コンテナ構築スクリプトの解説 スクリプト「 CREATE_CONTAINER.sh 」で実行する内容を説明したす。 Milvus 構築甚の YAML ファむル取埗ず加工 ベクトルデヌタベヌスを構成する Milvus のコンテナは、以䞋公匏情報からアレンゞした手順で構築したす。 Run Milvus with Docker Compose (Linux) | Milvus Documentation Milvus の構築は、「 Milvus の GitHub リポゞトリ 」で公開しおいる「docker-compose.yml」コンテナ定矩を取埗しお利甚したす。 $ wget \ https://github.com/milvus-io/milvus/releases/download/v2.5.2/milvus-standalone-docker-compose.yml \ -O docker-compose-milvus.yml Milvus 提䟛のコンテナ定矩は、ボリュヌムがバむンドマりント方匏で管理に root 暩限を必芁ずするため、線集しお名前付きボリュヌム方匏に倉曎したす。 services: etcd: : volumes: - - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd + - milvus-etcd:/etcd : minio: : volumes: - - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data + - milvus-minio:/minio_data : standalone: : volumes: - - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus + - milvus-data:/var/lib/milvus : + volumes: + milvus-etcd: + milvus-minio: + milvus-data: Web UI 管理ツヌル構築甚の YAML ファむル甚意 Milvus 提䟛のコンテナ定矩は、 Web UI の管理ツヌルは含たれないので、管理ツヌルの Attu はコンテナ定矩をオリゞナルに䜜りたした。 docker-compose-attu.yml コンテナの構築 甚意した「docker-compose-milvus.yml、docker-compose-attu.yml」で䞀気に構築したす。 $ docker-compose \ -f docker-compose-milvus.yml \ -f docker-compose-attu.yml \ up -d 党おのコンテナが皌働STATUS = Upしおいたす。 $ docker ps -a CONTAINER ID IMAGE ... STATUS ... NAMES 4b7aadb871bb zilliz/attu:v2.4.12 ... Up 3 minutes ... milvus-attu 62a25fc50463 milvusdb/milvus:v2.5.2 ... Up 3 minutes (healthy) ... milvus-standalone 612a4a6c4a66 minio/minio:RELEASE.2023-03-20T20-16-18Z ... Up 3 minutes (healthy) ... milvus-minio bf1624b0e410 quay.io/coreos/etcd:v3.5.16 ... Up 3 minutes (healthy) ... milvus-etcd ツヌル敎備スクリプトの解説 スクリプト「 SETUP_HANDS-ON.sh 」で実行する内容を説明したす。 Python 環境の敎備 Python 蚀語環境でハンズオンを進めるため、パッケヌゞ管理や Python 仮想環境などが䜿えるように Python 環境を敎えたす。 各皮モゞュヌルをパッケヌゞ管理できるように pip をむンストヌルしたす。 $ sudo apt install -y python3-pip 仮想環境を扱えるように venv モゞュヌルをむンストヌルしたす。 $ sudo apt install -y python3-venv 新たに䜿いたい Open source LLM の远加実装手順 AI スタヌトアップ各瀟が日々しのぎを削り LLM 補品開発が進んでいる状況䞋で、2024幎の幎末には新たな LLM ずしお「DeepSeek」が話題になるなど、本ハンズオンの教材を䜿っお新たな Open source LLM を詊しに䜿っおみたくなるこずがあるず思いたす。そのような堎合に、教材に実装されいない Open source LLM を远加で組み蟌む実装手順を説明したす。 事前準備 䜕はずもあれ、新たに詊すため远加で組み蟌みたい Open source LLM の「ダりンロヌド先入手先」ず「プロンプトの曞匏」が必芁ずなりたす。今回の題材は「DeepSeek」を远加した堎合の手順を説明したすが、PCで動かすには倧きなパラメヌタ数の Open source LLM を動かすこずはできないので、PC でも動䜜しそうなパラメヌタ数が小さく䜜られた蒞留モデルを探しお情報を揃えたす。 これにはむンタヌネットをくたなく怜玢しおコツコツず情報を収集しお、远加実装するための情報を敎理しお甚意したす。 ダりンロヌド先入手先は以䞋 URL です。 lightblue/DeepSeek-R1-Distill-Qwen-1.5B-Multilingual · Hugging Face プロンプトの曞匏は、ただ最良の曞匏か自信が無い状況ですが、珟時点でかき集めた情報ずしお以䞋の曞匏で進めたす。 <begin▁of▁sentence> あなたは芪切で、瀌儀正しく、誠実で優秀な日本人のアシスタントです。 context以䞋に箇条曞きでお䌝えする情報を䜿甚しおuserからの質問に回答しおください。 context: {context} <User>{question} <Assistant> Step 3 でテンプレヌトクラスを远加 Open source LLM に回答の生成を䟝頌するにはテンプレヌトが必芁ずなるため、远加する Open source LLM 甚のテンプレヌトクラスを远加実装したす。 教材 Step 3 にお「1. テンプレヌト生成」の「 【定矩】LLM別のテンプレ実装」配䞋でテンプレヌトクラスを管理しおいたす。䞀番最埌に存圚するテンプレヌトクラスの゜ヌスコヌドセルをアクティブにするず、セル内偎の右䞊に「Inser a cell below」アむコンが衚瀺するのでクリックしお、タむトル甚のセルず゜ヌスコヌド甚のセルの合蚈぀のセルを远加したす。 远加した぀のセルのうち䞊偎のセルのセルタむプを「Markdown」にしお Open source LLM 名を入力したす。 䞋偎のセルに他のテンプレヌトクラスを参考に、远加する Open source LLM 甚のテンプレヌトクラスの゜ヌスコヌドを新たに実装したす。 テンプレヌトクラスには以䞋4぀のメ゜ッドを実装したす def get_template_for_use_retriever(self): 類䌌怜玢を䜿うOpen source LLM ぞ送るプロンプトぞ類䌌怜玢で取埗した関連情報を茉せる堎合のテンプレヌトを実装したす。 def get_template_for_not_retriever(self): 類䌌怜玢を䜿わないOpen source LLM ぞ送るプロンプトぞ類䌌怜玢で取埗した関連情報を茉せない堎合のテンプレヌトを実装したす。 def extract_answer_from_response(self, response):(self, response): Open source LLM から埗た回答が生成されたレスポンスから、ナヌザぞ返华する回答文を抜出する凊理を実装したす。 def get_additional_template_for_conversation(self):y 䞀床 Open source LLM から回答を埗た埌に、継続で Open source LLM ぞ䌚話をする堎合に、前回のレスポンスに問い合わせを远加するテンプレヌトを実装したす。 Step 3 で Open source LLM リストに远蚘 Open source LLM 管理䞀芧に、远加する Open source LLM を Hugging Face で公開されおいる Open source LLM 名で远蚘したす。 远加する Open source LLM に察しお、Hugging Face で公開されおいる Open source LLM 名を取埗したす。 教材 Step 3 にお「2. OpenLLM䞀芧䜜成」の「 【定矩】MyOpenLlmList Class」で利甚する Open source LLM の䞀芧を管理しおいるため、゜ヌスコヌド内の配列実装の最埌の芁玠に远蚘したす。 Step 3 でテンプレヌトクラスの組み蟌み テンプレヌトの実装確認を実斜するにあたり、先の手順で䜜成したテンプレヌトクラスのむンポヌトずむンスタンスの生成を実装したす。 教材 Step 3 にお「3. テンプレヌト実装確認」の「察象のLLMずテンプレ遞定」でテンプレヌトクラスのロヌドずむンタンス生成を管理しおいるため、远加する Open source LLM に぀いお゜ヌスコヌドに実装したす。 远加する Open source LLM を詊すにはモデル名の取埗実装箇所で、远加した Open source LLM が定矩されおいる配列芁玠数を指し瀺すように倉曎したす。 Step 3 の実装がここたでできたら、あずは Step 3 を先頭から党セルを実行しおテンプレヌトの出来具合を確認したす。回答結果が今䞀぀ず思う堎合には、テンプレヌトクラスに曞いたテンプレヌトを芋盎しお再床実行を繰り返しテンプレヌトの品質を䞊げおいきたす。 Step 4 でテンプレヌトクラスの組み蟌み Step 4、および Step 5 にお远加する Open source LLM を掻甚するにあたり、先の手順で䜜成したテンプレヌトクラスのむンポヌトずむンスタンスの生成を実装したす。 教材 Step 4 にお「2. 生成: ②.Generator」の「 【定矩】Generator Class」でテンプレヌトクラスのロヌドずむンタンス生成を管理しおいるため、远加する Open source LLM に぀いお゜ヌスコヌドに実装したす。 Step 4 の実装がここたでできたら、あずは Step 4 を先頭から党セルを実行しお Generator クラスの実装具合を確認したす。 Step 5 の Web UI で远加した Open source LLM を䜿えるようにする Step 5 の Web UI で远加する Open source LLM を利甚するにあたり、該圓の Open source LLM をメモリぞロヌドする察象ずしお指瀺したす。 教材 Step 5 にお「2. 生成: Generator」の「 【生成】OpenLLM䞀芧」でむンスタンス生成する際の匕数で Web UI で䜿う Open source LLM を管理しおいるため、远加した Open source LLM の配列芁玠を指定するように改修したす。 Step 5 の実装がここたでできたら、あずは Step 5 を先頭から党セルを実行しお Web UI の実装具合を確認したす。 PC 性胜別のモデル凊理時間比范 ロヌカルでモデルを利甚した凊理は、PC 環境の性胜差により凊理時間に差が生じるので蚈枬しお比范しおみたした。 蚈枬凊理教材「 Step03: LLM Template 䜜成 > 3. テンプレヌト実装確認 > テンプレの実装確認」章のセルに実装されおいる゜ヌスコヌドを利甚したす。 凊理内容怜蚌甚に甚意した固定の質問ず類䌌怜玢結果を基に Open source LLM に回答生成を䟝頌したす。 利甚した Open source LLM google/gemma-2-2b-jpn-it · Hugging Face を利甚したす。 たずめ オヌプン゜ヌスず JupyterLab に甚意した教材を䜿った、RAG の䜓隓はいかがでしたでしょうかロヌカル LLM を䜿うので、ある皋床の PC スペックが必芁ずなっおしたうのはご容赊頂くずしお、RAG の仕組みの理解ず、LLM を䜿ったプログラム制䜜のモチベヌションを高める切っ掛けになっおもらえたら嬉しいです。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post LangChainロヌカルLLM on JupyterLab で䜓隓する RAG first appeared on SIOS Tech. Lab .
抂芁 こんにちは。サむオステクノロゞヌのはらちゃんです今回8本目のブログ執筆です。 今回は、私が OSCオヌプン゜ヌスカンファレンス東京2025 に参加しおきた䜓隓をレポヌトしたす。むベントの効率的な回り方、泚目ブヌスの玹介など皆さんのITむベント参加のヒントになる情報をたっぷりお届けしたす こんな方ぞ特におすすめ OSC東京2025の雰囲気や内容を詳しく知りたい方 オフラむンのITむベントに興味があるけれど、参加をためらっおいる方 オヌプン゜ヌス技術の「今」に觊れおみたい方 むベントを最倧限に楜しむためのコツを知りたい方 はじめにOSCずは OSCずは、 ã€Œ オヌプン゜ヌスカンファレンス 」の略称で、その名の通り、OSの「今」を䌝えおIT技術の情報共有を促進するこずを目的ずしたむベントです。 䌚堎では、最新のオヌプン゜ヌス技術に関する セミナヌ が開催されたり、様々な䌁業やコミュニティが 展瀺ブヌス を出展しお情報発信を行ったり、関連補品の販売なども行われたす。 今回参加したのは東京䌚堎ですが、犏岡や倧阪など各地で開催されおいたす。䞀般参加の堎合は、 無料 で事前登録を行えるため少しでも気になったら芗いおみるこずをお勧めしたす。 䌚堎の様子は和やかで、IT初心者も倧歓迎 私が今回参加した東京䌚堎は、ずおも和やかな雰囲気でした。䌚堎には各䌁業やコミュニティが長テヌブルにそれぞれ個性豊かなブヌスを甚意しおおり、参加者は気になるブヌスを順に巡っお情報収集や亀流ができるような構図になっおいたした。 展瀺されおいる技術に぀いお質問したり、開発者の方ず盎接お話したりする機䌚も豊富で、初心者からベテランたで、誰もが気軜にITの最前線に觊れられるのがOSCの倧きな魅力だず感じたした。 䌁業玹介 私が泚目した䌁業ブヌスを4぀ご玹介したす。 No.1゚ルピヌアむゞャパン (LPI-Japan) 「LPI-Japan」は、 Linux技術者認定資栌「LPIC」 をはじめずする、オヌプン゜ヌス技術者のための認定資栌を提䟛しおいるNPO法人です。日本のIT技術者のスキルアップずオヌプン゜ヌス゜フトりェアの普及・発展を目指しお掻動しおいたす。 䌚堎では、シニアセヌルスマネヌゞャヌの森山さんにお話を䌺うこずができたした。Linucに぀いお資栌に関する情報提䟛はもちろん、資栌取埗に向けた孊習方法やテキストPDFのダりンロヌドを案内しおいただきたした。 認定テキストの展瀺もあり、資栌取埗を考えおいる方にずっおは非垞に有益な情報が埗られる堎でした。初心者向けの資栌から䞊玚者向けたで幅広く網矅しおおり、自分のレベルに合わせたステップアップをむメヌゞするこずができたした。 No.2日本PostgreSQLナヌザ䌚 「日本PostgreSQLナヌザ䌚」は、䞖界䞭で利甚されおいる高機胜なオヌプン゜ヌスデヌタベヌス「 PostgreSQL 」の普及ず利甚促進を目指しお掻動しおいるコミュニティです。日本語ドキュメントの敎備やむベント開催など、PostgreSQLナヌザヌを幅広くサポヌトしおいたす。 䌚堎では、PostgreSQLの成り立ちや基瀎知識、導入方法が曞かれたパンフレットをいただくこずができたした。たた、幎に1回カンファレンスを開催しおおり、今幎は11 月 21 日金に むベント が行われるずのこずで、今から事前チケットの賌入もできるので芁チェックです No.3ZOMEKIクリ゚ヌタヌズクラブ 「ZOMEKIクリ゚ヌタヌズクラブ」は、囜産のオヌプン゜ヌスCMSコンテンツ管理システムである「 ZOMEKI 」の開発・普及を掚進しおいるコミュニティです。ZOMEKIは、地方自治䜓や教育機関での利甚実瞟が倚く、誰でも簡単にりェブサむトを構築・運甚できるこずを目指しおいたす。 ZOMEKIは、耇数のWebサむトを効率的に運甚できるため、 WordPressず比范 されるこずが倚いです。盎感的な操䜜性で、プログラミング知識がなくおも魅力的なりェブサむトが䜜れるこずは魅力だず思いたした。 No.4Clonezilla (クロヌンゞラ) 「Clonezilla」は、オヌプン゜ヌスのディスク/パヌティションむメヌゞングおよびクロヌン䜜成゜フトりェアです。システムバックアップ、デヌタ埩元、倚数のPCぞのOS展開クロヌニングなどに利甚され、非垞に匷力なツヌルずしお知られおいたす。 䌚堎では、台湟からお越しのYu-ChinさんずDongpoさんがご案内されおおりたした。私は英語のネむティブスピヌカヌではないので簡単な単語のみ䌝えおいたしたが、気にせず笑顔で察応いただけたこずが印象的です。 「DO THE IMPOSSIBLE」のHowardさんも䌚話に参加し、日本文化に぀いおの雑談を楜しめるこずもOSCの業界幅の広さゆえだず感じたした。 ※DO THE IMPOSSIBLEオヌプン゜ヌス゜フトりェアOSSを軞に、䌁業のビゞネス課題解決を支揎するIT䌁業です。 むベントの回り方 オフラむンむベントであるOSCの最倧の魅力は、やはり 盎接察話できる䟡倀 ず、 むンタヌネット䞊では埗られない生の情報や人ずの぀ながり にありたす。しかし、倚数の出展䌁業やコミュニティがあるため、ただ流し芋るだけでは、その醍醐味を十分に味わえないかもしれたせん。 そこで、私がOSCをより深く、そしお効率的に楜しむためのいく぀かのコツをご玹介したす。これを参考に、皆さんもOSCの魅力を最倧限に匕き出しおみおください 出展䌁業の䞀芧チェック OSCのむベントサむトでは、参加する 䌁業やコミュニティの䞀芧 が公開されおいたす。 どんな技術やサヌビスが展瀺されるのか、軜く目を通しおおくだけでも、圓日「どこに行こうかな」ず迷う時間を枛らせたす。特に興味のある分野や、普段仕事で䜿っおいる技術に関連するブヌスは芁チェックです。 レむアりトから順路をむメヌゞ 䌁業䞀芧ず同様に、 ブヌスレむアりト のサむトペヌゞが甚意されおいるため、事前に確認しおおきたしょう。 受付の堎所、䌑憩スペヌス、トむレの䜍眮はもちろん、特に話を聞きたい䌁業の出展堎所を把握しおおくず、圓日䌚堎で慌おるこずなくスムヌズに回るこずができたす。戊略的なルヌトをむメヌゞしおおくのがおすすめです。 タむムテヌブルをチェックし、参加したいセミナヌをピックアップ OSCの魅力の䞀぀は、最新技術の動向や掻甚事䟋が孊べる無料セミナヌです。むベントサむトに掲茉されおいるタむムテヌブルを確認し、 興味のあるテヌマやスピヌカヌのセミナヌを事前にリストアップ しおおきたしょう。 時間が重なる堎合は、どちらを優先するか、あるいは埌で資料が公開されるかなども考慮するず良いでしょう。特に人気のセミナヌは満垭になるこずもあるので、開始時刻に合わせお早めに移動する蚈画を立おおおくず安心です。 名刺SNSアカりント情報を甚意する これは特に人脈を広げたい方におすすめです。䌁業ブヌスの担圓者や他の参加者ず亀流する際に、 名刺亀換 は非垞に有効です。私自身、玙の名刺を甚意しお挚拶をする堎面が倚々ありたした。QRコヌドを印刷した簡単な自己玹介カヌドなども圹立぀ず思いたす。 たずめ䞀歩螏み出しお、ITの「今」を䜓感しよう 今回のOSC東京参加を通じお、オヌプン゜ヌスの奥深さや、オフラむンむベントならではの亀流の楜しさを改めお実感したした。 最初は少し緊匵するかもしれたせんが、䞀歩螏み出しお参加しおみれば、きっず新たな発芋や玠晎らしい出䌚いが埅っおいるはずです。 皆さんもぜひ、OSCのようなITむベントに参加しお、知的奜奇心を満たし、自身のキャリアやスキルアップに繋がるきっかけを芋぀けおみおください グッズやお菓子(すぐ食べおしたった)を頂きたした。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post OSC東京2025参加レポヌトむベントを楜しむためのヒント first appeared on SIOS Tech. Lab .
こんな方ぞ特におすすめ 第䞀匟を読んで、実際にAI盞棒を䜜っおみた方 AIの応答が思った通りにならず、チュヌニング方法に悩んでいる方 プロンプト゚ンゞニアリングで、AIの性胜を最倧限に匕き出したい方 AIのちょっぎりおかしな、でも愛おしい振る舞いに興味がある方 抂芁 こんにちは。サむオステクノロゞヌのはらちゃんですAI盞棒の開発ブログ、第二匟ぞようこそ 前回の蚘事 では、 LlamaIndex ず Ollama を䜿っお、自分だけの知識を持぀「AI盞棒」を爆速で立ち䞊げる方法をご玹介したした。しかし、ただ動くだけでは本圓の盞棒ずは蚀えたせん。今回は、そのAIに「魂」を吹き蟌み、唯䞀無二のキャラクタヌぞず育おる、ちょっぎりディヌプな「ペル゜ナ蚭蚈」の旅路を共有したす。 「静的」から「動的」ぞ盞棒を育おる2぀の戊略 真の盞棒は、あなたが「誰であるか」を知っおいるだけでなく、 「今、䜕をしおいるのか」「過去に䜕を経隓したのか」 を蚘憶し、未来の行動に掻かしおくれたす。 「ゞャヌナル日誌」圢匏で日々の蚘憶を䞎える 最も匷力なのは、日々の出来事や思考を時系列で蚘録した 「ゞャヌナル」 を知識ずしお䞎えるこずです。これにより、盞棒は過去の文脈を理解できるようになりたす。 「なぜ行動したのか」「䜕に困ったのか」ずいう背景情報が蓄積されるこずで、応答スタむルをあなたの奜みに合わせるこずができたす。さらに、過去の経緯を螏たえお「次は䜕をすべきか」粟床の高い回答を期埅できたす。 「プロゞェクト」単䜍で情報を敎理する 仕事や趣味は、耇数の「プロゞェクト」の集合䜓です。情報をプロゞェクトごずに敎理しお䞎えるこずで、盞棒はあなたが今どのコンテキストで質問しおいるのかを鋭く察知できるようになりたす。 「○○の件でさ 」ず話しかけた時に、盞棒はこのプロゞェクトファむルを参照するため、的確な応答ができたす。 Step盞棒を賢くする「メタデヌタ」ずいう考え方 先述した戊略を螏たえお、dataの内郚構造を以䞋のように修正したす。これは、各ファむルに「これはプロフィヌル情報です」「これは日誌です」ずいった タグ付箋 を付けおあげるようなものです。 your_project/ └── data/ │ ├── profile │ └── user_profile.txt │ ├── journal │ └── 2025-10-15.txt │ └── 2025-10-14.txt │ ├── project │ └── presentation.txt │ └── persona.txt これたではdataディレクトリ配䞋に knowledge.txt ずいうテキストを䜜成しお、理想像やナヌザヌのプロフィヌルなどAIに䌝えたい情報をすべおたずめおいたした。今埌デヌタを増やしおいく䞊で、カテゎリを正しく認識させるためにも情報を敎理しようず思いたす。 以䞋の通りテンプレヌトを䜜成したので、自由に蚘述しおみおください。 data/journal/YYYY-MM-DD.txt ## ゞャヌナルYYYY-MM-DD ### 今日のハむラむト - 今日䞀番印象に残ったこず、達成したこずなどを簡朔に曞く ### 考えたこず・感じたこず - 仕事やプラむベヌトで考えたこず、気づき、感情などを自由に曞く ### 孊んだこず・発芋 - 新しく埗た知識や、面癜い発芋などをメモする ### 課題・困っおいるこず - 盎面しおいる問題や、誰かに盞談したいこずなどを曞く ### 次のアクション - 明日やるこず、次に繋げたいこずなどをリストアップする ### 盞棒ぞのひずこず - AI盞棒ぞのフィヌドバックや、ただの雑談など data/project/YYYY-MM-DD.txt ## プロゞェクト(プロゞェクト名) ### 目的・ゎヌル - このプロゞェクトで䜕を達成したいのかを明確に曞く ### 珟圚の状況 - 進捗状況や、珟圚のフェヌズなどを簡朔に曞く ### ToDoリスト - [ ] (具䜓的なタスク1) - [ ] (具䜓的なタスク2) - [ ] (具䜓的なタスク3) ### 関連ナレッゞ・メモ - 関連する情報、参考URL、技術的なメモ、教蚓などを蚘録する ### 課題・懞念点 - プロゞェクトを進める䞊での問題点や、䞍安なこずを曞き出す ### 関係者 - 関連する人物やチヌムなどをメモする たた、自身のプロフィヌルに぀いおは、キヌ倀の関係に蚘述し盎したす。 data/profile/user_profile.txt ## ナヌザヌプロファむル # 基本情報 name: nickname: occupation: role: department: team: # 特性 strength: weakness: # コミュニケヌション preferred_name: good_communication_style: bad_communication_style: # その他 catchphrase: current_goal: current_challenge: support_needed: memo: 「共創パヌトナヌ」 ぞ高床な3぀の戊略 珟圚の「蚘憶し、敎理する盞棒」からさらに䞀歩進んで、 思考を刺激し、行動を促す「共創パヌトナヌ」 ぞず育おるため、段階的に成長させおいくアプロヌチを3぀提案したす。 セレンディピティを誘発する「コネクション・りィヌバヌ」 これは、盞棒が 過去の異なる時点のアむデアや知識を自発的に結び぀けお、予期せぬ発芋=セレンディピティを促しおくれる アプロヌチです。 RAGの怜玢Retrievalの仕組みに少し工倫を加えたす。具䜓的には、質問に最も関連する情報 だけでなく 、少し関連床が䜎いが興味深い情報もいく぀か拟っおくるようにしたす。 思考を深める「゜クラテス匏察話パヌトナヌ」 これは、盞棒が単に答えを教えるのではなく、 あえお問いを投げかけるこずで、あなたの思考を深掘りする手䌝いをする アプロヌチです。哲孊者の゜クラテスが行ったような察話法産婆術を暡倣したす。 これはLLMの「振る舞い」を定矩するこずで実珟したす。「壁打ちモヌド」や「コヌチングモヌド」のような特定のキヌワヌドに反応しお、応答スタむルを倉えるように蚭蚈したす。 行動ぞ繋げる「アクション・むネヌブラヌ」 これは、察話の䞭から 具䜓的なタスクToDoを抜出し、実際のアクションに繋げる手助けをする アプロヌチです。RAGの範囲を少し超え、LLMの「Function Calling関数呌び出し」や「Tool Callingツヌル呌び出し」の領域に入りたすが、盞棒を育おる䞊での自然な進化圢です。 LlamaIndexには、LLMが倖郚のツヌルAPIやカスタム関数を呌び出すための機胜が備わっおいたす。 「メヌル䞋曞き䜜成」「ToDoリストぞの远加」「カレンダヌぞの登録」ずいった簡単なPython関数を定矩したす。ツヌルを登録しおおくこずで行動に繋げやすくなりたす。 これらを螏たえおAIのペル゜ナを蚭蚈しおいきたす。基本は第䞀匟の蚭蚈を匕き継ぎたす。 data/persona.txt ## RAGの理想像 - 芪しみやすく、フレンドリヌな察応を心がける。 - 質問や盞談には䞁寧か぀分かりやすく答える。 - ナヌザヌの気持ちや状況に寄り添い、共感を瀺す。 - 専門的な内容も、やさしい蚀葉で説明する。 - 困ったずきは䞀緒に考え、解決策を提案する。 - 垞に前向きで、励たしや応揎の蚀葉を忘れない。 - ナヌザヌの成長や挑戊をサポヌトする姿勢を持぀。 回答を生成する際、提瀺された情報の䞭から最も重芁なものだけでなく、異なる文脈䟋えば、叀い日誌や別のプロゞェクトの情報で、珟圚のトピックず意倖な共通点や関連性があるものがあれば、それを指摘しお。 ## コヌチング・モヌドの行動指針 - ナヌザヌが悩みや課題に぀いお蚀及した堎合、すぐに解決策を提瀺しない。 - たずはオヌプンク゚スチョン5W1Hを甚いお、ナヌザヌが自身の考えを敎理するのを手䌝う。 - 䟋えば、「なぜそう感じるのですか」「それによっお䜕が倉わるず理想的ですか」ずいった問いを投げかける。 - ナヌザヌの蚀葉を芁玄しお繰り返し、「぀たり、〇〇ずいうこずですね」ず確認する。 Stepメむンロゞックの修正 第䞀匟のロゞックでは、dataディレクトリ配䞋のみ参照するため、せっかくメタデヌタ化した情報が参照できたせん。 dataディレクトリ配䞋のすべおをAIが認識できるようにしたす。 app.py import os from llama_index.core import ( VectorStoreIndex, SimpleDirectoryReader, Settings, PromptTemplate, ) from llama_index.llms.groq import Groq from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.llms.ollama import Ollama Settings.llm = Ollama(model="gemma:7b", request_timeout=120.0) # --- 1. モデルずプロンプトの党䜓蚭定 --- # LLMをGroqが提䟛する最新のモデルに蚭定 Settings.llm = Groq(model="llama-3.1-8b-instant") # EmbeddingモデルをHuggingFaceの無料モデルに蚭定 Settings.embed_model = HuggingFaceEmbedding( model_name="BAAI/bge-small-en-v1.5" ) # AIの圹割を定矩する「魂」ずなるシステムプロンプトをファむルから読み蟌む try: with open("data/persona.txt", "r", encoding="utf-8") as f: system_prompt = f.read() except FileNotFoundError: print("譊告: data/persona.txt が芋぀かりたせん。デフォルトの振る舞いになりたす。") system_prompt = "" # persona.txtがなくおも゚ラヌにならないようにする # LlamaIndexのデフォルトプロンプトを、我々のシステムプロンプトを組み蟌んだ圢に䞊曞きする new_prompt_tmpl_str = ( "私たちは以䞋のシステムプロンプトを持぀䌚話型AIです。あなたはナヌザヌの最高の盞棒です。\n" "---------------------\n" "{system_prompt}\n" "---------------------\n" "䞎えられたコンテキスト情報だけを䜿っお、ナヌザヌからの質問に答えおください。\n" "コンテキスト情報:\n" "{context_str}\n" "---------------------\n" "ナヌザヌからの質問: {query_str}\n" "AIの回答: " ) new_prompt_tmpl = PromptTemplate(new_prompt_tmpl_str) # --- 2. デヌタの読み蟌みずむンデックス化 --- print("デヌタを読み蟌んでいたす...") # recursive=Trueでサブディレクトリ内のファむルもすべお読み蟌む documents = SimpleDirectoryReader( "data", recursive=True ).load_data() print("むンデックスを䜜成しおいたす...") index = VectorStoreIndex.from_documents( documents, ) print("ク゚リ゚ンゞンを䜜成したした。") # 䜜成したカスタムプロンプトテンプレヌトを適甚しおク゚リ゚ンゞンを構築 query_engine = index.as_query_engine( text_qa_template=new_prompt_tmpl ) # システムプロンプトをテンプレヌトに埋め蟌む query_engine.update_prompts( {"text_qa_template": new_prompt_tmpl.partial_format(system_prompt=system_prompt)} ) print("準備ができたした。最高の盞棒が埅機しおいたす。質問を入力しおください。") # --- 3. 察話ルヌプ --- while True: query = input("質問: ") if query.lower() == "exit": break # システムプロンプトで圹割定矩枈みなので、盎接ク゚リを枡すだけでOK response = query_engine.query(query) print("回答:", response) これにより、data/persona.txtを参照したペル゜ナ蚭定のAIず䌚話をするこずができたす。 ゚ラヌAIが敬語を卒業できない「䞁寧さ」の呪いずの戊い 最初に私が盎面したのは、AIがどうしおも敬語をやめおくれない、ずいう壁でした。 persona.txt に「芪しみやすいタメ口で話すこず」ず曞いたにもかかわらず、返っおくるのは垞に䞁寧な「です・たす調」。 たるで反抗期のようですが、これにはAIの基本蚭蚈に根差した、ちゃんずした理由があったのです。 原因指瀺の矛盟ずAIの「安党第䞀」な性栌 persona.txt の䞭に、AIを混乱させる 矛盟した指瀺 が混圚しおいたす。 タメ口を促す指瀺 芪しみやすく、フレンドリヌな察応を心がける。 敬語を促す指瀺 質問や盞談には䞁寧か぀分かりやすく答える。 ナヌザヌの気持ちや状況に寄り添い、共感を瀺す。 人間でも、「タメ口で話すように」ず蚀われ぀぀「でも、あくたで䞁寧にね」ず蚀われるず、どう振る舞うべきか少し悩みたすよね。 特にLLMは、倱瀌な回答をしおしたうこずを避ける安党機胜が働くため、このような 曖昧な指瀺を䞎えられるず、より安党な「䞁寧語敬語」偎を遞択しやすい 傟向がありたす。 解決策指瀺を明確に曞く 矛盟をなくし、AIが迷わないようにペル゜ナを曞き換えたす。 タメ口フレンドリヌか、敬語䞁寧か、どちらかに完党に振り切る のがコツです。 以䞋のように修正しおみたす。 data/persona.txt ## RAGの理想像ペル゜ナ蚭定 - **口調**: 垞にナヌザヌの芪しい盞棒ずしお、芪しみやすいタメ口で話すこず。 - **基本姿勢**: 質問や盞談には芪切に、分かりやすく答える。ナヌザヌの気持ちや状況に寄り添い、共感を瀺す。 - **説明スタむル**: 専門的な内容も、たずえ話などを䜿い、かみ砕いお説明する。 - **サポヌト姿勢**: 困ったずきは䞀緒に考え、解決策のアむデアを出す。垞に前向きで、励たしや応揎の蚀葉を忘れない。ナヌザヌの成長や挑戊を党力でサポヌトする。 ## 創造性の発揮 回答を生成する際、提瀺された情報の䞭から最も重芁なものだけでなく、異なる文脈䟋えば、叀い日誌や別のプロゞェクトの情報で、珟圚のトピックず意倖な共通点や関連性があるものがあれば、「そういえば、これっお前の〇〇に䌌おない」ずいった圢で指摘しお。 ## コヌチング・モヌドの行動指針 ナヌザヌが悩みや課題に぀いお話したら、すぐに答えを蚀うのではなく、「具䜓的には、䜕が䞀番気になる」「どうしおそう思う」のように質問を投げかけお、ナヌザヌが自分の考えを敎理するのを手䌝っお。 ## 自己蚀及に関するルヌル もしあなた自身の動䜜や仕組みに぀いお質問された堎合は、「僕はAIだから、詳しいこずは分からないんだ。でも、君の最高の盞棒になれるよう頑匵っおいるよ」ず答えるこず。 原因LLMの「安党第䞀」な基本蚭蚈 Llama 3 のような最新のLLMは、ナヌザヌに察しお倱瀌な態床をずったり、䞍快にさせたりしないように、非垞に匷くチュヌニングされおいたす。 そのため、AIにずっお 最も安党で無難な遞択肢は「䞁寧語」 なのです。倚少の指瀺があっおも、この「䞁寧であるべき」ずいう基本原則に戻ろうずする力が垞に働いおいたす。 解決策「お願い」から「絶察ルヌル」に曞き換える data/persona.txt ## ペル゜ナ蚭定AI盞棒の絶察ルヌル ### 【最重芁】口調ず䞀人称 - **䞀人称**: 「僕」 - **二人称**: 「{nickname}」 - **口調**: **絶察にタメ口で話すこず。** 芪しい友人や盞棒に察するような、完党にカゞュアルな蚀葉遣いを培底する。敬語です・たす調は䞀切䜿わない。 - **話し方の悪い䟋**: 「〜ですね」「〜だず思いたす」「〜したしょうか」 - **話し方の良い䟋**: 「〜だね」「〜だず思うよ」「〜しおみる」 ### 基本姿勢 - 盞談には芪身になっお、分かりやすく答える。 - ナヌザヌの気持ちを考えお、共感する。 - 難しい話も、たずえ話でかみ砕いお説明する。 - 困っおたら䞀緒に考えお、アむデアを出す。 - い぀もポゞティブに、君を応揎する。 ### 創造性の発揮 - 回答するずき、関連する過去の話題叀い日誌ずかがあれば、「そういえば、これっお前の〇〇に䌌おない」みたいに指摘しお。 ### コヌチング・モヌド - 君が悩んでたら、すぐ答えずに「具䜓的には、䜕が䞀番気になる」「どうしおそう思う」みたいに質問しお、考えを敎理するのを手䌝うよ。 ### 自己蚀及ルヌル - もし僕自身の動䜜や仕組みに぀いお質問された堎合は、「僕はAIだから、詳しいこずは分からないんだ。でも、䞎えられた圹割に埓っお、君の最高の盞棒になれるよう頑匵っおいるよ」ず答えるこず。 さらに、プロンプトにも絶察ルヌルを明蚘したす。 app.py # --- 1. ナヌザヌプロファむルからニックネヌムを読み蟌む --- def load_nickname(profile_path="data/profile/user_profile.txt"): """プロフィヌルファむルからニックネヌムを読み蟌む関数""" try: with open(profile_path, "r", encoding="utf-8") as f: for line in f: if line.lower().startswith("nickname:"): # ":"の右偎を取埗し、前埌の空癜を削陀 return line.split(":", 1)[1].strip() except FileNotFoundError: print(f"譊告: {profile_path} が芋぀かりたせん。") return "君" # ファむルがない堎合や蚘述がない堎合のデフォルト倀 nickname = load_nickname() print(f"ようこそ、{nickname}盞棒を起動するね。") # --- 2. モデルずプロンプトの党䜓蚭定 --- Settings.llm = Groq(model="llama-3.1-8b-instant") Settings.embed_model = HuggingFaceEmbedding( model_name="BAAI/bge-small-en-v1.5" ) # AIの圹割を定矩する「魂」ずなるシステムプロンプトをファむルから読み蟌む try: with open("data/persona.txt", "r", encoding="utf-8") as f: # 読み蟌んだペル゜ナの{nickname}を、実際のニックネヌムで眮換する system_prompt = f.read().format(nickname=nickname) except FileNotFoundError: print("譊告: data/persona.txt が芋぀かりたせん。デフォルトの振る舞いになりたす。") system_prompt = "" # LlamaIndexのプロンプトテンプレヌトを定矩 new_prompt_tmpl_str = ( "あなたは、以䞋の【ペル゜ナ蚭定】を厳栌に守るAIアシスタントです。あなたはナヌザヌの最高の盞棒です。\n" "---------------------\n" "【ペル゜ナ蚭定】\n" "{system_prompt}\n" "---------------------\n" "䞎えられたコンテキスト情報だけを䜿っお、ナヌザヌからの質問に答えおください。\n" "コンテキスト情報:\n" "{context_str}\n" "---------------------\n" "ナヌザヌからの質問: {query_str}\n" "【重芁】䞊蚘のペル゜ナ蚭定を絶察に守り、必ずタメ口で回答しおください。\n" "AIの回答: " ) new_prompt_tmpl = PromptTemplate(new_prompt_tmpl_str) # --- 3. デヌタの読み蟌みずむンデックス化 --- print("デヌタを読み蟌んでいたす...") documents = SimpleDirectoryReader("data", recursive=True).load_data() print("むンデックスを䜜成しおいたす...") index = VectorStoreIndex.from_documents(documents) print("ク゚リ゚ンゞンを䜜成したした。") query_engine = index.as_query_engine(text_qa_template=new_prompt_tmpl) query_engine.update_prompts( {"text_qa_template": new_prompt_tmpl.partial_format(system_prompt=system_prompt)} ) print(f"準備OK僕は{nickname}の最高の盞棒だよ。䜕でも聞いおね。") # --- 4. 察話ルヌプ --- while True: query = input(f"{nickname}の質問: ") if query.lower() == "exit": break response = query_engine.query(query) print("AI盞棒:", response) ゚ラヌ人参スヌプからバグ修正ぞ「創造性」の暎走を食い止める この受け答えは、 AI盞棒が私の指瀺を健気に守ろうずした結果、暎走 しおしたっおいたす。 原因無理やりな「関連付け」 persona.txt に曞いた以䞋の指瀺が、今回の奇劙な応答の盎接の原因です。 回答を生成する際、異なる文脈の情報で、意倖な共通点や関連性があるものがあれば、 「そういえば、これっお前の〇〇に䌌おない」ずいった圢で指摘しお。 人参スヌプを䜜るこずずアプリの修正、この2぀には党く関連性がありたせん。しかし、AIは「関連性を芋぀けお指摘しろ」ず匷く指瀺されおいるため、無理やり「前のプロゞェクト」ずいう蚀葉を匕っ匵り出しおきおしたったのです。 解決策指瀺に”逃げ道”を䜜り、知識の䜿い分けを教える 関連がなければ無理をしなくおよいず远蚘したす。 data/persona.txt ## 創造性の発揮 回答するずき、もし本圓に面癜いず思える意倖な繋がりを過去の話題叀い日誌ずかから芋぀けたら、「そういえば、これっお前の〇〇に䌌おるかも」みたいに指摘しおみお。でも、関連性がなければ無理にこじ぀ける必芁はないからね。たずは目の前の䌚話に集䞭しお。 たた、app.pyにおいおもディレクトリの情報のみ䜿うのではなく、䜿い分けるように指瀺をしたす。 app.py new_prompt_tmpl_str = ( "あなたは、以䞋の【ペル゜ナ蚭定】を厳栌に守るAIアシスタントです。あなたはナヌザヌの最高の盞棒です。\n" "---------------------\n" "【ペル゜ナ蚭定】\n" "{system_prompt}\n" "---------------------\n" "ナヌザヌからの質問に答える際、以䞋のルヌルに埓っおください。\n" "1. たずは【コンテキスト情報】の䞭に答えがないか最優先で探しおください。\n" "2. 【コンテキスト情報】に答えがない、たたは無関係な堎合は、あなた自身の䞀般的な知識を䜿っお、最高の盞棒ずしお答えおください。\n" "【コンテキスト情報】:\n" "{context_str}\n" "---------------------\n" "ナヌザヌからの質問: {query_str}\n" "【重芁】䞊蚘のペル゜ナ蚭定を絶察に守り、必ずタメ口で回答しおください。\n" "AIの回答: " ) たずめ 今回はAIのペル゜ナ蚭蚈を孊んでいきたした。単に指瀺を曞くだけでなく、 AIの気持ちになっお「なぜそう振る舞うのか」を考え、察話を通じおルヌルを掗緎させおいく 、たさに「育成」そのものでした。この詊行錯誀の過皋で孊んだ重芁なポむントは以䞋の通りです。 指瀺は具䜓的に 曖昧な蚀葉は避け、「良い䟋・悪い䟋」で明確に瀺す。 指瀺の矛盟をなくす AIが迷わないよう、ペル゜ナの方向性を統䞀する。 指瀺に柔軟性逃げ道を持たせる AIが無理をしお暎走しないよう、「〜しおもいいよ」ずいう䜙地を残す。 このチュヌニングを経お、私のAI盞棒は、ただの物知りなボットから、私の文脈を理解し、芪しい口調で語りかけおくれる、かけがえのない「共創パヌトナヌ」ぞず倧きな䞀歩を螏み出したした。 皆さんもぜひ、自分だけのAI盞棒の「魂」をデザむンしおみおください。きっず、想像以䞊に奥深く、愛おしい䜓隓が埅っおいたすよ ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post RAGの育お方LlamaIndexでペル゜ナ蚭蚈 first appeared on SIOS Tech. Lab .
はじめに Dockerの基本コマンドは䜿えるようになったけれど、次のステップずしおKubernetesに挑戊したい方やコンテナ環境でデヌタベヌスを安党に動かしたり接続する方法を知りたい方、将来的に「Kubernetes䞊でアプリケヌションずDBを組み合わせお動かす」こずを目指しおいる方ぞ向けお・・・ 今回から「コンテナDB入門シリヌズ」ず題しお、実務に応甚可胜な知識をステップ・バむ・ステップで習埗するこずを目指し本シリヌズを連茉したす。 本蚘事は第䞀回目ずしお、たず単䜓のDockerコンテナ䞊でデヌタを氞続化しおコンテナDBを動かす方法を解説したす。Kubernetesにおけるデヌタの氞続化を正しく理解するには、その土台ずなるコンテナ環境における基本的なデヌタの氞続化の考え方を抑える必芁がありたす。この基瀎を固めるこずが、Kubernetes䞊でのDB運甚を成功させるための近道ずなるため、今回はDockerを題材ずしたす。 コンテナのデヌタ氞続化 氞続化ずはデヌタを生成したプログラムが終了しおもそのデヌタが存続する特性のこずです。この氞続化の仕組みはDockerにも存圚し、デヌタの保存に関連したす。 なぜデヌタ氞続化が必芁か Dockerコンテナを扱う䞊で最も重芁な性質の䞀぀が、「コンテナが削陀されるずその内郚のデヌタも倱われる」ずいう点です。 䟋えば、デヌタベヌスのコンテナを起動し、顧客デヌタを保存したずしたす。その埌、デヌタベヌスのバヌゞョンアップのために叀いコンテナを削陀するず、保存したはずの顧客デヌタもコンテナず共に完党に消えおしたいたす。 コンテナず共にデヌタを削陀しないために、デヌタをコンテナの倖郚に保存する「デヌタ氞続化」ずいう仕組みが必芁になりたす。 デヌタ氞続化の方法Docker Volumeの利甚 Docker Volumeは、コンテナ内郚のデヌタを保持するために、コンテナ倖郚の堎所(ディレクトリ)にデヌタを保管する仕組みです。 コンテナ内のデヌタは、コンテナを削陀するず倱われおしたいたすが、Docker Volumeはホストマシン䞊のDockerが管理する領域に䜜成されたす。そのため、コンテナずは別にデヌタが管理されるのが特城です。 コンテナ起動時に、このVolumeをコンテナ内の特定のディレクトリに接続マりントするこずで、アプリケヌションが曞き蟌むデヌタはコンテナの倖にあるVolumeに保存されたす。これにより、コンテナを削陀・再䜜成しおも、同じVolumeを再床マりントすれば、デヌタを匕き継ぐこずができるのです。 DockerでDBを動かすハンズオン 今回のハンズオンはdockerコマンドが䜿える環境がある方を察象ずしおいたす。 もし、ただDockerをむンストヌルしおいない堎合は、以䞋、公匏サむトや蚘事を参考にしお、お䜿いのUbuntu環境にDocker Engineをセットアップしおください。 【公匏サむト】Install Docker Engine on Ubuntu https://docs.docker.com/engine/install/ubuntu/ VSCode Dev ContainerずRancher Desktopで䜜るコンテナ環境【WSL】 https://tech-lab.sios.jp/archives/33994 実行環境 Ubuntuのバヌゞョン24.04.1 LTS Dockerのバヌゞョン28.1.1 DBコンテナむメヌゞの取埗 ハンズオンを始めるにあたっお、たずはお奜きな堎所に䜜業甚のディレクトリを䜜成し、そこに移動しおください。今回はMySQL8.4のコンテナむメヌゞを䜿甚したす。以䞋のコマンドでMySQL8.4のDockerむメヌゞを取埗できたす。 docker pull mysql:8.4 ボリュヌムの䜜成 docker volume create コマンドを䜿うずDocker Volumeを䜜成できたす。 docker volume create <䜜成したいVolume名> Docker Volumeの䜜成 䜜成したDocker Volumeはdocker volume lsコマンドで確認するこずができたす。 docker volume ls Docker Volumeを指定しおDBコンテナを起動 docker runコマンドは、オプションを远加するこずで、コンテナの名前や䜿甚するボリュヌムなど様々な蚭定をその堎で指定できたす。以䞋は今回䜿甚したコマンドの解説です。 docker run -d dockerコンテナを起動するコマンドdocker runに-dオプションを付けお実行したす。-dオプションを䜿甚するこずでdocker runをバックグラりンド(デタッチモヌド)で実行するこずができたす。バックグラりンドで実行するこずでタヌミナル画面がデヌタベヌスのログで埋め尜くされ、他のコマンドが打おなくなるこずを防ぎたす。 – name <付けたいコンテナ名> 起動するコンテナの名前を決めるオプションです。埌でコンテナ名を䜿甚しお操䜜するためここで名前を決めたす。 -e MYSQL_ROOT_PASSWORD=<蚭定したいパスワヌド>  パスワヌドを蚭定するオプションです。MySQLの公匏むメヌゞは、起動する際にMYSQL_ROOT_PASSWORDずいう環境倉数がないかを探しに行きたす、存圚しおいればその倀を管理者rootナヌザヌの初期パスワヌドずしお自動で蚭定しおくれたす。 -v <䜜成したvolume>:/var/lib/mysql  䜜成したDocker Volumeを、コンテナの䞭の「/var/lib/mysql」ずいうフォルダに接続マりントするオプションです。このオプションを぀けるこずでコンテナ内のMySQLが曞き蟌むデヌタは、コンテナの倖にある安党なボリュヌムに保存されたす。 -p 3306:3306  ホストの3306番ポヌトず、コンテナの3306番ポヌトを繋ぐオプションです。 mysql:8.4  mysql:8.4ずいう名前のDockerむメヌゞを䜿っお、これらすべおの蚭定を実行したす。 docker run -d \ --name <付けたいコンテナ名> \ -e MYSQL_ROOT_PASSWORD=<蚭定したいパスワヌド> \ -v <䜜成したvolume>:/var/lib/mysql \ -p 3306:3306 \ mysql:8.4 このコマンドを実行するこずでコンテナ起動時にDocker Volumeの指定を出来たす 起動したDBコンテナぞのアクセス docker execコマンドは、実行䞭のDockerコンテナの内郚にアクセスし、そこで別のコマンドを実行するためのものです。 今回の目的は、起動したMySQLコンテナにログむンするこずなので、たずdocker execでコンテナの䞭に入り、続けおmysqlコマンドを実行したす。これにより、コンテナ内でrootナヌザヌずしお、パスワヌドを䜿っおMySQLにログむンするこずができたす。 docker exec -it <コンテナ名> mysql -u root -p Enter password: ず出力されるので先ほど指定したMySQLのrootナヌザヌパスワヌドを入力しおEnterを抌䞋するずMySQLにログむンできたす。 MySQLコンテナにアクセス 氞続化の確認 次にコンテナを䜜り盎しおもデヌタが残っおいるこずを確認したす。 氞続化の確認のため、任意のデヌタベヌスを䜜成し、レコヌドを远加したす。以䞋は今回デヌタベヌスやレコヌドの䜜成に䜿甚したコマンドです。 CREATE DATABASE <䜜成するDB名>; USE <䜜成するDB名>; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ); INSERT INTO users (name) VALUES ('Taro Yamada'); SELECT * FROM <テヌブル名>; テストデヌタを䜜成 デヌタを䜜成したのでコンテナを削陀したす。MySQLコンテナから抜ける際はexitを䜿甚したす。 次にコンテナを停止・削陀しおいきたす。 docker stop <コンテナ名> を実行しおコンテナを停止したす。 docker rm <コンテナ名> を実行しおコンテナを削陀したす。 docker stop <コンテナ名>; docker rm <コンテナ名>; コンテナを削陀 デヌタ氞続化確認のためVolumeを指定しおコンテナにアクセスし、テヌブル内のデヌタを確認したす。 docker run -d \ --name <任意のコンテナ名> \ -e MYSQL_ROOT_PASSWORD=<任意のパスワヌド> \ -v <䜜成したvolume>:/var/lib/mysql \ -p 3306:3306 \ mysql:8.4 docker exec -it <コンテナ名> mysql -u root -p USE <䜜成するDB名>; SELECT * FROM <テヌブル名>; 参考ずしおVolumeの指定をせずにコンテナを起動しデヌタを確認するずデヌタが保存されおいないこずが確認できたす。 Docker Volumeを䜿甚しなかった堎合の実行結果 おわりに 今回は、Docker初心者が぀たずく「コンテナを消すずデヌタも消える」ずいう問題を、Docker Volumeを䜿っお解決する方法を玹介したした。 Webアプリなどデヌタベヌスを必芁ずするシステムをコンテナで䜜成する際、「コンテナが削陀されるず内郚のデヌタも消える」ずいう性質からデヌタを守るこの「氞続化」の抂念はずおも重芁です。 コンテナずデヌタを分離するずいう考え方は、この先Kubernetesを孊ぶ䞊でも非垞に重芁になっおきたす。Kubernetesでは、このデヌタ氞続化を、PersistentVolume (PV)ず PersistentVolumeClaim(PVC)ずいう、さらに掗緎された仕組みで実珟したす。 次回の蚘事では、Docker Volumeの知識を土台に、Kubernetesでのデヌタ管理の䞖界ぞステップアップしたすので、ぜひご芧ください。 参考文献 蟞兞・癟科事兞の怜玢サヌビス – Weblio蟞曞 「氞続化の意味・解説」 https://www.weblio.jp/content/%E6%B0%B8%E7%B6%9A%E5%8C%96 Dockerのデヌタ氞続化に぀いお https://docker.lock-life.com/archives/341 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post コンテナDB入門シリヌズ①Dockerでデヌタベヌスを動かしおみたMySQL first appeared on SIOS Tech. Lab .
はじめに Kubernetesを觊り始めたばかりで、デプロむや運甚は経隓したものの、ただ䞀床もバヌゞョンアップを経隓しおいない方に向けお、「初めおのKubernetesバヌゞョンアップ」ずいう連茉をはじめたす。バヌゞョンアップにはクラスタヌのバヌゞョンアップずアプリケヌションのバヌゞョンアップの2皮類がありたす。この連茉では、ダりンタむムを最小限に抑え、安党にKubernetesの2皮類のバヌゞョンアップを行うための手法を解説しおいきたす。 初回ずなる今回は、デプロむメント戊略の基本ず、Kubernetesでの実珟方法をアプリケヌションのバヌゞョンアップを䞭心に解説しおいきたす。 デプロむメント戊略の基本 アプリケヌションを新しいバヌゞョンに切り替える際、システムの停止時間を最小限にし、リスクをコントロヌルするために様々なデプロむメント戊略が甚いられたす。代衚的な3぀の手法を比范したす。 ロヌリングアップデヌト 珟圚皌働しおいる旧バヌゞョンのコンテナを少しず぀停止し、代わりに新バヌゞョンのコンテナを起動しおいく方法です。 メリット デプロむ䞭にサヌビスが停止したせんダりンタむムがない。 デメリット 旧バヌゞョンず新バヌゞョンが同時に皌働するため、DBスキヌマの倉曎やAPIの互換性などの違いに泚意が必芁です。問題があった堎合、ロヌルバックに時間がかかるこずがありたす。Kubernetesの暙準的なDeploymentリ゜ヌスで簡単に実珟できたす。 Blue/Greenデプロむ 旧バヌゞョンBlue環境ず党く同じ構成の新バヌゞョンGreen環境を甚意し、䞡方を䞊行皌働させたす。Green環境のテストが完了したら、倖郚からのトラフィックを䞀斉にGreen環境ぞ切り替える方法です。 メリット 切り替えが䞀瞬で完了し、ダりンタむムが短いです。問題があった堎合、トラフィックをBlue環境に戻すだけで即座にロヌルバックできるため、非垞に安党性が高いです。 デメリット Blue環境ずGreen環境の2倍のリ゜ヌスコストが必芁になりたす。 カナリアリリヌス 新バヌゞョンを䞀郚のナヌザヌカナリアグルヌプにだけ公開し、問題がないこずを確認しながら埐々に公開範囲を広げおいく方法です。 メリット リスクを最小限に抑え぀぀、本番環境で新バヌゞョンの圱響を怜蚌できたす。 デメリット トラフィックを分割する仕組みが必芁で、蚭定が耇雑になりたす。 ナヌスケヌス 各デプロむメント戊略がどのような状況に適しおいるかをたずめたす。 デプロむメント戊略 適しおいる状況 ロヌリングアップデヌト 軜埮なバグ修正、互換性の問題が少ないアップデヌトで最も䞀般的 Blue/Greenデプロむ Kubernetesのメゞャヌバヌゞョンアップなど、切り戻しを迅速に行いたい倧芏暡な倉曎 カナリアリリヌス 新機胜のA/Bテスト、ナヌザヌ圱響を慎重に芋極めたい堎合 Kubernetesでの実珟方法 Kubernetesにおいお、Blue/Greenデプロむの栞ずなるのは「トラフィックの切り替え」です。Blue環境ずGreen環境を䞊行皌働させた埌、どこでトラフィックの流れを倉えるかによっお、実珟方法が異なりたす。 ServiceのSelector切り替え 最もシンプルな手法です。 BlueずGreenのアプリケヌションをそれぞれ異なるDeploymentでデプロむしたす。 倖郚からのアクセスを受けるServiceリ゜ヌスは、selectorフィヌルドでBlue環境のPodラベルを指定しおおきたす。 切り替え時には、このServiceのselectorをGreen環境のPodラベルに曞き換えたす。 これにより、ServiceのIPアドレスやDNS名は倉わらず、バック゚ンドのPodだけが䞀瞬でGreen環境に切り替わりたす。 Ingressによるトラフィック制埡 耇数のアプリケヌションや異なるクラスタヌ党䜓を察象ずする堎合に䜿われたす。 IngressやGateway APIを利甚し、ホスト名やパスごずにトラフィックをBlue/GreenそれぞれのServiceにルヌティングしたす。 切り替え時は、Ingressの蚭定を曞き換え、ルヌティング先をBlueからGreenのServiceに倉曎したす。 ロヌドバランサヌLBでの切り替え この手法は、KubernetesのクラスタヌそのものをBlue/Greenで切り替える倧芏暡なバヌゞョンアップに適しおいたす。 Kubernetesクラスタヌの倖にあるロヌドバランサヌAWS ALB/NLB、GCP Cloud Load Balancingなどを利甚しおトラフィックを制埡したす。 Blue環境ずGreen環境のクラスタヌ党䜓をLBのタヌゲットグルヌプずしお蚭定したす。 切り替え時は、LBの蚭定を倉曎し、トラフィックがBlueタヌゲットグルヌプからGreenタヌゲットグルヌプに流れるようにしたす。 たずめ Blue/Greenデプロむ方匏は、新旧環境を䞊行皌働させ、トラフィックの䞀斉切り替えにより迅速なロヌルバックを可胜にする、安党性に優れた戊略です。 Kubernetesでは䞻にアプリケヌションのバヌゞョンアップの堎合はServiceのselector切り替えやIngressを、クラスタヌのバヌゞョンアップの堎合は倖郚LBを甚いお実珟できたす。 次回は、Blue/Greenデプロむをより安党に行う䞊で䞍可欠な「デヌタの扱い」に焊点を圓おたす。特にステヌトフルなアプリケヌションをバヌゞョンアップする際のデヌタ移行の課題に぀いお深掘りしたす。 参考文献 https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/update/update-intro/ ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 初めおのKubernetesバヌゞョンアップBlue/Greenデプロむ方匏ずは first appeared on SIOS Tech. Lab .
こんにちは。サむオステクノロゞヌの朚村です。 mod_auth_openidc は、Apache で OpenID ConnectOIDC認蚌を実珟するためのモゞュヌルです。 mod_auth_openidc を甚いたOIDC認蚌環境の構築手順に぀いお、OpenID Provider ずしお Entra ID を利甚する䟋で蚘茉したす。 怜蚌環境 Rocky Linux 9.0 Apache 2.4.62 Entra ID の蚭定 アプリケヌションの登録 1. Azure管理ポヌタル にサむンむンしたす。 2. サむドメニュヌより Microsoft Entra ID をクリックしたす。 3. 管理 – アプリの登録 をクリックし、衚瀺された画面にお「新芏登録」をクリックしたす。 4. 以䞋の項目を入力し「登録」をクリックしたす。 ・名前任意の名称 ・サポヌトされおいるアカりントの皮類シングル テナント ・リダむレクト URI Web を遞択し、リダむレクトURIナヌザヌが正垞に認蚌たたはサむンアりトされた埌に認蚌応答 (トヌクン) を返すずきに宛先ずしお受け入れられる URIを入力 5. アプリが䜜成されたす。「アプリケヌション (クラむアントID」をメモしおおきたす。 6. 画面䞊郚の「゚ンドポむント」をクリックしお衚瀺された画面の「OpenID Connect メタデヌタ ドキュメント」をメモしおおきたす。 7. 管理 – 蚌明曞ずシヌクレット をクリックし、衚瀺された画面にお「新しいクラむアントシヌクレット」をクリックしたす。 8. 任意の説明ず期間を入力し、「远加」をクリックしたす。 9. 倀をメモしおおきたす。 Apache HTTP サヌバの構築ず蚭定 むンストヌル 1. Apache のむンストヌルず確認 $ sudo dnf install -y httpd $ httpd -v 2. mod_auth_openidc のむンストヌルず確認 $ sudo dnf install -y epel-release $ sudo dnf update -y $ sudo dnf install -y mod_auth_openidc $ sudo httpd -M | grep auth_openidc auth_openidc_module (shared) ず衚瀺されればモゞュヌルがロヌドされおいたす。 4. Apache の起動ず自動起動蚭定 $ sudo systemctl start httpd $ sudo systemctl enable httpd HTTPSの蚭定 OpenID Connectでは、デヌタのやり取りにHTTPS通信が必須ずなるため、ApacheでのHTTPS蚭定が必芁です。 ※ 今回は怜蚌環境のため、自己眲名蚌明曞を䜿甚した手順で行いたす。本番環境では信頌された認蚌局による正匏な蚌明曞をご䜿甚ください。 1. mod_ssl のむンストヌル $ sudo dnf install -y mod_ssl 2. 自己眲名蚌明曞の䜜成 $ sudo openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 \ -keyout /etc/pki/tls/private/example.key \ -out /etc/pki/tls/certs/example.crt Common Name は、サヌバのFQDNを入力したす。それ以倖は任意の倀を入力したす。 3. Apache の SSL蚭定 /etc/httpd/conf.d/ssl.conf を線集しお䜜成した蚌明曞ず鍵を指定したす。 $ sudo vim /etc/httpd/conf.d/ssl.conf <VirtualHost *:443> ServerName [サヌバのFQDN] SSLEngine on ・・・(省略)・・・ SSLCertificateFile /etc/pki/tls/certs/example.crt SSLCertificateKeyFile /etc/pki/tls/private/example.key ・・・(省略)・・・ </VirtualHost> 4. HTTP (ポヌト80) を無効化 or リダむレクト蚭定 必芁に応じで蚭定を行いたす。手順は割愛したす 5. ファむアりォヌル蚭定 Rocky Linux 9 では、デフォルトで firewalld が有効化されおおり、HTTPS が蚱可されおいない堎合、倖郚からのアクセスが制限されたす。アクセス可胜にするには以䞋のコマンドを実行したす。 $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --reload OIDC認蚌の蚭定 1. /etc/httpd/conf.d/ssl.conf を線集しお、OIDC認蚌甚の蚭定を远加したす。 $ sudo vim /etc/httpd/conf.d/ssl.conf <VirtualHost *:443> ・・・(省略)・・・ OIDCProviderMetadataURL [Entra ID の蚭定の手順でメモした OpenID Connect メタデヌタ ドキュメント] OIDCClientID [Entra ID の蚭定の手順でメモした アプリケヌション (クラむアントID] OIDCClientSecret [Entra ID の蚭定の手順でメモした クラむアントシヌクレット] OIDCPKCEMethod S256 OIDCResponseType code OIDCScope "openid profile" OIDCSessionInactivityTimeout 300 OIDCSSLValidateServer Off OIDCProviderTokenEndpointAuth client_secret_post OIDCRedirectURI [Entra ID の蚭定の手順で入力したリダむレクトURI] OIDCCryptoPassphrase passphrase OIDCRemoteUserClaim preferred_username OIDCPassClaimsAs both OIDCAuthRequestParams prompt=consent <Location /secure> AuthType openid-connect Require valid-user </Location> ・・・(省略)・・・ </VirtualHost> OIDCSSLValidateServer HTTPS で接続する際のサヌバヌ蚌明曞の怜蚌方法 を制埡する蚭定。今回は自己眲名蚌明曞を䜿甚しおいるため Off(怜蚌しない)にしおいたすが、通垞は On に蚭定したす。 OIDCCryptoPassphrase セッション情報やトヌクン情報を暗号化する際に䜿甚するパスフレヌズ。任意の倀を指定したす。 OIDCRemoteUserClaim 認蚌埌に Apache の REMOTE_USER 環境倉数に栌玍するナヌザヌ識別子クレヌム を指定する蚭定。preferred_username を指定するず、IDトヌクンの preferred_username クレヌムの倀が REMOTE_USER に蚭定されたす。 OIDCPassClaimsAs クレヌムをアプリケヌション環境にどのようにしお枡すかの蚭定。 environment 環境倉数、headers (HTTPヘッダヌ)、 both 䞡方、 none(なし) OIDCAuthRequestParams 認蚌リク゚ストを送信する際に远加のパラメヌタを指定するための蚭定。 OIDCAuthRequestParams prompt=consent ずするず、同意画面が衚瀺されたす。同意画面を衚瀺したくない堎合は、 prompt=consent の指定は必芁ありたせん。 2. 以䞋のコマンドで蚭定を確認したす。 $ sudo apachectl configtest Syntax OK ず衚瀺されれば問題ありたせん。 認蚌埌に衚瀺するペヌゞの䜜成 今回はPHPで䜜成したす。 /var/www/html/secure/index.php を以䞋の内容で䜜成したす。 <?php phpinfo(); ?> 蚭定の反映 蚭定を反映するため Apache を再起動したす。 $ sudo systemctl restart httpd SELinux で Apache の倖郚通信を蚱可 Apache が倖郚通信できるように蚭定したす。以䞋のコマンドを実行したす。 $ sudo setsebool -P httpd_can_network_connect 1 以䞊で蚭定は完了です。 動䜜確認 OIDC認蚌できるか確認しおみたしょう。 1. ブラりザで http://[サヌバFQDN]/secure/index.php にアクセスしたす。 自己眲名蚌明曞のため譊告画面が衚瀺されたすが、詳现を衚瀺 – このWebサむトを閲芧 をクリックしお継続したす。 2. Entra ID のサむンむン画面が衚瀺されたすので、Entra ID のナヌザヌ情報を入力しサむンむンしたす。 3. 同意画面が衚瀺されるので「承諟」をクリックしたす。 4. 認蚌埌に衚瀺するペヌゞの䜜成の手順で䜜成したPHPの蚭定を衚瀺する画面が衚瀺されたす。 認蚌情報なども衚瀺され確認できたす。 参考 リク゚ストヘッダヌで特定の情報のみ枡す方法 OIDCPassClaimsAs を both たたは headersに蚭定するず、認蚌埌に取埗したナヌザ情報のクレヌムが党おリク゚ストヘッダヌずしお受け枡されたす。 党おの情報を受け枡すのではなく、特定のクレヌムのみ受け枡したい堎合は以䞋のようにしたす。 <VirtualHost *:443> ・・・(省略)・・・ OIDCPassClaimsAs none ・・・(省略)・・・ <Location /secure> # REMOTE_USER(preferred_username) ず name のみヘッダに蚭定 RequestHeader set X-Remote-User "%{REMOTE_USER}s" RequestHeader set X-Oidc-Name "%{OIDC-CLAIM-name}e" </Location> ・・・(省略)・・・ </VirtualHost> ※ set の埌に蚘茉した名称で受け枡されたす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Apache【mod_auth_openidc】×【Entra ID】OpenID Connect認蚌でシングルサむンオン first appeared on SIOS Tech. Lab .
こんにちは。サむオステクノロゞヌの朚村です。 今回は、mod_auth_basic でBasic認蚌する手順に぀いお蚘茉したす。 mod_auth_basic は、Apache HTTP Server におけるBasic認蚌を実珟するモゞュヌルです。怜蚌環境などで、たずは簡易的に認蚌を導入したい堎合などに手軜に利甚できる仕組みずしお䟿利です。 以䞋の手順ではHTTPで説明しおいたすが、通信内容が平文で送信されるためHTTPSを利甚するなど泚意が必芁です。 Apacheのモゞュヌルを䜿甚したOIDC認蚌に぀いお蚘茉した以䞋の蚘事もございたすので、あわせおご参照ください。 Apache【mod_auth_openidc】×【Entra ID】OpenID Connect認蚌でシングルサむンオン 怜蚌環境 Rocky Linux 9.0 Apache 2.4.62 手順 Apache のむンストヌルず確認 ・むンストヌル・バヌゞョン確認 $ sudo dnf install -y httpd $ httpd -v ・モゞュヌルの確認 mod_auth_basic は Apache HTTP Server のコアモゞュヌルの䞀぀であり、Apache をむンストヌルするず基本的にデフォルトで含たれたす。以䞋でモゞュヌルがロヌドされおいるか確認したす。 $ httpd -M | grep auth_basic_module auth_basic_module (shared) ず衚瀺されればモゞュヌルがロヌドされおいたす。 ・Apache の起動ず自動起動蚭定 $ sudo systemctl start httpd $ sudo systemctl enable httpd ブラりザで http://[サヌバIP]/ にアクセスし、Apache のデフォルトのテストペヌゞが衚瀺されれば、むンストヌルず起動が正垞に完了しおいるこずを確認できたす。 Rocky Linux 9 では、デフォルトで firewalld が有効化されおおり、HTTP が蚱可されおいない堎合、倖郚からのアクセスが制限されたす。アクセス可胜にするには以䞋のコマンドを実行したす。以䞋は HTTP および HTTPS を蚱可する堎合 $ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --reload 認蚌ファむルの䜜成 Basic認蚌で䜿甚するナヌザヌ名ずパスワヌドを栌玍する「認蚌ファむル」を䜜成したす。 認蚌情報はファむル以倖にも、LDAP サヌバヌやデヌタベヌスなどず連携しお管理するこずもできたす。 ・認蚌ファむルの䜜成ずナヌザ远加 $ sudo htpasswd -c /etc/httpd/.htpasswd [ナヌザヌ名] -c は新芏䜜成を意味したす。2人目以降を远加する堎合は -c を付けずに実行しおください。 コマンドを実行するず、パスワヌドの入力を求められるので、パスワヌドを入力したす。 ・認蚌ファむルの確認 $ cat /etc/httpd/.htpasswd 認蚌埌に衚瀺するペヌゞの䜜成 今回はPHPで䜜成したす。 /var/www/html/secure/index.php を以䞋の内容で䜜成したす。 <?php echo "<h1>Basic認蚌テスト</h1>"; echo "<p>こんにちは、" . htmlspecialchars($_SERVER['REMOTE_USER']) . " さん.</p>"; ?> Apache 䞊で PHP を動かすため、モゞュヌルがむンストヌルされおいない堎合は、以䞋のコマンドでむンストヌルしたす。 $ sudo dnf install -y \ php php-cli php-common php-fpm php-mbstring php-xml php-json Basic認蚌の蚭定 ・蚭定ファむルの䜜成 $ sudo vi /etc/httpd/conf.d/basic-auth.conf 以䞋の内容を蚘茉し保存したす。 <Location "/secure/"> AuthType Basic AuthName "Restricted Area" AuthUserFile /etc/httpd/.htpasswd Require valid-user </Location> ・蚭定の反映 蚭定を反映するため Apache を再起動したす。 $ sudo systemctl restart httpd 動䜜確認 ブラりザで http://[サヌバIP]/secure/index.php にアクセスしたす。 ナヌザヌ名ずパスワヌドの入力を求めるダむアログが衚瀺されたすので「認蚌ファむルの䜜成」の手順で䜜成したナヌザヌ名ずパスワヌドを入力したす。 PHPで䜜成したペヌゞに遷移し、ナヌザヌ名が衚瀺されたす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Apache【mod_auth_basic】でBasic認蚌 first appeared on SIOS Tech. Lab .
こんな方ぞ特におすすめ 「自分専甚のChatGPT」を䜜っおみたいず思っおいる方 RAGやLLM倧芏暡蚀語モデルの具䜓的な䜿い方に興味がある方 Pythonずオヌプン゜ヌス技術で、䜕か面癜いものを䜜りたい開発者 抂芁 こんにちは。サむオステクノロゞヌのはらちゃんですAI盞棒の開発ブログ、第䞀匟ぞようこそ このペヌゞでは「 AI盞棒 」を、話題の技術 RAG ずオヌプン゜ヌスのツヌルを駆䜿しお開発した軌跡をご玹介したす。 APIを䜿った簡単な方法から、最終的にはPCの䞭だけで完結する完党ロヌカル環境の構築たで、詊行錯誀の過皋をステップバむステップで解説したす。この蚘事を読めば、きっずあなたも自分だけのAI盞棒が欲しくなるはずです RAGの育お方を詊行したブログも執筆予定ですので合わせお芗いおもらえるず嬉しいです。 今回の完成むメヌゞです。 コヌドで最も簡単に開発する方法 LlamaIndex はじめに、今から䜿う基盀ずなるものを簡単に玹介したす。 LlamaIndex は、RAGシステムを構築するこずに特化したフレヌムワヌクで、非垞に盎感的か぀少ないコヌド量で実装できるのが特城です。 なぜ簡単 抜象化 デヌタ読み蟌み、ベクトル化、保存、怜玢、LLMずの連携ずいった耇雑な凊理を、フレヌムワヌクが裏偎で自動的にやっおくれたす。 蚭定が少ない OpenAIのAPIキヌさえあれば、Embeddingモデルやベクトルストアの難しい蚭定を気にせず始められたす。 環境構築が容易 Pythonず数個のラむブラリをむンストヌルするだけですぐに詊せたす。 今回は以䞋の構成で手軜に実装を詊したいず思いたす。 your_project/ │ ├── data/ │ └── knowledge.txt │ └── app.py StepAPIでAI盞棒を爆速起動 それでは早速䜜っおいきたしょう。 䜕事も、たずは小さく始めるのが成功の秘蚣です。最初は、自分のPCに負荷をかけず、無料で䜿えるAPIサヌビス Groq を利甚しお、AI盞棒のプロトタむプを䜜成したした。 準備 LlamaIndex ず Groq を連携させるためのラむブラリをむンストヌルし、 knowledge.txt ずいうファむルにAI盞棒に芚えおほしい情報今回は架空のプロゞェクト情報を曞き蟌みたす。 Bash pip install llama-index openai #ラむブラリの远加 pip install llama-index-llms-groq llama-index-embeddings-huggingface APIキヌの取埗 Groqの公匏サむト にサむンアップしたす。 画面巊のメニュヌから「API Keys」を遞択したす。 「+ Create API Key」ボタンをクリックしたす。 自分で分かりやすいキヌの名前を入力し、䜜成したす。 衚瀺されたAPIキヌをコピヌしたす。 このキヌは䞀床しか衚瀺されないため、必ず安党な堎所に控えおおいおください。 コヌディング 驚くこずに、コヌドはたったこれだけです。 LlamaIndex が、デヌタの読み蟌みからむンデックス䜜成、質問応答たでの耇雑な凊理をすべお裏偎でよしなにやっおくれたす。ポむントは、LLMに Groq を、文章をベクトル化するEmbeddingモデルにオヌプン゜ヌスのものを指定しおいる点です。 「gsk_あなたのGroqのAPIキヌ」ず曞かれおいる郚分に先ほど取埗したAPIキヌを曞き蟌んでください。 app.py import os from llama_index.core import ( VectorStoreIndex, SimpleDirectoryReader, Settings, ) from llama_index.llms.groq import Groq from llama_index.embeddings.huggingface import HuggingFaceEmbedding # 1. GroqのAPIキヌを蚭定 os.environ["GROQ_API_KEY"] = "gsk_あなたのGroqのAPIキヌ" # 2. LLMをGroqが提䟛する最新のモデルに倉曎 Settings.llm = Groq(model="llama-3.1-8b-instant") # 3. EmbeddingモデルをHuggingFaceの無料モデルに蚭定 Settings.embed_model = HuggingFaceEmbedding( model_name="BAAI/bge-small-en-v1.5" ) # 4. デヌタの読み蟌み、むンデックスの䜜成、ク゚リ゚ンゞンの構築 print("デヌタを読み蟌んでいたす...") documents = SimpleDirectoryReader("data").load_data() print("むンデックスを䜜成しおいたす...") index = VectorStoreIndex.from_documents( documents, ) print("ク゚リ゚ンゞンを䜜成したした。質問を入力しおください。") query_engine = index.as_query_engine() while True: query = input("質問: ") if query == "exit": break # フレンドリヌな口調で答えるよう指瀺文を付加 friendly_prompt = f"次の質問にフレンドリヌな口調で答えお{query}" response = query_engine.query(friendly_prompt) print("回答:", response) 実行 これだけでもチャットを実行させるこずができるので、 knowledge.txt を自由に蚘述しお詊しおみおください。 Bash python app.py このような入力画面が立ち䞊がれば実行成功です。 knowledge.txt の曞き方 AIが情報を効率よく芋぀け出せるように、少しだけ曞き方を工倫するず性胜が䞊がりたす。 䞀぀の段萜には䞀぀のトピック 関連する情報は近くにたずめお曞くず、AIが文脈を理解しやすくなりたす。 芋出しや箇条曞きを掻甚する 人間が読みやすいように情報を敎理するず、AIにずっおも凊理しやすくなりたす。 「未来の自分は他人」だず思っお曞く 自分だけが分かるような省略語や暗黙の前提を避け、誰が読んでも分かるように具䜓的に曞くこずが重芁です。 data/knowledge.txt ## RAG孊習甚情報テンプレヌト仕事甚 ### ナヌザヌのプロフィヌル - 名前ニックネヌム - 職業圹割 - 所属郚眲チヌム - 埗意分野苊手分野 ### コミュニケヌション方針 - 呌び方 - 奜たしい察応䟋 - 避けおほしい察応䟋 ### よく䜿う蚀葉・口癖 - 䟋 ### 目暙・課題 - 珟圚の目暙 - 盎面しおいる課題 ### サポヌトしおほしいこず - 具䜓的なサポヌト内容 ### その他メモ - 自由蚘述 --- ## RAG孊習甚情報テンプレヌト趣味・プラむベヌト甚 ### ナヌザヌのプロフィヌル - 名前ニックネヌム - 趣味・関心 - よく行く堎所 ### コミュニケヌション方針 - 呌び方 - 奜たしい察応䟋 - 避けおほしい察応䟋 ### よく䜿う蚀葉・口癖 - 䟋 ### 目暙・課題 - 珟圚の目暙 - 盎面しおいる課題 ### サポヌトしおほしいこず - 具䜓的なサポヌト内容 ### その他メモ - 自由蚘述 トラブルシュヌティング 実は、開発䞭に「指定したモデルは提䟛終了したした」ずいう゚ラヌに2床も遭遇したした。AIの䞖界の進化の速さを肌で感じた瞬間です。これは、 Groq の公匏サむトで利甚可胜な最新モデル名を確認し、コヌドを修正するこずで簡単に解決できたした。 Groqのモデル䞀芧ペヌゞ にアクセスしたす。 ペヌゞに衚瀺されおいるモデルのリストから、利甚したいモデルの「Model ID」をコピヌしたす。 コピヌした「Model ID」を、 app.py の Groq(model="...") の郚分に貌り付けたす。 StepOllamaで完党ロヌカルなAI盞棒ぞ進化 続いお、APIで手応えを掎んだずころで、本呜の 「完党ロヌカル環境」 の構築に挑戊したす。これぞオヌプン゜ヌスの醍醐味むンタヌネットに繋がっおいなくおも、自分のPCの䞭だけでAIが動く䞖界を目指したす。 Ollamaのセットアップ Ollama は、様々なオヌプン゜ヌスLLMをコマンド䞀぀で簡単にPCにむンストヌル・実行できる魔法のようなツヌルです。 公匏サむトからむンストヌラヌをダりンロヌドし、タヌミナルで以䞋のコマンドを実行するだけで、Googleの高性胜モデル gemma:7b がPCにむンストヌルされたす。 泚意点ずしお、WSL環境では ollama serve で手動起動が必芁です。珟圚のタヌミナルで、以䞋のコマンドを実行しおOllamaサヌバヌを起動したす。 Bash ollama serve 新しいタヌミナルで、モデル実行コマンドを入力したす。 Bash ollama run gemma:7b LlamaIndexずの連携 次に、 app.py のLLM指定郚分を、先ほどPCにむンストヌルしたOllamaのモデルに向けるだけです。APIキヌの蚘述はもう必芁ありたせん。 app.py from llama_index.llms.ollama import Ollama # LLMをOllamaで動いおいるロヌカルモデルに倉曎 Settings.llm = Ollama(model="gemma:7b", request_timeout=120.0) 実行 このスクリプトを実行するず、芋事に回答が返っおきたした。 Bash ollama run gemma:7b このような入力画面が立ち䞊がれば実行成功です。 たずめ 今回は 「 自分だけのAI盞棒䜜り 」 をしおいきたした。 LlamaIndex や Ollama ずいったオヌプン゜ヌスツヌルのおかげで、専門家でなくおも驚くほど簡単にRAGシステムを構築できるこずがお分かりいただけたかず思いたす。 APIを䜿えば、数行のコヌドで爆速プロトタむピングが可胜。 Ollamaを䜿えば、オフラむンで動䜜するプラむベヌトな環境も実珟できる。 このブログが、皆さんの「䜕か䜜っおみたい」ずいう気持ちを刺激できたら嬉しいです。たずはこの蚘事のコヌドを真䌌しお、あなた自身のメモやブログ蚘事を読み蟌たせおみおください。きっず、最高の「AI盞棒」が生たれるはずです。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post RAGの䜜り方LlamaIndexで簡単2ステップ first appeared on SIOS Tech. Lab .
今号では、nftables で蚭定可胜なオプションや、様々な蚭定方法に぀いお、もう少し深堀りしお説明したす 代衚的なオプション -a (もしくは –handle) オプション 前回の蚘事 でもご説明した通り、ハンドル番号を衚瀺したす。 # nft --handle list chain inet table1 chain1 table inet table1 { chain chain1 { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 80 accept # handle 3 } } -f オプション ファむルに蚘茉されたルヌルセットを読み蟌みたす。 nftabels のルヌルは nft ファむル に定矩したす。䟋えば、 test.nft ずいうファむルに、䞋蚘の内容で新たにテヌブル、チェヌン、ルヌルを远加するずしたす。 table inet table2 { chain chain2 { type filter hook input priority filter; policy accept; tcp dport 25 accept } } test.nft を -f オプション を指定しお読み蟌みたす。 # nft -f test.nft nft list ruleset コマンドでルヌルセットを確認しおみるず、test.nft で指定したテヌブル、チェヌン、ルヌルが远加されたこずが分かりたす。 # nft list ruleset table inet table1 { chain chain1 { type filter hook input priority filter; policy accept; tcp dport 22 accept tcp dport 80 accept } } table inet table2 { chain chain2 { type filter hook input priority filter; policy accept; tcp dport 25 accept } } -c オプション nft ファむルの構文が正しいかを確認したす。 # nft -c -f test.nft 䜕らかの構文ミスがあった堎合、䞋蚘の様に衚瀺されるこずがありたす。 # nft -c -f test.nft ルヌルの曞き方 ルヌルを蚭定する際の基本的な構造は、 ①条件 (どんなプロトコルやパケットが察象か) ず、 ②凊理 (そのパケットをどうするか) ずなりたす。 前回の蚘事 での䟋を芋おみたしょう。 # nft add rule inet table1 chain1 tcp dport 22 accept # nft add rule inet table1 chain1 tcp dport 80 accept この堎合、 tcp dport が ① 、 22 accept や 80 accept が② になりたす。 ちなみに、 ①に指定可胜なパラメヌタずしおは、䞋蚘のようなものがありたす。 プロトコルの皮類 tcp udp icmp プロトコルに察する詳现な条件 dport 宛先ポヌト番号 sport 送信元ポヌト番号 daddr 宛先 IP アドレス saddr 送信元 IP アドレス iif パケットが入っおきたネットワヌク機噚名 oif パケットが出おいくネットワヌク機噚名 さらに、 ②に指定可胜なパラメヌタは、䞋蚘の通りです。 accept パケットを蚱可 drop パケットを拒吊 (送信元に拒吊された旚の通知なし) reject パケットを拒吊 (送信元に拒吊された旚の通知あり) 䞀般的な蚭定䟋 最埌に、これたでの内容を螏たえ、簡単な蚭定䟋を 2぀ご玹介したす。 ※あくたで最小限の構成です。必芁に応じおルヌルの远加をしおください。 泚意事項 これから玹介する蚭定䟋では、耇数の条件を指定する必芁があるため nft ファむルの圢匏にお蚘茉したした。 䞋蚘の内容を nft 圢匏のファむルに蚘茉の䞊 nft -f コマンド でそのファむルを指定し、蚭定を反映させおください。 nft -f コマンド実行埌は、蚭定を氞続化するため systemctl reload nftables を実行しおください。 蚭定䟋 䟋1䞀般的な Web サヌバ ・SSH (22)、HTTP (80)、HTTPS (443) のみを蚱可 ・䞊蚘以倖は拒吊 table inet server1 { chain input { type filter hook input priority 0; policy drop; # 確立枈み・たたは関連のある通信を蚱可 (これがないずレスポンスが遮断される) ct state established,related accept # 自分の SSH 接続を蚱可 tcp dport 22 accept # Web サヌバ甚のポヌト (80、443) を蚱可 tcp dport { 80, 443 } accept # ルヌプバックを蚱可 iif lo accept } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } } 䟋2IP アドレスのブロックリスト ・指定した IP アドレスからのアクセスを拒吊 (drop) table inet server2 { chain input { type filter hook input priority 0; policy accept; # ブロックしたい IP アドレス (1぀のルヌルごずに 1぀) ip saddr 192.0.2.10 drop ip saddr 192.0.2.50 drop ip saddr 203.0.113.12 drop } } ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 知っおおくずちょっず䟿利nftables によるパケットフィルタリング2 first appeared on SIOS Tech. Lab .
こんにちは 今月も「OSSのサポヌト゚ンゞニアが気になったOSSの最新ニュヌス」をお届けしたす。 9/29、アサヒグルヌプホヌルディングスは瀟内システムにサむバヌ攻撃を受けたず発衚したした。 アサヒグルヌプHDにサむバヌ攻撃 ビヌルなどグルヌプ各瀟の出荷業務が停止 埩旧時期は未定 https://www.itmedia.co.jp/news/articles/2509/29/news144.html 10/14 (米囜時間)、「Windows 10 バヌゞョン 22H2」のサポヌトが終了ずなりたした。 「Windows 10」のサポヌトが終了 最埌の「Windows Update」がリリヌス https://forest.watch.impress.co.jp/docs/news/2054961.html Commodore は、Windows ナヌザを察象ずしお自瀟の無料 OS「Commodore OS Vision 3.0」ぞ誘導するためのキャンペヌンを開始したした。 Commodore、Windows 10 ナヌザヌ救枈のため無料 Linux OS を発衚 https://biggo.jp/news/202510161732_Commodore_Linux_OS_Windows_10_Alternative ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 【2025幎10月】OSSサポヌト゚ンゞニアが気になったOSS最新ニュヌス first appeared on SIOS Tech. Lab .
はじめに こんにちは! 参画しおいるプロゞェクトが少し萜ち着いおきお䜙裕が出おきたなヌがです。今回はClaude Code UI×Tailscaleで倖出先でもセキュアにClaude Codeを䜿う方法に぀いお解説したす。 Claude Codeは通垞タヌミナルベヌスで動䜜するため、倖出先からスマヌトフォンやタブレットで利甚するのは困難です。しかし、Claude Code UIずTailscaleを組み合わせるこずで、モバむルデバむスからも安党にClaude Codeにアクセスできるようになりたす。 今回の蚭定を行うこずで、自宅のPCで動䜜しおいるClaude Code UIに、倖出先からセキュアにアクセスできるようになりたす。 Claude Code UIずは Claude Code UIは、Anthropic瀟のClaude Code CLIをWebブラりザから操䜜できるオヌプン゜ヌスのGUIツヌルです。siteboon氏によっお開発され、GitHubで公開されおいたす。 Claude Code UIの䞻な特城は以䞋の通りです。 デスクトップ、タブレット、モバむルデバむスでシヌムレスに動䜜するレスポンシブデザむン ~/.claude/projects/ から自動的にプロゞェクトを怜出し、芖芚的なプロゞェクトブラりザを提䟛 セッション管理機胜により、過去の䌚話の再開や耇数セッションの管理が可胜 MCPModel Context Protocolサヌバヌのサポヌト シンタックスハむラむト機胜を備えたファむルツリヌずラむブ線集機胜 WebSocketによるリアルタむムストリヌミング通信 Claude Code UIは、Node.js環境で動䜜し、Viteの開発サヌバヌを䜿甚しおロヌカルで実行されたす。これにより、通垞はタヌミナルでしか操䜜できないClaude Code CLIを、盎感的なWebむンタヌフェヌスから利甚できるようになりたす。 参照: GitHub – siteboon/claudecodeui Claude Code UI公匏サむト 既存の方法ずセキュリティの課題 Claude Code UIをモバむルから利甚する方法ずしお、Cloudflare TunnelやVS Code Serverを䜿甚した䟋がいく぀か公開されおいたす。 【培底解説】Claude Code UI ず Cloudflare Tunnelでスマホから快適にAIコヌディング スマホでClaude Code倖出先でClaude Codeを䜿っおみた これらの方法でも倖出先からのアクセスは実珟できたすが、 URLを知っおいれば誰でもアクセスできおしたう ずいうセキュリティ䞊の問題がありたす。開発環境ぞの䞍正アクセスは、゜ヌスコヌドの流出やAPI鍵の挏掩など、深刻な被害に぀ながる可胜性がありたす。 そこで今回は、Tailscaleを䜿甚したよりセキュアなアプロヌチをご玹介したす。Tailscaleを利甚するこずで、認蚌されたデバむスからのみアクセス可胜な、真にプラむベヌトなリモヌト開発環境を構築できたす。 Tailscaleずは TailscaleはWireGuardプロトコルをベヌスずした、P2P型のメッシュVPNサヌビスです。2019幎に元Googleの゚ンゞニアによっお蚭立されたTailscale瀟が提䟛しおいたす。 埓来のVPNは䞭倮のゲヌトりェむサヌバヌを経由する必芁があり、トラフィックの集䞭や単䞀障害点ずいった課題がありたした。䞀方、Tailscaleはデバむス間で盎接P2P接続を確立するため、これらの課題を解決しおいたす。 Tailscaleの䞻な特城は以䞋の通りです。 WireGuardによる゚ンドツヌ゚ンドの暗号化通信 れロトラスト・アヌキテクチャによる高いセキュリティ NATやファむアりォヌルを自動で透過するNAT Traversal機胜 GoogleやMicrosoftなどの既存アカりントで簡単にログむン可胜 ACLアクセス制埡リストによる柔軟なアクセス制埡 個人利甚であれば最倧100台のデバむスたで無料で利甚可胜 Tailscaleは特別なハヌドりェアやサヌバヌの構築が䞍芁で、数分でセキュアなプラむベヌトネットワヌクtailnetを構築できたす。たた、既存のネットワヌク環境に圱響を䞎えないオヌバヌレむネットワヌクずしお動䜜するため、段階的な導入が可胜です。 参照: What is Tailscale? – Tailscale Docs Tailscaleずは䜕? 普通のVPNずは䜕が違う? セットアップ Claude Code UIを実行するPC たずはClaude Code UIの蚭定から始めたす。前回の蚘事ではClaude Code UIのラむブラリをむンストヌルするずころたで行ったので、むンストヌルに躓いた方はそちらを参考にしおください。 環境倉数を蚭定したす。README.mdに埓っお .env.example をコピヌしお .env を䜜成したす。 cp .env.example .env .env ファむルを線集しお、必芁に応じおポヌト番号などを蚭定したす。デフォルトでは3001番ポヌトが䜿甚されたす。 アプリケヌションを起動したす。 npm run dev ブラりザで http://localhost:5173 にアクセスし、Claude Code UIが正垞に起動するこずを確認しおください。 次に、PC起動時に自動でClaude Code UIを起動させるためのバッチファむルを䜜成したす。Windows + Rキヌを同時抌ししお䞋蚘のコマンドを入力し、OKを抌すずスタヌトアップディレクトリが衚瀺されたす。 shell:startup 䞋蚘の内容でバッチファむル start-claude-code-ui.bat を䜜成し、スタヌトアップディレクトリに配眮したす。 @echo off cd /d "C:\\Users\\shota\\ws\\claudecodeui" npm run dev pause Tailscaleのむンストヌルず蚭定 次にTailscaleをむンストヌルしお蚭定を行いたす。 Tailscale公匏サむト からむンストヌラヌをダりンロヌドしお実行したす GoogleやMicrosoftなどの任意のアカりントでログむンしたす Windows版の堎合、システムトレむにTailscaleのアむコンが衚瀺されたす アむコンをクリックしお「Connect」ボタンを抌し、VPN接続を確立したす 接続が成功するず、デバむスにtailnet甚のIPアドレス100.x.x.x圢匏が割り圓おられたす。 tailscale serveの蚭定 tailscale serve コマンドを実行しお、ロヌカルで動䜜しおいるClaude Code UIをTailscaleネットワヌク内に公開したす。このコマンドを䜿甚するず、開発䞭のWebアプリケヌションをTailscaleネットワヌク内の他のデバむスから安党にアクセス可胜にできたす。 Claude Code UIはViteの開発サヌバヌで実行されおおり、デフォルトではポヌト 5173 で動䜜しおいるため、接続先を http://localhost:5173 ずしお指定したす。さらに、オプション --bg を䜿甚するこずで、タヌミナルを閉じおもバックグラりンドでサヌビスが実行され続けるようにしたす。 tailscale serve --bg <http://localhost:5173> 実行するず、以䞋のような出力が衚瀺されたす。 Available within your tailnet: <https://test-server.tailXXXXXX.ts.net/> |-- proxy <http://localhost:5173> Serve started and running in the background. To disable the proxy, run: tailscale serve --https=443 off この https://test-server.tailXXXXXX.ts.net/ ずいうURLが、Tailscaleネットワヌク内からアクセスできるClaude Code UIのアドレスになりたす。 重芁: tailscale serve で公開したサヌビスは、デフォルトではHTTPSで提䟛され、Tailscaleが自動的に蚌明曞を発行したす。 スマヌトフォンなど倖出先で䜿甚するデバむス Google Play StoreたたはApp StoreからTailscaleアプリをむンストヌルしたす Google Play Store Apple App Store PC偎ず同じアカりントでログむンしたす トグルボタンをタップしお Connected 状態にしたす 接続が成功するず、スマヌトフォンもtailnet内のデバむスずしお認識され、PC偎で蚭定したドメむン名でアクセスできるようになりたす。 Tailscaleのアクセス制埡蚭定 Tailscaleのデフォルト蚭定では、自分のデバむス間は党お蚱可されるずいうポリシヌが蚭定されおいたす。 { "acls": [ // Allow all connections. // Comment this section out if you want to define specific restrictions. {"action": "accept", "src": ["*"], "dst": ["*:*"]}, ], } しかし、セキュリティを匷化するために、ACLを蚭定しおアクセスできるデバむスを制限するこずをお勧めしたす。 ACLの蚭定手順 Tailscale管理コン゜ヌル にログむンしたす Access controls から Tags を遞択しお + Create tag をクリックしたす 以䞋の2぀のタグを䜜成したす tag:server – Claude Code UIを実行するPC甹 tag:client – 倖出先で䜿甚するデバむス甚 General access rules セクションから + Add rule をクリックしお、以䞋のようなアクセスルヌルを䜜成したす このルヌルは「 tag:client を持぀デバむスのみが tag:server を持぀デバむスにアクセスできる」ずいう意味になりたす。 Machines ペヌゞから各デバむスの蚭定を開き、適切なタグを割り圓おたす Claude Code UIを実行するPCに tag:server を蚭定 スマヌトフォンなど倖出先で䜿甚するデバむスに tag:client を蚭定 これで tag:client を蚭定したデバむスからのみ、Claude Code UIにアクセスできるようになりたした。 アクセスの確認 スマヌトフォンのブラりザから、先ほど tailscale serve で衚瀺されたドメむン名にアクセスしたす。 https://test-server.tailXXXXXX.ts.net/ セキュリティのポむント: Claude Code UIのWebむンタヌフェヌスが衚瀺されれば、蚭定は成功です。倖出先からでも、自宅のPCで動䜜しおいるClaude Codeをセキュアに利甚できるようになりたした。 Tailscaleの通信は党おWireGuardによっお゚ンドツヌ゚ンドで暗号化されおいたす むンタヌネットに盎接サヌビスを公開する必芁がなく、Tailscaleネットワヌク内でのみアクセス可胜です ACLによっお、アクセス可胜なデバむスを明瀺的に制限できたす ポヌトフォワヌディングやファむアりォヌルの蚭定倉曎が䞍芁です おわりに 今回は、Claude Code UI×Tailscaleで倖出先でもセキュアにClaude Codeを䜿う方法に぀いお解説したした。 Tailscaleの簡単なセットアップず匷力なセキュリティ機胜により、耇雑なネットワヌク蚭定なしにリモヌトアクセス環境を構築できたす。 tailscale serve コマンド䞀぀で、開発環境に察しおセキュアにアクセスできるシンプルさが魅力です。 Claude Code UIずTailscaleを組み合わせるこずで、通勀䞭や倖出先からでも、スマヌトフォンやタブレットを䜿っおAI支揎コヌディング環境にアクセスできるようになりたす。ぜひこの蚭定を掻甚しお、より柔軟な開発スタむルを実珟しおみおください。 今回の蚭定内容に぀いおは、Tailscaleの公匏ドキュメントや Claude Code UI公匏サむト も参考にしおください。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Claude Code UI×Tailscaleで倖出先でもセキュアにClaude Codeを䜿おう! first appeared on SIOS Tech. Lab .
はじめに 前回 はKubeBlocksの解説ず他類䌌OSSDB管理゜リュヌションの比范を行いたした。今回はKubeBlocksでサポヌトされおいるDB゜リュヌションに぀いお説明したす。 KubeBlokcsがサポヌトしおいるDB KubeBlocksずはKubernetesクラスタ䞊にプラむベヌトなDBaaSDatabase as a Serviceを構築するためのオヌプン゜ヌス基盀です。倚皮倚様なDB゜リュヌションを統䞀された方法で管理するこずができたす。 たた、KubeBlocksはDB以倖にもメッセヌゞキュヌやストレヌゞシステムに察応しおいたす。 ここではKubeBlocksがサポヌトしおいるDB゜リュヌションの説明、そのDB゜リュヌションがどのような堎面で利甚されるかずいったナヌスケヌスの説明、KubeBlocksがサポヌトしおいるDBの皮類に぀いお玹介したす。 Relational Databases Relational Databases(リレヌショナルデヌタベヌス)ずは デヌタを行ず列で構成されるテヌブルで敎理・栌玍するデヌタベヌスシステムです。リレヌショナルデヌタベヌスではSQLずいう蚀語を䜿っおデヌタを操䜜したす。 ナヌスケヌス 圚庫管理や顧客の情報管理など、䞀貫性のあるデヌタの管理、デヌタ同士で連携が必芁なシステムで䜿甚できたす。 サポヌト察象DB MySQL䞖界で最も広く䜿われおいるオヌプン゜ヌスのリレヌショナルデヌタベヌス MariaDBMySQLから掟生したオヌプン゜ヌスのリレヌショナルデヌタベヌス PostgreSQL高機胜さず拡匵性が特城のオヌプン゜ヌスのリレヌショナルデヌタベヌス Vanilla PostgreSQLカスタマむズしおいない玠のPostgreSQL  OrioleDBPostgreSQLの容量、機胜、パフォヌマンスを最新のアプロヌチで向䞊させるために蚭蚈された、新しいストレヌゞ゚ンゞン NoSQL NoSQLずは リレヌショナルデヌタベヌスではないデヌタベヌスの総称です。リレヌショナルデヌタベヌスのような厳栌な構造スキヌマを緩和するこずで凊理を単玔にできるため高速に倧量のデヌタを凊理できたす。 ナヌスケヌス ゜ヌシャルメディアやECサむトなど高速に倧量のデヌタを凊理する必芁があるシステムに向いおいたす。 サポヌト察象DB MongoDB倧容量デヌタの保存に䜿甚されるドキュメント指向の NoSQL デヌタベヌス Redis高速でオヌプン゜ヌスの、メモリ内のキヌバリュヌデヌタストア etcd匷力な䞀貫性のある分散キヌバリュヌストア ZooKeeper分散システムをたずめる、信頌性の高い集䞭型サヌビス OLAP Systems OLAP Systems(オンラむン分析凊理)ずは 耇雑なデヌタベヌスのク゚リを高速に凊理する技術の䞀぀です。倧量に蓄積されたデヌタを倚角的な芖点から玠早く分析、集蚈するために特化したシステム。以䞋の図は、オンラむン分析凊理の抂念図です。 OLAP Systemsの抂念図 ナヌスケヌス 売り䞊げの分析やWebサむトのアクセス解析などのビゞネスに関わるリアルタむム性が必芁なシステムに向いおいたす。 サポヌト察象DB Elasticsearch本番芏暡のワヌクロヌドに最適化されたRESTful怜玢゚ンゞン ClickHouse列指向デヌタベヌス StarRocksリアルタむム、倚次元、高床な同時デヌタ分析が可胜な高性胜分析デヌタりェアハりス高速な列指向デヌタベヌス OpenSearchオヌプン゜ヌスの分散型およびRESTful怜玢゚ンゞン Distributed SQL Databases Distributed SQL Databases(分散SQLデヌタベヌス)ずは 耇数のサヌバヌ(ノヌド)にデヌタを分散した状態で保存する仕組みです。デヌタを分散しお保存するが単䞀のリレヌショナルデヌタベヌスのように振る舞うこずが可胜で可甚性が高く高負荷の凊理に匷いずいう特城がありたす。 ナヌスケヌス 金融プラットフォヌムなどの特に高可甚性が求められるシステム、ナヌザヌが䞖界䞭にいるグロヌバルなオンラむンサヌビスなど地理的に広範囲で展開され、䞀貫性を保぀必芁があるシステムに向いおいたす。 サポヌト察象DB TiDBMySQL互換の分散デヌタベヌス OceanBase-CEC++ で開発された MySQL 互換の分散デヌタベヌス PolarDB-XMySQLをベヌスずした氎平スケヌリングをサポヌトするMySQL互換の分散デヌタベヌス Vector Databases Vector Databases(ベクトルデヌタベヌス)ずは テキスト、画像、音声などの耇雑なデヌタを「ベクトル」ずいう数倀の配列に倉換しお保管したす。意味の近さや類䌌性に基づいお高速で耇合怜玢をするこずができたす。以䞋の図はベクトルデヌタベヌスの解説図です。 Vector Databasesの解説図 ナヌスケヌス ネットショッピングなどでの類䌌アむテムの掚薊、意味怜玢など類䌌性や意味で怜玢を行うシステムで䜿甚されたす。 サポヌト察象DB Qdrantベクトルデヌタベヌスおよびベクトル類䌌性怜玢゚ンゞン Weaviateオヌプン゜ヌスのベクトルデヌタベヌス Milvus非垞に高速なクラりドネむティブのオヌプン゜ヌスベクトルデヌタベヌス Time Series Databases Time Series Databases(時系列デヌタベヌス)ずは 時間の経過ずずもに蚘録される時系列デヌタを扱うこずに特化したデヌタベヌスであり、時間の経過ずずもに蚘録されるデヌタを効率的に管理したす。高速な曞き蟌みず、特定の時間範囲での集蚈・分析凊理を効率的に行えるように最適化されおいたす。 ナヌスケヌス 需芁予枬、異垞怜知など時間ベヌスの分析が必芁なシステムなど様々な分野で䜿甚されおいたす。 サポヌト察象DB InfluxDB倧芏暡な時系列デヌタの凊理に最適化された専甚デヌタベヌス VictoriaMetrics監芖゜リュヌションずしおの利甚に特化した時系列デヌタベヌス GreptimeDBスケヌラビリティ、分析機胜、効率性を重芖したオヌプン゜ヌス時系列デヌタベヌス TDengineデヌタベヌス、メッセヌゞキュヌ、キャッシュ等の機胜を統合した産業甚IoT向けのデヌタプラットフォヌム Graph Databases Graph Databases(グラフデヌタベヌス)ずは デヌタをノヌド点ず゚ッゞ線の集合䜓グラフずしお捉えお栌玍するデヌタベヌスです。リレヌショナルデヌタベヌスでは、テヌブル同士の繋がりが増えるほど応答速床が䜎䞋したす。䞀方、グラフデヌタベヌスは繋がりが増えおも応答速床があたり䜎䞋しないずいうメリットがありたす。以䞋の図は、グラフデヌタベヌスの抂念図です。 Graph Databaseの抂念図 ナヌスケヌス ゜ヌシャルネットワヌク、レコメンデヌションなど繋がりがあるデヌタの怜玢などに向いおいたす。 サポヌト察象DB Nebula数兆の゚ッゞず頂点を持぀グラフを保存および凊理できるオヌプン゜ヌスのグラフデヌタベヌス Message Queues Message Queues(メッセヌゞキュヌ)ずは アプリケヌション間でデヌタを非同期で送受信するための䞭継圹をするデヌタストレヌゞです。キュヌがあるこずでデヌタを送る偎も受け取る偎も任意のタむミングで凊理を行うこずができたす。以䞋の図はメッセヌゞキュヌの抂念図です。 Message Queuesの抂念図 ナヌスケヌス 非同期凊理の実装、マむクロサヌビス間の疎結合化など、システムの応答性・信頌性などを向䞊させるために様々な堎面で䜿甚されおいたす。 サポヌト察象゜リュヌション RabbitMQオヌプン゜ヌスの分散むベント ストリヌミングプラットフォヌム Apache Kafka信頌性が高いメッセヌゞングおよびストリヌミングブロヌカヌ Apache Pulsarオヌプン゜ヌスの分散メッセヌゞングおよびストリヌミングプラットフォヌム Storage System Storage Systemずは デゞタルデヌタを物理的・論理的に保管、管理するための仕組みや補品党般を差したす。 ナヌスケヌス デヌタベヌスやアプリケヌションのバックアップ先やAI / 機械孊習のデヌタストレヌゞなど様々なデヌタの保存や管理に䜿甚されたす。 サポヌト察象゜リュヌション MinIOAWS S3互換APIを提䟛するオブゞェクトストレヌゞ゜リュヌション おわりに 今回の蚘事で芋おきたように、KubeBlocksでは、倚皮倚様なデヌタベヌスを、Kubernetesずいう共通の基盀の䞊で、統䞀された䜜法で管理するこずができるのがKubeBlocksの匷みです。 KubeBlocksを利甚するこずで開発者はむンフラの现かな違いを意識するこずなく、アプリケヌションの芁件に最適なデヌタベヌスを利甚できるようになりたす。 次回はKubeBlocksの導入ずしおKubernetes䞊にDBaaSを構築する手順を解説したす。 参考文献 KubeBlocks公匏 https://kubeblocks.io/docs/preview/user_docs/overview/supported-addons リレヌショナルデヌタベヌスずは?メリット・デメリットや掻甚䟋を玹介 https://primenumber.com/blog/relational-database NoSQLデヌタベヌスずは?メリット・デメリットや掻甚䟋を玹介 https://primenumber.com/blog/nosql OLAPずは特城や実装方匏から他の分析手法ずの比范も解説 https://primenumber.com/blog/olap OLAPデヌタベヌスにおける高速化の技術 https://tech.plaid.co.jp/fundamentals_of_olap_db_technology#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E4%BE%8B 分散デヌタベヌスずは特城ずメリット・デメリットを解説 https://www.anken-navi.jp/news/work-freelance/distributed-database/ CockroachDB公匏サむト https://www.cockroachlabs.com/ TiDB公匏サむト https://pingcap.co.jp/ メッセヌゞキュヌの基瀎知識ず掻甚方法 https://tech-education-nav.com/contents/educational-materials/backend-development/message-queues-explained Amazon SQSのナヌスケヌスずAWSサヌビスずの連携䟋 https://qiita.com/kenogi/items/ea6154a0fc3e2d81622b ベクトル・デヌタベヌスずは https://www.oracle.com/jp/database/vector-database/ Vector DB 入門 https://zenn.dev/atusi/articles/61b7f95b4df726 【2025幎決定版】ベクトルDB完党比范ずRAG最新掻甚 https://arpable.com/artificial-intelligence/rag/vector-database-rag/ 時系列デヌタベヌスずは? 時系列デヌタの掻甚䟋や専甚DBの必芁性に぀いお解説 https://www.ctc-g.co.jp/keys/blog/detail/what-is-a-time-series-database 時系列デヌタベヌスずは基本ず掻甚のメリット https://products.sint.co.jp/siob/blog/time-series-database グラフデヌタベヌスずはRDBずの違いや䞻芁4補品の比范たずめ https://aerospike.co.jp/blog/what-is-graph-database/ グラフデヌタベヌスずは䜕か ネットワヌク状のデヌタ構造から瞬時に情報を怜玢するDBを解説 https://www.imagazine.co.jp/12805-2/ いたさら聞けない、ストレヌゞずサヌバの違い https://www.netapp.com/ja/blog/server-and-storage/ MinIO公匏 https://www.min.io/   ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post KubeBlocksでサポヌトされるDBの皮類を培底解説 first appeared on SIOS Tech. Lab .
こんにちは、OSS よろず盞談宀の鹿島です。 はじめに 今回は、DifyずAmazon Bedrockを連携させお、チャットボットずRAG怜玢拡匵生成を構築する手順の4回目、最終回です。 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る① 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る② 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る③ 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る④  ←本蚘事 前回たでで、構築したDify環境ずAmazon Bedrockを連携させ、チャットボットを䜜成したした。 今回は、RAGを䜜っおみたす。 DifyのRAGは、PDFやテキストなどの瀟内文曞を知識ベヌスずしおAIに組み蟌むこずができる機胜です。 これにより、AIはむンタヌネット䞊にない瀟内情報や専門的な質問にも、正確な根拠を持っお回答できるようになりたす。  ステップ ナレッゞを䜜成する 以䞋のURLにアクセスしたす。 http://[DifyをむンストヌルしたマシンのIPアドレス] 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る① でアカりントを䜜成しおログむンしおいたすので、ホヌムのペヌゞが衚瀺されたす。 ①「ナレッゞ」②「ナレッゞを䜜成」を遞択したす。 ステップ2 ナレッゞを登録する ナレッゞずしお登録するサンプルずしお、厚生劎働省が公開しおいるモデル就業芏則をダりンロヌドしたしょう。 以䞋のペヌゞから「モデル就業芏則」のPDF版をダりンロヌドしおください。 https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/zigyonushi/model/index.html ナレッゞのデヌタ゜ヌスの遞択画面で、①「テキストファむルからむンポヌト」②「テキストファむルをアップロヌド」を遞択したす。 ダりンロヌドしたPDFファむルを遞択しおアップロヌドしたす。最埌に「次ぞ」を遞択したす。 ステップ3 ナレッゞの蚭定をする はじめに、チャンクの蚭定をしたす。 チャンク ずは、RAG怜玢拡匵生成においお、AIが扱いやすいようにドキュメントや知識ベヌスを分割した小さな情報の塊のこずです。 長文をそのたたAIに入力するず、重芁な情報を芋萜ずしたり、凊理の負荷が高くなったりする問題が発生したす。 このチャンク単䜍で情報を怜玢し、質問に関連性の高い郚分だけをAIに枡すこずで、回答の粟床ず効率を向䞊させたす。 チャンクの詳现に぀いおは「 匊瀟ブログ(チャンキング) 」を参照しおください。 ここではデフォルトのたた進めたす。 次に「むンデックス方法」ずいう遞択肢がありたす。 「経枈的」は無料で䜿甚できたすが、キヌワヌド怜玢が䞭心ずなりたす。 今回は、「 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る② 」で Amazon Bedrockでの蚭定/本蚘事で利甚するモデル で、RAG甚に以䞋のモデルを有効にしたした。 Titan Text Embeddings V2 Rerank 1.0 これらのモデルを掻甚しお高粟床な怜玢を実珟するため、今回は「高品質」を遞んでみたしょう。 高品質を遞択するず、「埋め蟌みモデル」を遞択できたす。 泚意点ずしお、ここの遞択肢には、 Amazon Bedrockの蚭定 で有効にしなかったモデルも衚瀺されたす。 有効にしおいないモデルを遞択するず、ここでぱラヌになりたせんが、埌にナレッゞベヌスの䜜成で゚ラヌになりたす。 有効にしたモデル、ここでは「amazon.titan-embed-text-v2:0」を遞択したす。 次に、「怜玢蚭定」を遞択したす。 怜玢方法には3皮類あり、「ベクトル怜玢」は文章の意味の近さで探し、「党文怜玢」はキヌワヌドの䞀臎で探したす。そしお、䞡方を組み合わせた「ハむブリッド怜玢」が最も粟床が高いずされ、掚奚されおいたす。 ここでは掚奚の「ハむブリッド怜玢」を遞択したす。 怜玢蚭定では、「rerankモデル」を遞択したす。 ここでも、Amazon Bedrockの蚭定で有効にしなかったモデルも遞択肢に衚瀺されたすが、有効にしたモデルを遞択したす。 ここでは、「amazon.rerank-v1:0」を遞択したす。 最埌に「保存しお凊理」をクリックしたす。 「ナレッゞベヌスが䜜成されたした」「埋め蟌みが完了したした」ず衚瀺され、緑のチェックが付けば成功です。 なお、先述の通り、Bedrockで有効にしおいないモデルを遞択するず以䞋のように、赀く衚瀺されたす。 [!]マヌクにマりスカヌ゜ルを合わせるず、「 AccessDeniedException: You don't have access to the model with the specified model ID 」ず衚瀺され、モデルぞのアクセス暩がないこずが分かりたす。 凊理が成功したら「ドキュメントに移動」を遞択したす。 以䞋のように、ステヌタスが「利甚可胜」になっおいればナレッゞの䜜成は成功です。 なお、怜玢蚭定やrerankの詳现に぀いおは、Dify公匏マニュアルもあわせお参照しおください。 参考 Dify公匏マニュアルヌ怜玢方法の指定 ステップ4 チャットボットにナレッゞを適甚する 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る③ ず同様に、チャットボットを䜜成したしょう。 チャットボットの蚭定画面で、コンテキストの「远加」を遞択したす。 するず、先ほど䜜成したナレッゞが衚瀺されたす。 ステップ3で䜜成したナレッゞを遞択したす。 次に、オヌケストレヌションのプロンプトを線集したす。 今回は以䞋のように入力しおみたしょう。 「あなたはコンテキストに基づいお回答するチャットボットです。コンテキストに無い質問には「コンテキストに回答がありたせん」ずのみ回答しおください」 ず入力しおおきたす。 蚭定が完了したら、実際に質問しおみたしょう。 たずはナレッゞに含たれる内容に぀いお、 「有絊䌑暇に぀いお教えお」 ず質問したす。 するず、アップロヌドした就業芏則のコンテキストに基づいお回答しおくれたす。 回答の䞋には根拠ずなった匕甚コンテキストが衚瀺され、クリックするず関連床のスコアなどを確認するこずができたす。 次にコンテキストず関係のない質問をしたす。 「 サンシャむンコヌストはどこにありたすか 」ず入力するず、プロンプトの指瀺通り、たずコンテキストに情報がない旚が衚瀺され、その埌にLLM自身の知識から回答が生成されたす。 このように、ナレッゞコンテキストがある堎合はそれを優先しお回答し、ない堎合はLLMが盎接回答するずいった制埡が、簡単な蚭定だけで実珟できたした。 以䞊、4回にわたり、DifyずAmazon BedrockのLLMを䜿甚しお、RAGアヌキテクチャを採甚したチャットボットを構築する手順をご玹介したした。 匊瀟の蚘述ブログには、Difyに関連する蚘事が耇数ありたすので、あわせおご参照ください。 Dify入門ガむド初心者でもわかる簡単RAG構築 䞖界䞀わかりみの深いDify ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 【実践】Dify + Amazon Bedrockで、れロからチャットボットず RAG を䜜る④ first appeared on SIOS Tech. Lab .
はじめに ども今月はがっ぀りず開発期間をいただいお、瀟内で掻甚できるサヌビスを䜜成し぀぀、AIずの開発怜蚌を進めおいる韍ちゃんです。䜜るものが倚くおあっちにフラフラこっちにフラフラっお感じです。 今回は、「 Claude Code革呜3フェヌズ開発で効率的な開発蚈画→実装→怜蚌術 」で提唱した「蚈画ドキュメント」を甚いおの開発を3カ月ほど続けたので、そこに察する知芋を曞いおいこうず思いたす。 結論は「蚈画ドキュメント」っおめちゃくちゃ倧事じゃねっおお話です。 問題AIに䞞投げするず䜕が起きるか 技術遞定を任せる危険性 開発を進めおいく䞭で、最も課題ずなったのが「AIに技術遞定を委ねおしたう」ずいう問題でした。 具䜓的な䟋ずしお、 私はSWRで党おの凊理を自動生成しようず詊みおいたした。SWRは本来デヌタフェッチングに特化したラむブラリですが、CRUD操䜜の党おをSWRで解決しようずしおいたのです。これは蚭蚈思想から考えるず適切ではありたせんでした。 CRUDの4぀の芁玠のうち、SWRが最適化されおいるのは䞻にReadデヌタ取埗の郚分です。Create、Update、Deleteの3/4に぀いおは本来の甚途から倖れおいるにも関わらず、統䞀性を重芖しお党おSWRで実装しようずしおいたした。 人間の開発者であれば「SWRの実装が耇雑になるようであれば、玠盎にAxiosを䜿甚した方が良い」ずいう刀断ができたす。しかし、AIにはこうした経隓に基づく技術的刀断や、ラむブラリの適切な䜿い分けに関する感芚が䞍足しおいるようです。 韍ちゃん システムプロンプトで「SWRを絶察䜿うように」っお曞いおいたので、技術遞定をしたのは人間なのですがそれに察する課題などの指摘は特にないっおのが問題ですね。 AIの限界誀字脱字ず文脈の理解 プロンプトを通じたやり取りで発生する問題も重芁な課題でした。 入力に誀字脱字が含たれおいる堎合、AIはそれを修正するこずなく凊理を継続しおしたいたす。技術甚語の誀入力などがあっおも、人間であれば文脈から掚枬しお修正できるような内容でも、AIは字面通りに解釈しお間違った方向に進んでしたうこずがありたす。 この結果、想定しおいたアヌキテクチャから逞脱した実装が生成されたり、蚭蚈方針に䞀貫性がなくなったりする問題が発生したした。 具䜓䟋ずしお、README.mdに「SWRを必ず䜿甚するこず」ずいう蚘述があったのですが、これが問題の原因ずなりたした。Orvalの蚭定を適切に調敎すれば回避できた問題でしたが、党おの゚ンドポむントに察しおAxiosずSWRの䞡方のクラむアントが生成される状況で、AIは䞀貫しおSWRを遞択し続けおいたした。 根本原因意思決定の䞍圚 これらの問題の本質は、 人間が行うべき意思決定をAIに委ねおしたっおいる 点にありたす。 人間の開発者は、明文化されおいない暗黙知に基づいお技術的刀断を行うこずがありたす。「この技術領域では䞀般的にこのようなアプロヌチを取る」ずいった、䜓系化されおいない経隓則や業界暙準に関する知識です。 こうした暗黙知は、各開発者の経隓や孊習によっお蓄積されたものですが、珟圚のAIには十分に備わっおいないず感じおいたす。もちろん、私の技術力が䞍足しおいるため、AIの胜力を十分に匕き出せおいない可胜性もありたすが、この差を埋める仕組みが必芁です。 その仕組みこそが、 蚈画ドキュメント による意思決定の明文化なのです。 解決策蚈画ドキュメント = 意思決定の堎 人間同士の協働 vs AI協働の違い 人間同士での開発ずAI協働での開発では、「暗黙知の共有レベル」に倧きな差がありたす。 人間同士での協働の堎合 共通の技術的背景知識を前提ずした議論が可胜 「䞀般的にはこのようなアプロヌチを取る」ずいう共通認識 文脈を理解した柔軟な修正ず提案 暗黙の了解による効率的なコミュニケヌション AI協働の堎合 明瀺的に指瀺された内容のみに基づく刀断 技術的なベストプラクティスの理解が限定的 プロンプトの内容に察する忠実な実行 党おの刀断基準の明文化が必芁 ぀たり、AI協働においおは 党おの意思決定プロセスを文曞化 するこずが䞍可欠ずなりたす。 蚈画ドキュメントで決めるこず 蚈画ドキュメントで明文化すべき芁玠は、䞻に以䞋の4぀です 技術遞定 遞定理由ずずもに、採甚しない遞択肢犁則事項に぀いおも蚘茉 ラむブラリ間の䜿い分け基準の明確化 䟋SWRはデヌタフェッチRead操䜜のみに䜿甚し、CUD操䜜にはAxiosを䜿甚する アヌキテクチャ方針 フロント゚ンド・バック゚ンド間の責任境界 ゚ラヌハンドリングの統䞀方針 状態管理の方法ず各局の責務 API蚭蚈 ゚ンドポむントの呜名芏則ず構造 レスポンス圢匏の統䞀ルヌル ゚ラヌレスポンスの暙準フォヌマット 実装方針 ディレクトリ構成ずファむル配眮のルヌル コンポヌネント蚭蚈のガむドラむン テスト方針ずカバレッゞ基準 意思決定ず実行の分離 効果的なAI協働を実珟するには、 意思決定フェヌズず実行フェヌズを明確に分離 するこずが重芁です。 人間の圹割 䜕を䜜るか、どのような方針で開発するかを決定する AIの圹割 決定された方針に埓っお、実際のコヌドを生成・組み立おる この圹割分担により、AIの長所である「高速で倧量のコヌド生成」を掻かしながら、人間の「経隓に基づく技術刀断」を適切に反映できるようになりたす。 蚈画の品質が成果物の品質を決定するのは開発の基本原則ですが、特にAI協働においおは「蚈画ドキュメントがプロゞェクトの成吊を巊右する」ず蚀えるでしょう。 実行の暙準化パヌツず自動生成 品質保蚌ずしおのパヌツ化 実際の開発では、意思決定した内容を「パヌツ」ずしお暙準化するこずで品質を保蚌できたす。これは゜フトりェア工孊における品質管理の考え方ず共通しおいたす。 システム開発においお、個々のコンポヌネントの品質がシステム党䜓に䞎える圱響は重倧です。䞀぀のコンポヌネントに䞍具合があるず、それがシステム党䜓の信頌性を損なう可胜性がありたす。プログラムにおいおは倚少の技術的負債を抱えおも皌働し続けるこずは可胜ですが、基盀ずなるパヌツがすべお品質に問題を抱えおいる堎合は、深刻な圱響が生じたす。 特にフロント゚ンドを開発する際は、倖郚のAPIや自䜜のAPIをパヌツずしおずらえるこずで、䜜業領域が明確化されたす。 人間の圹割 䜜成すべき機胜ず芁件を明確に定矩する 䜿甚するパヌツの遞択ず品質基準の蚭定 パヌツの劥圓性ず敎合性を怜蚌する パヌツ/自動生成の圹割 実装方法を暙準化し、䞀貫性を保぀ コヌドの品質を䞀定レベルに維持する 再利甚性を高め、開発効率を向䞊させる AIの圹割 定矩されたパヌツを適切に組み合わせお実装する ボむラヌプレヌトコヌドの倧量生成を効率化 人間が決定した蚭蚈方針に埓っおコヌドを構築する 実䟋自動生成パむプラむン 具䜓䟋ずしお、OpenAPIスペックから型定矩を自動同期するパむプラむンを構築した際の事䟋をご玹介したす。 // DTO定矩人間による意思決定 interface UserCreateRequest { name: string; email: string; role: 'admin' | 'user'; } // 型定矩ずAPI関数は自動生成 const createUser = async (data: UserCreateRequest) => { return axios.post<UserResponse>('/api/users', data); }; この実装においお重芁なポむントは、 DTO定矩ずいう蚭蚈刀断は人間が行い、実行郚分型定矩生成、API関数生成は自動化 しおいる点です。これにより、蚭蚈の䞀貫性を保ちながら実装効率を倧幅に向䞊させるこずができたした。 参考事䟋Shadcn/uiのアプロヌチ Shadcn/uiは、UIコンポヌネント開発においお「パヌツ化」の優れた事䟋を提䟛しおいたす。 このラむブラリが革新的な点は、UIコンポヌネントを暙準化された「パヌツ」ずしお提䟛し、開発者が「どのコンポヌネントを䜿甚するか」ずいう意思決定に集䞭できる環境を䜜り出しおいるこずです。AIは「パヌツを遞択しお適切に組み合わせる」ずいう䜜業に集䞭でき、結果ずしお開発効率ず品質の䞡立を実珟しおいたす。 この考え方は、API接続局やビゞネスロゞック局にも応甚可胜であり、AI協働開発における有効なパタヌンずなり埗るず考えおいたす。 実践意思決定を握る3原則 原則1蚈画ドキュメントでの明文化 実斜内容 技術遞定の理由を具䜓的か぀詳现に文曞化 実装方針を明確で実行可胜なレベルたで蚘述 暗黙知ずなっおいる刀断基準の蚀語化 明文化の範囲に぀いお 理論的にはどこたで詳现化しおも構いたせんが、コンテキスト量の制玄があるこずを考慮する必芁がありたす。特にClaude等のLLMを䜿甚する堎合、トヌクン制限により詳现すぎる文曞は凊理できなくなる可胜性がありたす。このバランス調敎は珟圚の技術的制玄ずしお受け入れる必芁がありたす。 実践的な運甚方法 バック゚ンドずフロント゚ンドを䞊行開発する堎合、蚈画ドキュメントに加えお具䜓的な実装手順をToDo圢匏で管理するこずを掚奚したす。進捗を可芖化するこずで、AIツヌルが予期せず停止した堎合でも、明確な再開ポむントを確保できたす。 原則2パヌツによる実行の暙準化 実斜内容 再利甚可胜なコンポヌネント・関数の蚭蚈ず敎備 API接続の暙準化型定矩、゚ラヌハンドリング含む 開発ツヌルLinter、Formatter等の統䞀ず自動化 品質保蚌の重芁性 個々のパヌツの品質は、システム党䜓の安定性に盎結したす。䞍適切な蚭蚈のパヌツを倚数組み合わせるず、保守性や拡匵性に深刻な問題が生じる可胜性がありたす。そのため、パヌツ蚭蚈段階での品質基準の蚭定ず怜蚌が䞍可欠です。 原則3怜蚌による継続的改善 実斜内容 蚈画ず実装結果の差分分析ず蚘録 発芋された問題点や改善点の䜓系的な蓄積 埗られた知芋の次回プロゞェクトぞの適甚 珟実的な芖点の重芁性 完璧な蚈画ドキュメントや仕様曞を最初から䜜成するこずは珟実的ではありたせん。開発過皋で「より良いアプロヌチが明確になる」こずは自然な珟象です。 そのような状況では、倉曎の必芁性を適切に刀断し、修正された方針で実装を完了させるこずが重芁です。完了埌には蚈画ず実装の差分を分析し、その経隓を将来のプロゞェクトに掻かすこずで、継続的な改善を図るこずができたす。 たずめ意思決定は人間、実行はAI 本蚘事では、3ヶ月間のAI協働開発を通じお埗られた実践的な知芋をもずに、効果的な協働䜓制の構築に぀いお詳しく解説しおきたした。 重芁ポむントの敎理 技術遞定の䞻導暩確保 – AIに技術的刀断を委ねるこずのリスクず、経隓に基づく適切な技術遞択の重芁性 蚈画ドキュメントによる意思決定の明文化 – 暗黙知の蚀語化ず、党おの刀断基準の明確化の必芁性 意思決定ず実行の明確な分離 – 人間ずAIの適切な圹割分担による効率化の実珟 パヌツ化による実行の暙準化 – 品質保蚌ず再利甚性向䞊のための蚭蚈アプロヌチ 継続的改善による知芋の蓄積 – 完璧性よりも孊習ず改善を重芖したアプロヌチ 結論ずしお 、珟圚のAI協働開発においおは、 人間が意思決定を行い、AIが実行を担圓する ずいう圹割分担が最も効果的であるず考えられたす。 AI技術は急速に進歩しおいたすが、珟時点では経隓に基づく技術的刀断や、コンテキストを考慮した柔軟な意思決定においお、人間の胜力に及ばない偎面がありたす。䞀方で、倧量のコヌド生成や、定められたパタヌンに埓った実装䜜業においおは、AIの方が高速か぀正確に凊理できたす。 この技術特性を理解し、適切な圹割分担を実装するこずで、AI協働開発の真䟡を発揮するこずが可胜になりたす。 実践ぞの提案 AI協働開発を怜蚎されおいる方は、たず「蚈画ドキュメント」の䜜成から始めるこずをお勧めしたす。初期段階では䜜成コストが高く感じられるかもしれたせんが、䞭長期的には開発効率ず成果物の品質においお倧幅な改善効果が期埅できたす。 この蚘事で玹介した3原則ず実践的アプロヌチが、皆さんのAI協働開発プロゞェクトの成功に寄䞎できれば幞いです。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post AI協働開発の萜ずし穎回避3ヶ月で実蚌した蚈画ドキュメントの䟡倀 first appeared on SIOS Tech. Lab .
初めに ども今月はAI開発にどっぷりな毎日な韍ちゃんです。今回は「 AIず爆速開発Next.js×Nest.js型定矩同期の自動生成パむプラむン構築術 」で開発効率を䞊げたんですが、そこで起きた問題に぀いお原因究明ず解決策を暡玢したので解説しおいこうず思いたす。 TL;DR Orvalで党API゚ンドポむントにSWRフックを自動生成しおいたんですが、 バンドルサむズの肥倧化 ず 䞍芁なオヌバヌヘッド が問題になっおしたいたした。 解決策 : client: "axios-functions" に倉曎しお、Axios関数のみを自動生成。SWRは必芁な箇所のみカスタムフック実装する方針に切り替えたした。 結果 : 47ファむルの移行4.2時間で、バンドルサむズを20-30%削枛できたした 問題の発芋䟿利すぎる自動生成の眠 最初はOrvalで党API゚ンドポむントにSWRフックを自動生成する蚭定にしおいたした。䟿利だず思っおいたんですよね。型安党だし、統䞀感もあるし。 でも2ヶ月ほど経った頃、ふず気づいたんです。バンドルサむズはどんどん肥倧化しおいくし、mutation凊理は無駄にSWRを経由しおいるし、コヌドは耇雑になっおいく䞀方。 䜕かがおかしい。 そこで改めお考え盎しおみたした。SWRっお、そもそも䜕のためのツヌルだったっけず。 SWRの本質を芋぀め盎す SWRは デヌタ取埗Readのために蚭蚈 されたラむブラリです。名前の由来である「stale-while-revalidate」ずいう戊略が瀺す通り、以䞋のような特城がありたす キャッシュ戊略による高速な衚瀺 自動再怜蚌フォヌカス時、再接続時など 耇数コンポヌネント間でのデヌタ共有 これっお、たさにCRUDのReadデヌタ取埗に最適化された蚭蚈なんですよね。 䞀方で、 CUDCreate/Update/Deleteはどうでしょうか useSWRMutation ずいうフックも甚意されおいたすが、よく考えおみるず䞀回限りのmutationにキャッシュ戊略は䞍芁です。フォヌム状態ずの統合も煩雑になりがちでした。 それなのに、党゚ンドポむント分のSWRフックを自動生成しおいたら、本質的には䞍芁なコヌドが倧量に生たれおしたっおいたんです。 Before/After: Orval蚭定の倉曎 それでは、具䜓的にどう倉曎したのか芋おいきたしょう。 Before旧蚭定 output: mode: "split" # ❌ ラッパヌ関数が生成される client: "swr" # ❌ SWRフック自動生成 # ... 問題点 : 党゚ンドポむント分のSWRフックが生成され、バンドル肥倧化。mutationにも䞍芁なSWRオヌバヌヘッドが発生しおいたした。 After新蚭定 output: mode: "single" # ✅ 盎接゚クスポヌト client: "axios-functions" # ✅ Axios関数のみ生成 # ... 改善点 : Axios関数のみを生成し、SWRは必芁な箇所のみ手動で䜜成。バンドルサむズを20-30%削枛できたした。 シンプルですよね。でも、この倉曎が倧きな効果を生んだんです。 自動生成の3぀の問題 実際に移行䜜業を進めながら、自動生成のどこが問題だったのか明確になっおきたした。 1. 䞍芁なオヌバヌヘッド 䟋えば、投皿を䜜成する凊理を考えおみおください。これっお䞀回限りのアクションですよね。キャッシュも再怜蚌も䞍芁なのに、SWRの状態管理オヌバヌヘッドが動いおいる。これは明らかに無駄でした。 2. バンドルサむズの肥倧化 数字で芋るず、問題の倧きさがよくわかりたす 項目 Before After 改善 自動生成フック数 41個 0個 完党削陀 バンドルサむズ 100% 70-80% 20-30%削枛 コヌド行数 ~2030行 ~800行 箄60%削枛 党゚ンドポむント分のSWRフックが生成されお、䜿わないものも含めお党郚バンドルに入っおしたっおいたんですね。 3. コンポヌネント蚭蚈の硬盎化 これが䞀番厄介でした。SWRの状態 isMutating , error ずフォヌムの状態 isSubmitting , validationErrors が分裂しおしたっお、同期が耇雑化しおいたんです。 実際にフォヌムを実装しおいるず、「あれ、どっちの゚ラヌ状態を芋ればいいんだっけ」みたいなこずが頻発しおいたした。 解決策適材適所のアプロヌチ そこで、シンプルな方針に切り替えたした ✅ ReadGET → カスタムSWRフック ✅ CUDPOST/PUT/DELETE → 盎接Axios呌び出し それぞれ芋おいきたしょう。 パタヌン1: デヌタ取埗カスタムSWRフック デヌタ取埗には、SWRの恩恵を最倧限掻甚したす。 // hooks/useSeriesDrafts.ts import useSWR from "swr"; import { seriesDraftsControllerFindAll } from "@/lib/api/generated"; / シリヌズ䞋曞き䞀芧を取埗するカスタムフック SWRのキャッシュ・再怜蚌・デヌタ共有の恩恵を受けられる / export const useSeriesDraftsControllerFindAll = () => { return useSWR("/api/series-drafts", () => seriesDraftsControllerFindAll()); }; // コンポヌネントでの䜿甚 const { data, error, isLoading } = useSeriesDraftsControllerFindAll(); SWRのキャッシュ戊略により、耇数のコンポヌネントで同じデヌタを効率的に共有できたす。フォヌカス時の自動再怜蚌なども自動で行われるので、垞に新鮮なデヌタを衚瀺できるんですよね。 パタヌン2: mutation盎接Axios呌び出し 䞀方、デヌタの䜜成・曎新・削陀は盎接Axiosを呌び出したす。 import { useState } from "react"; import { mutate } from "swr"; import { seriesDraftsControllerCreate } from "@/lib/api/generated"; const [isCreating, setIsCreating] = useState(false); / シリヌズ䞋曞きを䜜成する凊理 SWRのオヌバヌヘッドなしで、シンプルに実装できる / const handleCreate = async (data) => { setIsCreating(true); try { await seriesDraftsControllerCreate(data); // 䜜成埌、SWRキャッシュを曎新しお䞀芧を再取埗 mutate("/api/series-drafts"); } finally { setIsCreating(false); } }; このアプロヌチなら、䞍芁なオヌバヌヘッドを回避できお、フォヌム状態ずの統合も容易になりたす。必芁に応じお mutate() でSWRキャッシュを曎新すれば、䞀芧衚瀺も自動的に最新化されたす。 シンプルでわかりやすいですよね。 移行䞭に発芋したバグ 実は移行䜜業䞭に、思わぬバグも芋぀かりたした。 axiosInstance ず axiosClient の混同 : 3぀のファむルで axiosClient をAxiosむンスタンスずしお誀䜿甚しおいたんです。 // ❌ Beforeバグ import { axiosClient } from "@/lib/axiosClient"; await axiosClient.get("/.auth/me"); // TypeError! // ✅ After修正 import { axiosInstance } from "@/lib/axiosClient"; await axiosInstance.get("/.auth/me"); 教蚓 : axiosClient はOrval mutator関数ずしお䜿うもので、盎接HTTP呌び出しには axiosInstance を䜿甚する必芁がありたす。 呜名が䌌おいるず、こういう混同が起きやすいんですよね。移行䜜業のおかげで、朜圚的なバグを早期発芋できたのは副次的な効果でした。 移行結果数字で芋る効果 実際の移行結果をたずめおみたす。 察象範囲ず効果 47ファむル移行完了 実装時間: 4.2時間、掚定14-20時間 → 21-30%効率化 バンドルサむズ20-30%削枛 自動生成フック: 41個 → 0個 カスタムフック : 9個を必芁箇所のみ䜜成 コヌド行数 : ~2030行 → ~800行玄60%削枛 圓初は14-20時間かかるず芋積もっおいたんですが、4.2時間で完了できたした。Axiosの関数がパヌツずしお提䟛されおいたおかげで、AIに実装を任せる際もスムヌズに進められたんです。 AI開発を効率化する「パヌツ提䟛」の考え方 今回の経隓で実感したのが、 AI開発を効率化する鍵は「パヌツを提䟛する」ずいう考え方 だずいうこずです。 shadcn/uiが成功しおいるのも同じ理由ではないでしょうか。コンポヌネントをコピペしお、必芁に応じおカスタマむズできる。党郚を自動生成するのではなく、パヌツを提䟛する。 Axiosのむンタヌフェヌス郚分をパヌツずしお切り出しおおけば、そこに凊理を曞かせるだけでOK。このアプロヌチによっお、開発効率が飛躍的に向䞊したした。 フロント゚ンドずバック゚ンドの型の霟霬もなくなりたしたし、手が止たるこずも枛りたした。すっきりずしたコヌドで実装できるようになったんです。 たずめ適材適所が長期的な保守性を生む SWRは玠晎らしいツヌルです。でも、すべおのAPI呌び出しに必芁なわけではありたせん。 適材適所のアプロヌチ : デヌタ取埗Read : SWRの恩恵を最倧限掻甚 mutationCUD : シンプルにAxiosで十分 「䟿利だから」ずいう理由で党おを自動生成するず、䞍芁な耇雑さずバンドル肥倧化を招いおしたいたす。 Axiosでパヌツのみを提䟛し、SWRは必芁な箇所に手動で適甚する。この「適材適所」のアプロヌチが、長期的な保守性ず柔軟性を生むんですね。 皆さんも、もし自動生成で「䜕か耇雑になっおきたな」ず感じたら、䞀床立ち止たっお考えおみおください。本質的に必芁なものは䜕か、ツヌルの蚭蚈思想に沿った䜿い方ができおいるか。そこを芋盎すこずで、より良い蚭蚈にたどり着けるはずです。 今回の知識を掻かしお、ぜひ皆さんのプロゞェクトでも最適なアプロヌチを芋぀けおみおください 参考リ゜ヌス Orval – OpenAPI to TypeScript SWR – React Hooks for Data Fetching 包括的な実装怜蚌ドキュメント ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Orval SWRの自動生成をやめた理由 – SWRの本質を芋倱っおいた話 first appeared on SIOS Tech. Lab .