ã¯ããã« ããã«ã¡ã¯ããµã€ãªã¹ãã¯ãããžãŒã®äœè€ éœã§ãã ä»åã¯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 .