TECH PLAY

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

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

å…š621ä»¶

こんにちは、サむオステクノロゞヌの䜐藀 陜です。 今回はBicepで耇数のサブネットをデプロむしたずきに発生した、゚ラヌの解消方法をご玹介したす。 Bicep入門したおの自分甚のメモずなっおたすが、誰かのお圹に立おれば幞いです。 はじめに みなさんBicep䜿っおたすか Azureに特化したIaCツヌルであり、曞きやすさ・読みやすさに定評がありたす。 最近自分もこのBicepに入門しお色々曞いおるのですが、TerraformやARM Templateに比べるず非垞に曞きやすくお気に入っおたす。 このBicepですが、Azure FunctionsやCosmosDBなんかのリ゜ヌスはもちろん、VNetなどネットワヌクリ゜ヌスのデプロむも可胜です。 そんな䞭、耇数のサブネットをデプロむするずきに少しハマっおしたったので、個人的な備忘録ずしお蚘録に残したいず思いたす。 結論 先に結論曞いおしたうず 発生した゚ラヌ AnotherOperationInProgress: Another operation on this or dependent resource is in progress. To retrieve status of the operation use uri: https://management.azure.com/subscriptions/~~~~ 解決策 VNetずSubnetNetを別々のリ゜ヌスずしお定矩するのではなく SubNetをVNetの子リ゜ヌスずしお定矩するよう実装する。 MSの ドキュメント にも「子リ゜ヌスずしお定矩するこずが最適である」ずの蚘茉がありたした。 解決たでの道のり 珟状 たず今回想定しおいる環境ずしお、以䞋のレンゞでVNetを䜜成したす。 10.0.0.0/16 このVNetに察しお、以䞋の3぀のSubnetを䜜成したす。 10.0.0.0/24 10.0.1.0/24 10.0.2.0/24 これを実珟するために、最初に曞いおいたBicepのコヌドはこちらです。 main.bicep targetScope = 'subscription' param environmentName string param location string var tags = {   // Tag all resources with the environment name.   'azd-env-name': environmentName } resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {   name: 'rg-sios'   location: location   tags: tags } module vnet './core/networking/vnet.bicep' = {   name: 'vnet'   scope: rg   params: {     name: 'vnet-sios'     addressPrefix: '10.0.0.0/16'     location: location   } } module subnet1 './core/networking/subnet.bicep' = {   name: 'subnet1'   scope: rg   params: {     name: 'subnet1'     addressPrefix: '10.0.0.0/24'     existingVirtualNetworkName: vnet.outputs.name   } } module subent2 './core/networking/subnet.bicep' = {   name: 'subnet2'   scope: rg   params: {     name: 'subnet2'     addressPrefix: '10.0.1.0/24'     existingVirtualNetworkName: vnet.outputs.name   } } module subnet3 './core/networking/subnet.bicep' = {   name: 'subnet3'   scope: rg   params: {     name: 'subnet3'     addressPrefix: '10.0.2.0/24'     existingVirtualNetworkName: vnet.outputs.name     } } ./core/networking/vnet.bicep param location string = resourceGroup().location param name string // 䜜成するvnetのアドレス空間 param addressPrefix string param subnets array = [] resource vnet 'Microsoft.Network/virtualNetworks@2021-02-01' = {   name: name   location: location   properties: {     addressSpace: {       addressPrefixes: [addressPrefix]     }     subnets: subnets   } } output name string = vnet.name output id string = vnet.id ./core/networking/subnet.bicep param name string param addressPrefix string param existingVirtualNetworkName string param delegations array = [] // 既に存圚する仮想ネットワヌクを参照 resource existingVirtualNetwork 'Microsoft.Network/virtualNetworks@2023-04-01' existing = {   scope: resourceGroup()   name: existingVirtualNetworkName } resource subnet 'Microsoft.Network/virtualNetworks/subnets@2023-04-01' = {   parent: existingVirtualNetwork   name: name   properties: {     addressPrefix: addressPrefix   } } output id string = subnet.id output name string = subnet.name 最初にVNetのリ゜ヌスを定矩し、そのあずparentのパラメヌタを通しおSubnetを远加するような方法ずなりたす。 このBicepファむルを甚いおを実行するず、以䞋のような゚ラヌが発生したした。 AnotherOperationInProgress: Another operation on this or dependent resource is in progress. To retrieve status of the operation use uri: https://management.azure.com/subscriptions/~~~~   Subnetを䜜成する際、同じVNetに同時にアクセスしおしたうため、凊理がバッティングしおいるこずを衚しおいたす。 このあたりBicepではいい感じにやっおくれないようです。 ちなみに stackoverflow にも同じような境遇の人がいたした。 修正案 以䞋のように、VNet構築時に子リ゜ヌスずしおSubnetを曞くこずで解消したした。 module vnet './core/networking/vnet.bicep' = {   name: 'vnet'   scope: rg   params: {     name: 'vnet-sios'     addressPrefix: '10.0.0.0/16'     location: location     subnets: [         {           name: 'subnet1'           properties: {             addressPrefix: '10.0.0.0/24'           }         }         {           name: 'subnet2'           properties: {             addressPrefix: '10.0.1.0/24'           }         }         {           name: 'subnet3'           properties: {             addressPrefix: '10.0.2.0/24'           }         }       ]   } } この実装方法に関しおは、 MSのドキュメント でも掚奚されおおり、 以䞋のように曞かれおいたした。 仮想ネットワヌク定矩内でサブネットを定矩するのが最適です。 子リ゜ヌスを䜿甚しおサブネットを定矩するず、Bicep ファむルが初めおデプロむされた堎合、仮想ネットワヌクがデプロむされたす。 その埌、仮想ネットワヌクのデプロむが完了するず、各サブネットがデプロむされたす。 この順序付けは、Azure Resource Manager が個々のリ゜ヌスを個別にデプロむするために起こりたす。 同じ Bicep ファむルを再デプロむするず、同じデプロむの順序付けが起こりたす。 ただし、subnets プロパティが実質的に空なので、仮想ネットワヌクは、サブネットの構成なしにデプロむされたす。 その埌、仮想ネットワヌクが再構成された埌、サブネット リ゜ヌスが再デプロむされ、各サブネットが再確立されたす。 状況によっおは、この動䜜により、デプロむ䞭に仮想ネットワヌク内のリ゜ヌスの接続が倱われるこずがありたす。 その他の状況によっおは、Azure により仮想ネットワヌクの倉曎が劚げられ、デプロむが倱敗するこずがありたす。 たた他にも、Subnetのリ゜ヌス定矩郚分でdependsOnのパラメヌタを利甚するこずで解決できそうでした。 ただ、「dependsOnは必芁な時だけ䜿うべき」ずいった内容の 蚘茉 も芋られたので、今回は採甚を芋送りたした。  サブネットぞの参照 䞀件萜着かず思いたしたが 次にハマったのが、䜜成したSubnetを参照する方法です。 プラむベヌト゚ンドポむントの蚭定を行う堎合など、他のリ゜ヌスを䜜成するずきにこのSubnetのIdが必芁になるケヌスが倚くあるかず思いたす。 独立したリ゜ヌスずしおSubnetを定矩しおいる堎合は簡単にアクセスできたすが、VNetの子リ゜ヌスずしお定矩されおいるため、ややアクセスし蟛いです。 VNetが持぀ subnets ずいうarrayのパラメヌタはすぐに取埗できるのですが、そこから取埗したいSubnetだけを抜出するのは冗長な実装になりそうです。 しかも配列に入れられる順番も毎回異なる可胜性があるずのこずで、array番号で決め打ちずいうのも難しそうです。 そしお、この解決方法に関しおも MSドキュメント に玹介されおたした。 ドキュメントさたさたです。 ドキュメントから匕っこ抜くず、以䞋のような圢での実装すればOKみたいです。 param location string = resourceGroup().location var virtualNetworkName = 'my-vnet' var subnet1Name = 'Subnet-1' var subnet2Name = 'Subnet-2' resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-11-01' = {   name: virtualNetworkName   location: location   properties: {     addressSpace: {       addressPrefixes: [         '10.0.0.0/16'       ]     }     subnets: [       {         name: subnet1Name         properties: {           addressPrefix: '10.0.0.0/24'         }       }       {         name: subnet2Name         properties: {           addressPrefix: '10.0.1.0/24'         }       }     ]   }   resource subnet1 'subnets' existing = {     name: subnet1Name   }   resource subnet2 'subnets' existing = {     name: subnet2Name   } } output subnet1ResourceId string = virtualNetwork::subnet1.id output subnet2ResourceId string = virtualNetwork::subnet2.id   ただこのコヌドだず moduleを利甚しおいない ハヌドコヌディング色が匷い など、いたいち柔軟性に欠ける実装に感じたした。 そこで、このコヌドを参考に、subnet.bicepを以䞋のように曞き盎したした。 ./core/networking/subnet.bicep param name string param existingVirtualNetworkName string // 既に存圚する仮想ネットワヌクを参照 resource existingVirtualNetwork 'Microsoft.Network/virtualNetworks@2023-11-01' existing = {   name: existingVirtualNetworkName   //名前が䞀臎するSubnetだけを抜出   resource subnet 'subnets@2023-11-01' existing = {     name: name   } } output id string = existingVirtualNetwork::subnet.id output name string = existingVirtualNetwork::subnet.name このリ゜ヌスに察し、既存のVNetずSubnetの名称を䞎えるこずで 既に存圚しおいるSubnetリ゜ヌスにアクセスするこずが可胜ずなり、Subnetのリ゜ヌスIDを取埗するこずが可胜ずなりたす。 main.bicepずしおは以䞋のような圢になりたす。 (実際は、subnet名などを倉数で定矩しおおいおあげるずよいかず思いたす。) module vnet './core/networking/vnet.bicep' = {   name: 'vnet'   scope: rg   params: {     name: 'vnet-sios'     addressPrefix: '10.0.0.0/16'     location: location     subnets: [         {           name: 'subnet1'           properties: {             addressPrefix: '10.0.0.0/24'           }         }         {           name: 'subnet2'           properties: {             addressPrefix: '10.0.1.0/24'           }         }         {           name: 'subnet3'           properties: {             addressPrefix: '10.0.2.0/24'           }         }       ]   } } module existingSubnet1 './core/networking/subnet.bicep' = {   name:'existingSubnet1'   scope:rg   params:{     name:'subnet1'     existingVirtualNetworkName: vnet.outputs.name   } } //䟋えばKeyVault甚にPrivateEndpointの蚭定を行う module keyVaultPrivateEndpoint './core/networking/private-endpoint.bicep' = {   name: 'key-vault-private-endpoint'   scope: rg   params: {     name: keyVault.outputs.name     location: location     subnetId: existingSubnet1.outputs.id  //ここでSubnetのIdを参照     privateLinkServiceId: keyVault.outputs.id     privateLinkServiceGroupIds: ['vault']     dnsZoneName: 'vaultcore.azure.net'     linkVnetId: vnet.outputs.id   } } たずめ 今回はBicepを䜿っお耇数Subnetを構築する際のポむントをご玹介したした。 他にもこんな簡単な方法あるよずいった方はぜひコメントで教えおください。 ただただBicep入門したおなので、色々勉匷しおいきたいず思いたす。 ではたた 参考文献 2023-11-01 API バヌゞョンを䜿っお Bicep で Azure VNet のサブネットを自由にデプロむする Azure Bicep の配列にハマる(n回目) Bicep を䜿っお仮想ネットワヌク リ゜ヌスを䜜成する ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 【Azure】Bicepで耇数サブネットをデプロむする時のポむントを玹介 first appeared on SIOS Tech. Lab .
Azure OpenAI ServiceによるRAGハンズオン開催のお知らせ 〜独自デヌタを甚いた生成AIの利掻甚を孊ぶ〜【初玚線】第2回 この床、「 Azure OpenAI ServiceによるRAG実装ガむド 」 をダりンロヌドしおいただいた方限定に、 RAGのハンズオンを無料開催いたしたす。前回奜評に぀き、2回目の開催です。 本ガむドの目的は、これからRAGを始める人に参考にしおいただくため、「シンプル」「匷力」「すぐ動く」をモットヌにしたRAGアプリケヌションを実装するためのガむドです。本ガむドではRAGのアヌキテクチャのみならず「実際に動くコヌド」もご甚意臎したした。読者の皆様には、コヌドを動かしながらRAGをより深くご理解頂けるこずを䞀番の目的ずしおおりたす。 ハンズオンのお申蟌みは先着順ずなっおおりたすので、 ご興味がある方はお早めにお申し蟌みください。 【無償】初玚テクニカルトレヌニング Azure OpenAI ServiceによるRAGハンズオン 〜独自デヌタを甚いた生成AIの利掻甚を孊ぶ〜【初玚線】 抂芁 Azure OpenAI Serviceの抂芁説明 RAGの抂芁説明 RAGの構築 日時 2024幎9月20日金13:0017:00受付12: 30 堎所 〒106-0047 東京郜枯区南麻垃2-12-3 サむオスビル3F 埗られるスキル Azure OpenAI Serviceの基瀎 Azure OpenAI Serviceがどのようなサヌビスであり、 どのように利甚するのかを孊ぶこずができたす。これにより、 クラりドベヌスのAIサヌビスの掻甚方法を理解し、 自身のプロゞェクトに適甚するための基瀎を築くこずができたす。 RAGの仕組み RAGRetriever-Augmented Generationの基本的な仕組みを理解し、 独自デヌタを掻甚した生成AIの基瀎理論を孊ぶこずができたす。 RAG構築方法 実際にRAGを構築するための基本的な手順を孊びたす。 ハンズオンを通じお、 独自デヌタの準備から倖郚デヌタベヌスぞの登録、 そしお生成AIを甚いた回答生成たでの流れを䜓隓し、 実践的なスキルを身に぀けるこずができたす。 費甚 無料 定員 24名先着順 察象者 Azure OpenAI ServiceによるRAG実装ガむドをダりンロヌドされた方 ゚ンドナヌザ䌁業の方 準備いただくもの お名刺 無線LANを利甚できるPC(Windows、 MacどちらでもOK) GitHubのアカりント(GitHub Codespacesの180CPU時間の無料枠利甚のためFr eeでOK) Azureのサブスクリプション Azureのサブスクリプションで利甚可胜なAzure Open AI Service( 承認には時間を芁するため以䞋のURLより早めにご申請ください 。ご甚意が難しい堎合は別途ご盞談ください。) https://aka.ms/oai/access 泚意事項 本ハンズオンでは、 受講者ご自身のAzureサブスクリプションを䜿甚しおいただく こずが前提ずなりたす。そのため、 サブスクリプションにかかる費甚は受講者様のご負担ずなりたす。 ハンズオン䞭に発生するAzure利甚料金は、通垞、 数癟円皋床、1000円未満ず芋蟌んでおりたす。 Azure OpenAI ServiceによるRAG実装ガむドをダりンロヌドしおいない 方がお申蟌みをした堎合、キャンセルずさせおいただきたすので、 あらかじめご了承ください。   【有償】支揎サヌビス 䞊玚テクニカルトレヌニング Azureの最先端技術を駆䜿したRAGハンズオンです。 このハンズオンでは、最新の怜玢手法である「 セマンティックハむブリッド怜玢」、Azure Static Web Apps、Azure Functionsによるフルサヌバヌレス構成など、 最新技術を甚いたRAGの構築方法をお䌝えしたす。 業務委蚗・技術支揎 圓瀟では、AIだけでなく、 クラりドネむティブなアプリケヌション開発、 既存システムのクラりド移行・モダナむれヌション、 システムの基盀構築など、 クラりドを䞭心ずしたシステム開発あるいは技術支揎なども行っお おりたす。システムでの困り事がありたしたら、 ぜひご盞談ください。 チャットボット䜜成 (RAGツヌル開発) RAG(Retrieval-Augmented Generation)を䞭心に、 話題の生成AIを掻甚した業務の効率化、 DX化をお手䌝いいたしたす。瀟内ノりハりの芋える化、 カスタマヌサポヌトの省力化、 チャットボットアプリケヌションの導入など、 瀟内資源の有効掻甚をお考えの堎合は、ぜひご盞談ください。 AI関連アプリ開発 既存のアプリ・システムを、もっず䟿利に・ 楜にできないかお考えですかRAGやLangChain などにより生成AIを掻甚すれば、 今たで以䞊により業務効率を䞊げるのに効率的なアプリの開発を行 うこずができたす。 たずはコンサルティングずいう圢からご盞談いただくこずも可胜で す。AIで迷われたら、ぜひご盞談ください。 Azure CSP販売・技術支揎 Azureのラむセンス販売を通じおお客様のビゞネスをご支揎し おいたす。 Azureラむセンスの提䟛からAI技術のコンサルティングたで 党お圓瀟にお任せください。​​​​ ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 【9/20無料開催】Azure OpenAI ServiceによるRAGハンズオン 〜独自デヌタを甚いた生成AIの利掻甚を孊ぶ〜初玚線第2回 first appeared on SIOS Tech. Lab .
サむオステクノロゞヌの藀原です。 今回はApache Syncopeを構築しおみたした。手順は公匏ドキュメントhttps://syncope.apache.org/docs/を参考に進めたす。 前提条件 AlmaLinux 9.4 Java 17 Apache Syncope 3.0.7 Javaむンストヌル # dnf -y install java-17-openjdk # java -version openjdk version "17.0.11" 2024-04-16 LTS OpenJDK Runtime Environment (Red_Hat-17.0.11.0.9-3) (build 17.0.11+9-LTS) OpenJDK 64-Bit Server VM (Red_Hat-17.0.11.0.9-3) (build 17.0.11+9-LTS, mixed mode, sharing) Apache Syncopeむンストヌル ダりンロヌド ここhttps://syncope.apache.org/downloadsからZIPをダりンロヌドしたす。Signaturesのsha512の倀を控えおおきたす # curl -LkvOf https://dlcdn.apache.org/syncope/3.0.7/syncope-standalone-3.0.7-distribution.zip フィンガヌプリントの確認 # sha512sum syncope-standalone-3.0.7-distribution.zip acb26d01d244e7bd33339f64c9811286e9178e5cd3b7e472fbeabf8be83bb8e77ccc8849f3e587ebacfec34887fd6ce73aa3333231952a60f316e4b71f624f8b  syncope-standalone-3.0.7-distribution.zip   先ほど控えたSignaturesのsha512の倀ずフィンガヌプリントが䞀臎しおいるこずを確認したす。 むンストヌル 配眮 ダりンロヌドしたパッケヌゞを解凍しお配眮したす。 # unzip syncope-standalone-3.0.7-distribution.zip # mv syncope-standalone-3.0.7 /opt/apache-syncope syncopeナヌザを䜜成 # useradd syncope 暩限を付䞎 # chown -R syncope. /opt/apache-syncope systemdで起動するように蚭定を远加 # vim /usr/lib/systemd/system/syncope.service [Unit] Description=Apache Syncope Service [Service] Type=forking User=syncope Group=syncope ExecStart=/opt/apache-syncope/apache-tomcat-9.0.89/bin/startup.sh ExecStop=/opt/apache-syncope/apache-tomcat-9.0.89/bin/shutdown.sh WorkingDirectory=/opt/apache-syncope/apache-tomcat-9.0.89/bin [Install] WantedBy=multi-user.target   サヌビス起動 SELinuxの無効化 # setenforce 0 systemd蚭定のリロヌド # systemctl daemon-reload サヌビス起動 # systemctl start syncope ログむン サヌビスはポヌト9080で起動したす。 今回はポヌトフォワヌドでロヌカルポヌト8080からSyncopeサヌバのポヌト9080にアクセスしおいたす。 http://localhost:8080/syncope-console   ナヌザヌ名admin パスワヌドpassword 構築からログむンたで完了です。 初期蚭定ではDBのH2 Databaseがむンメモリで起動するように蚭定されおおり、再起動するたび初期化されおしたいたす。 DBにはこちらhttps://syncope.apache.org/docs/getting-started.html#internal-storageのものが䜿甚可胜なようなのでPostgreSQLにしたいなず思うのですが、珟時点では蚭定方法が分かりたせん。。。       ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Apache Syncopeを構築しおみた first appeared on SIOS Tech. Lab .
サむオステクノロゞヌの藀原です。 今回はmidPointをDistribution Packageから構築しおみたした。手順は https://docs.evolveum.com/midpoint/install/bare-installation/distribution/ を参考に進めたす。 構築から初回ログむンたでの流れに぀いお説明しおいきたす。 前提条件 AlmaLinux 9.4 Java 21 midPoint 4.8.3 Javaむンストヌル # dnf -y install java-21-openjdk # java -version openjdk version "21.0.4" 2024-07-16 LTS OpenJDK Runtime Environment (Red_Hat-21.0.4.0.7-1) (build 21.0.4+7-LTS) OpenJDK 64-Bit Server VM (Red_Hat-21.0.4.0.7-1) (build 21.0.4+7-LTS, mixed mode, sharing) midPointむンストヌル ダりンロヌド # curl -OL https://evolveum.com/downloads/midpoint/4.8.3/midpoint-4.8.3-dist.tar.gz 解凍 # tar zxvf midpoint-4.8.3-dist.tar.gz 配眮 # mv midpoint-4.8.3 /opt/midpoint-4.8.3 # ln /opt/midpoint-4.8.3 /opt/midpoint midpointナヌザ䜜成 # useradd -r -d /opt/midpoint/var -s /sbin/nologin -c "Midpoint daemon" midpoint 暩限倉曎 # chown -R midpoint. /opt/midpoint-4.8.3 systemd蚭定 今回はこちら https://docs.evolveum.com/midpoint/install/bare-installation/systemd/ を参考にsystemdで起動するように蚭定しおみたした。 # vim /etc/systemd/system/midpoint.service [Unit] Description=MidPoint Standalone Service ###Requires=postgresql.service ###After=postgresql.service [Service] User=midpoint WorkingDirectory=/opt/midpoint ExecStart=/usr/bin/java -Xmx2048m -Dmidpoint.home=/opt/midpoint/var -jar /opt/midpoint/lib/midpoint.jar SuccessExitStatus=143 ###TimeoutStopSec=120s [Install] WantedBy=multi-user.target サヌビスの起動ず自動起動蚭定 # systemctl daemon-reload # systemctl enable midpoint # systemctl start midpoint # systemctl status midpoint 初回ログむン administratorのパスワヌド確認 初回起動時のログにadministratorのパスワヌドが蚘茉されおいるので確認したす。 # grep "Administrator initial password" /opt/midpoint/var/log/midpoint.log 2024-08-27 05:00:20,660 [] [main] WARN (com.evolveum.midpoint.init.DataImport): Administrator initial password (except double quotes): "hogehoge" ログむンする ポヌト8080でサヌビスが起動するので、midPointにログむンしたす。 今回はポヌトフォワヌドでロヌカルポヌト28080からmidPointサヌバのポヌト8080にアクセスしおいたす。 https://localhost:28080/midpoint/ ナヌザヌ名administrator パスワヌドhogehoge ホヌム画面が衚瀺されたら初回ログむンたで完了です。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post midPointを構築しおみたFrom Distribution Package first appeared on SIOS Tech. Lab .
サむオステクノロゞヌの藀原です。 前回はmidPointを構築したしたhttps://tech-lab.sios.jp/?p=42755。 今回はmidPointでCSVからアカりントを䜜成したいず思いたす。   CSVの甚意 源泉ずなるCSVを䜜成したす。CSVはmidPointが茉っおいるサヌバ䞊に配眮したす。 ファむルにはmidPointが曞き蟌みできる暩限を䞎えたす。 # vim /opt/midpoint/var/csv/csvresource.csv ナヌザID 姓挢字 名挢字 メヌルアドレス sios-test1 最雄 倪郎 sios-test1@siostest02.com sios-test2 最雄 次郎 sios-test2@siostest02.com sios-test3 最雄 侉郎 sios-test3@siostest02.com   リ゜ヌスの䜜成 midPointず接続されるシステムはリ゜ヌスずしお定矩されたす。CSVのリ゜ヌスを䜜成しおいきたす。 ホヌム画面から巊ペむンの「リ゜ヌス」「新芏リ゜ヌス」を遞択したす 「スクラッチ」を遞択したす 「CsvConnector」を遞択したす 基本情報を入力し、「次ぞ蚭定→」ぞ進みたす 最初に配眮したCSVのファむルパスを指定し、「次ぞディスカバリヌ→」ぞ進みたす CSVファむルに曞き蟌み暩限がない堎合、ここで゚ラヌになりたす。   各項目を入力し、「次ぞスキヌマ→」ぞ進みたす デフォルトでAccountObjectClassにチェックが入っおいるので、そのたた「リ゜ヌスの䜜成」を遞択したす リ゜ヌスが䜜成できたので、「りィザヌドを終了」からリ゜ヌス䞀芧に戻りたす 「CSVリ゜ヌスblog甚」が䜜成されたした リ゜ヌス・オブゞェクトが認識されおいるこずを確認したす CSVに蚘茉されたアカりントが認識されおいたす リ゜ヌスの蚭定 midPointは基本的にリ゜ヌスを䜜成しただけでは䜕も凊理が発生したせん。midPoint偎にCSVのリ゜ヌス・オブゞェクトに察応するナヌザヌが存圚しない堎合に、ナヌザヌを䜜成するように蚭定したす。 オブゞェクトタむプの远加 先ほど䜜成したリ゜ヌスを遞択し、「スキヌマ凊理」を開きたす 基本情報を入力し、「次ぞリ゜ヌス・デヌタ→」ぞ進みたす 皮類はアカりントを遞択したす。CSVリ゜ヌスに蚘茉されおいるのはアカりントであるためです。 リ゜ヌス・デヌタを入力し、「次ぞMidPointデヌタ→」ぞ進みたす ここはデフォルトのたた進めたす。 MidPointデヌタを入力し、「蚭定を保存」を遞択したす タむプはナヌザヌ、アヌキタむプはPersonを遞択したす オブゞェクトタむプが䜜成されたす オブゞェクトタむプの蚭定 䜜成したオブゞェクトタむプにマッピングず同期の蚭定を行いたす マッピングを蚭定したす。「むンバりンドの远加」を遞択したす CSVリ゜ヌスのアカりントの属性ず、midPoint偎のアカりントの属性ずの玐づけを行いたす。 今回は以䞋のように属性をマッピングしたした 次に同期の蚭定を行いたす リ゜ヌス偎のアカりントずmidPoint偎のアカりントを比范した時に、どのように凊理を行うか定矩したす。 今回はリ゜ヌス偎のアカりントに察応するアカりントがmidPoint偎に存圚しない堎合に、ナヌザヌを新芏䜜成するような蚭定を行いたした。   アカりント䜜成 リ゜ヌスのラむフサむクル状態をActiveにしお、倉曎が反映されるようにしたす リ゜ヌス・オブゞェクトから察象アカりントを遞択し、右偎のアむコンから「むンポヌト」をクリックしおアカりントをむンポヌトしたす 状況がLINKEDになっおいれば、midPoint偎にナヌザヌずアカりントが新芏䜜成され、CSV偎のアカりントず玐づいた状態になっおいたす。 巊ペむンのナヌザヌすべおのナヌザヌを開きたす 先皋むンポヌトしたアカりントからナヌザヌが䜜成されたこずが確認できたす。         ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post midPointでCSVからアカりントを䜜成する first appeared on SIOS Tech. Lab .
はじめに こんにちは今月から生成AI掻甚事業がメむン業務になったなヌがです。前回から少し時間が空いおしたいたしたが、今回はAzure OpenAI Serviceの機胜の䞀぀であるOn Your Dataに぀いお曞こうず思いたす。 Azure OpenAI On Your Dataずは Azure OpenAI On Your DataはAzure OpenAI Serviceの機胜の䞀぀で、簡単にRAGが構築できるサヌビスです。RAGっお䜕ずいう方は、匊瀟ブログで解説しおいたすので以䞋の蚘事をご芧ください。 RAG構築のためのAzure OpenAI Serviceリファレンスアヌキテクチャ詳解 Azure OpenAI ServiceによるRAG実装ガむドを公開したした 【7/24無料開催】Azure OpenAI ServiceによるRAGハンズオン 〜独自デヌタを甚いた生成AIの利掻甚を孊ぶ〜初玚線 こちらは9月にも開催予定です 【培底解説】Document Intelligenceを利甚しおRAGを構築する【セマンティックチャンキング】 【初心者向け】RAG評䟡フレヌムワヌク Ragasを必芁最䜎限で䜿っおみる 【AOAI】RAGパむプラむンの構築から評䟡フェヌズたでの実装を䞀挙解説【Ragas】 RAGを自前で構築するには以䞋の4぀のリ゜ヌスが必芁ずなり、Azureを䜿甚する堎合はそれぞれ以䞋のようになりたす。 むンデクサヌ自前で䜜成 オヌケストレヌタヌ自前で䜜成 怜玢゚ンゞンAzure AI Search 生成AIAzure OpenAI Service 匊瀟ブログでも「 RAG構築のためのAzure OpenAI Serviceリファレンスアヌキテクチャ詳解 」ずしお解説を行っおいたすが、あたりリ゜ヌスを䜜ったこずがない堎合やコヌドはよく分からないからGUIでポチポチやっお出来ないかなず思われおいる方もいるず思いたす。Azure OpenAI On Your Dataを䜿うず、以䞋のように自前で䜜成が必芁だったむンデクサヌずオヌケストレヌタヌをAzure偎でいい感じにやっおくれたす。 むンデクサヌ Azure OpenAI Service オヌケストレヌタヌ Azure OpenAI Service 怜玢゚ンゞンAzure AI Search 生成AIAzure OpenAI Service 䜿い方 たず、䜜成が必芁なリ゜ヌスは以䞋になりたす。各リ゜ヌスの䜜成方法に関しおは長くなるのでここでは割愛したす。 Azure OpenAI Service モデルのデプロむ Azure AI Search Azure ストレヌゞアカりント Azure OpenAI Studioのプレむグラりンドを開くず、「セットアップ」の䞭に「デヌタを远加する」があるず思うので、クリックしたす。 ※新UIでやっおいたす。旧UIの堎合は「蚭定」の䞭に「デヌタを远加する」がありたす。 「デヌタ゜ヌスの远加」をクリックしたす。 ロヌカルのファむルをアップロヌドするため、「デヌタ゜ヌスを遞択する」で「Upload files (preview)」を遞択しお「次ぞ」をクリックしたす。 「サブスクリプション」、「Azureストレヌゞアカりント」、「AI Search」を遞択し、「むンデックス名今回はdocsずしたした」を入力したす。 ※「Azureストレヌゞアカりント」の「リ゜ヌスの共有 (CORS)」が蚭定されおいない堎合は、䞋蚘のように゚ラヌが発生したす。「CORSをオンにする」をクリックするこずで、「リ゜ヌスの共有 (CORS)」が蚭定されたす。 ドラッグアンドドロップたたはファむルを参照しお遞択したファむル名が衚瀺されたら「ファむルのアップロヌド」をクリックしたす。 「ファむルは正垞にアップロヌドされたした。」ず衚瀺されたら「次ぞ」をクリックしたす。 「怜玢の皮類今回はセマンティックにしたした」、「チャンクサむズ今回はアップロヌドするファむルが小さいので256ずしたした」を遞択しお「次ぞ」をクリックしたす。 「Azure リ゜ヌス認蚌の皮類」で「APIキヌ」を遞択しお「次ぞ」をクリックしたす。 「保存しお閉じる」をクリックしたす。 むンデクシングが開始されたす。 しばらくするず、デヌタ゜ヌス䜜成が完了したす。 AI Seachの「むンデックス」を確認するず、アップロヌドしたファむルがむンデックスずしお登録されおいるこずが分かりたす。 それではプロンプトで「テスト就業芏則.pdf」に蚘茉されおいる始業時間を質問をしおみたす。望んだずおりの回答を埗るこずが出来たした。 回答に参照があるので開いおみるず、参照元の情報今回だずテスト就業芏則.pdfが衚瀺されおいたす。 デヌタの削陀 「デヌタ゜ヌスの削陀」から「続行」をクリックするこずでアップロヌドしたデヌタ゜ヌスを削陀できたす。※AI Searchのむンデックスは削陀されたせん さいごに 今回はAzure OpenAI Serviceの機胜の䞀぀であるOn Your Dataに぀いお曞きたした。生成AI掻甚事業に取り組み始めお1か月が経ち、少しず぀生成AIやRAGに぀いおの知識が付いおきたず思いたす。今埌も業務で孊んだこずをブログにしおいきたいず思いたす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Azure OpenAI Service の On Your Dataを䜿っおみた first appeared on SIOS Tech. Lab .
こんにちは 今月も「OSSのサポヌト゚ンゞニアが気になったOSSの最新ニュヌス」をお届けしたす。 2024/7/31、株匏䌚瀟グロヌバルむンフォメヌションは、垂堎調査レポヌト「Linux゜フトりェア垂堎タむプ別、甚途別䞖界の機䌚分析ず産業予枬、2024幎2032幎」の販売を開始したした。 Linux゜フトりェア垂堎タむプ別、甚途別䞖界の機䌚分析ず産業予枬、2024幎2032幎 https://newscast.jp/news/4939282 2024/8/7、Linux Foundation Research が「Open Source License Compliance」の日本語版「オヌプン゜ヌス ラむセンス コンプラむアンス」を公開したした。 オヌプン゜ヌス ラむセンス コンプラむアンス https://www.linuxfoundation.jp/publications/2024/08/open-source-license-compliance-jp/ 2024/8 の Windows セキュリティ曎新プログラムが Windows / Linux のデュアルブヌト環境に圱響があり、Linux 環境が起動しなくなる事象が発生する可胜性があるず発衚したした。 August 2024 security update might impact Linux boot in dual-boot setup devices https://learn.microsoft.com/en-us/windows/release-health/status-windows-11-22h2#3377msgdesc ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 【2024幎8月】OSSサポヌト゚ンゞニアが気になったOSS最新ニュヌス first appeared on SIOS Tech. Lab .
今号では、Linux における 暙準入力 、 暙準出力 、 暙準゚ラヌ出力 に぀いお解説したす 暙準入力・暙準出力・暙準゚ラヌ出力ずは 暙準入力 ずは、プログラムが䜿うデヌタを受け取るための読み蟌み元を意味したす。 䞻な暙準入力ずしお、 キヌボヌド などがありたす。 暙準出力 ずは、プログラムが䜿うデヌタの出力先を瀺したす。 それに察しお 暙準゚ラヌ出力 ずは、プログラムが䜿うデヌタのうち、゚ラヌの出力先を意味したす。 䞻な暙準出力・暙準゚ラヌ出力ずしお、 コン゜ヌル、ディスプレむ などがありたす。 たた、コマンド操䜜における暙準入力・暙準出力・暙準゚ラヌ出力では、 パむプラむン 、 リダむレクト ずいう仕組みを䜿甚するこずができたす。 パむプラむン パむプラむンずは、コマンドの出力を別のコマンドの入力ずしお扱う仕組みです。 &#8220;|&#8221; で衚珟したす。 䟋えば、text.txt ずいうファむルの内容から grep コマンドで特定の文字列を抜出する堎合、䞋蚘の様なコマンドを実行したす。 # cat text.txt | grep aaa aaa 前提ずしお、text.txt の内容は䞋蚘の通りです。 # cat text.txt aaa bbb ccc ddd eee この時、cat text.txt にお出力された内容が &#8220;|&#8221; (パむプラむン) を通じお grep コマンドに枡され、grep コマンドはその 暙準入力からデヌタを受け取っおいたす 。 リダむレクト リダむレクトずは、コマンドの出力先を別の出力先 (ファむルなど) に倉曎するこずができる仕組みです。 &#8220;>&#8221; や &#8220;<" で衚珟したす。 暙準出力のリダむレクト 䟋えば、ls コマンドでカレントディレクトリのファむル䞀芧を衚瀺させた堎合、結果をコン゜ヌルではなくファむルに出力する堎合、䞋蚘の様なコマンドを実行したす。 # ls > /tmp/file.txt # file.txt の内容は䞋蚘の通りずなりたす。 # cat /tmp/file.txt file1 file2 file3 暙準゚ラヌ出力のリダむレクト 䞊蚘で解説した暙準出力 &#8220;>&#8221; の堎合、 ゚ラヌずなる実行結果、぀たり暙準゚ラヌ出力 はリダむレクトしたせん。 䟋えば、先ほどず同様に ls コマンドの実行結果を暙準゚ラヌ出力のリダむレクト &#8220;2>&#8221; を䜿甚しおファむルに出力しおみたすが、出力先ファむルには䜕も蚘録されたせん。 代わりに、デフォルトの暙準出力であるコン゜ヌルに実行結果が衚瀺されおいたす。 # ls 2> /tmp/file.txt file1 file2 file3 # cat /tmp/file.txt # では、ls コマンドで存圚しないファむルを指定しお実行した堎合はどうでしょうか。 この堎合、コン゜ヌルには䜕も衚瀺されず実行結果が file2.txt にリダむレクトされたこずが分かりたす。 # ls file4 2> /tmp/file2.txt # cat /tmp/file2.txt ls: file4 にアクセスできたせん: そのようなファむルやディレクトリはありたせん 暙準出力、暙準゚ラヌ出力䞡方のリダむレクト 䞊蚘で解説した暙準出力、暙準゚ラヌ出力を䞡方同時にリダむレクトさせるこずもできたす。 先ほどの 2通りの ls コマンドを䞋蚘の様にそれぞれ実行するず、いずれの堎合も実行結果が各ファむルぞ曞き蟌たれた事が分かりたす。 # ls > /tmp/file.txt 2>&1 # ls file4 > /tmp/file2.txt 2>&1 # cat /tmp/file.txt file1 file2 file3 # cat /tmp/file2.txt ls: file4 にアクセスできたせん: そのようなファむルやディレクトリはありたせん 暙準入力のリダむレクト パむプラむンの章で解説した grep コマンドの実行䟋ですが、暙準入力のリダむレクトを䜿甚しおも同じこずができたす。 # grep aaa ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post 知っおおくずちょっず䟿利暙準入力・暙準出力・暙準゚ラヌ出力に぀いお first appeared on SIOS Tech. Lab .
はじめに 皆さんこんにちは。 ゚ンゞニアの现川です 今月のSIOS Technologyのアドベントカレンダヌ、テヌマは「生成AI」ずいうこずで、生成AIを掻甚した次䞖代゚ディタヌのCursorに぀いお玹介したす無料で詊せるので気になる方はぜひこの蚘事を読んで詊しおみおください Cursorずは Cursorは生成AIによるサポヌトが組み蟌たれた゚ディタヌになりたす。 VSCodeをフォヌクしおいるので、䜿い勝手などは基本的にVSCodeず倉わらず、倚くの拡匵機胜にも察応しおいたす。 コヌディングの際に、サゞェストしおくれたり、chatで盞談できたりするような䜿い勝手ずしおはGithub Copilotがデフォルトで入っおいる゚ディタヌずいうような印象です。 䟋えばコヌディングしおいるず以䞋のように、サゞェストをしおくれたす。 &nbsp; たた、chatでコヌドに぀いおの質問などを自然蚀語で投げるこずができたす。 以䞋はある関数のテストコヌドを曞いおもらっおいる䟋です。 &nbsp; &nbsp; 利甚料金 料金プランは無料プラン、Proプラン、Businessプランの3぀です。 個人的に無料で始められるのが、かなり掚しポむントです Cursor導入手順 たずは こちら のペヌゞからCursorをダりンロヌドしたす。 ダりンロヌドしたファむルを開いお、Cursorをむンストヌルしおください。 ダむアログ䞭の language 欄には「日本語」を入力したす。 他はお奜きなように蚭定しおください VSCodeで導入枈みの拡匵機胜をワンクリックで導入しおくれるので非垞に䟿利です おすすめ蚭定 続いお、日本語化の蚭定ず、VSCodeのようにサむドバヌ衚瀺にする蚭定のやり方を玹介したす。 日本語化 たず日本語化です。 以䞋の「 Japanese Language Pack for Visual Studio Code 」の拡匵機胜が入っおいない方は導入しおください。 その埌、「Ctrl + Shift + P」でコマンドパレットを開き、怜玢欄に「Language」ず入力したす。 怜玢結果の䞭から、以䞋のConfigure Display Languageの項目をクリックしお、日本語を遞択しおください。 Cursorを再起動すれば、日本語になっおいるず思いたす。 サむドバヌ衚瀺 続いおサむドバヌ衚瀺の蚭定方法に぀いおです。Cursorはデフォルトでは以䞋のようにツヌルバヌが䞊郚に衚瀺されおいるのですが、こちらも蚭定で巊サむドに衚瀺させるこずができたす。 たずは、以䞋のようにファむル→ナヌザヌ蚭定→ 蚭定をクリックしお、蚭定画面を開きたす。 そしお蚭定画面で怜玢欄に「activity」ず入力しお、以䞋のWorkbench &gt; Activity Bar: Orientationをクリックし、「vertical」を遞択しおください。 遞択埌再起動するず、VSCodeのように、巊偎にツヌルバヌを衚瀺させるこずができたす。 暩利系に぀いお ビゞネス面で利甚するうえで気になるのが暩利系ではないでしょうか 少し公匏ペヌゞをあさっおみたずころ、 こちら の箇所に生成物の暩利等はすべお利甚者が所有するずいう蚘茉がありたした。生成物に぀いおは暩利䞊は問題なさそうです。 たた、chatや゜ヌスコヌドなどの情報がモデルの孊習に䜿われるのではないかずいう懞念もあるず思いたすが、そちらはプラむバシヌモヌドを䜿うこずで解決できたす。 無料プランでもプラむバシヌモヌドを利甚できるので、業務利甚をする堎合はプラむバシヌモヌドで利甚するず良いかず思いたす。 Github Copilotずの違い 僕は業務でGithub Copilotを利甚しおいるのですが、 Github Copilot ず今回玹介したCursorずの違いに぀いお玹介したいず思いたす。 Github Copilotは既にご存知の方も倚いず思いたすが、VSCodeなどの拡匵機胜で、導入するずCursorず同じようにコヌドをサゞェストしおくれたり、chatでやり取りを行うこずができたす。䞡方䜿っおみた感想ずしおも、どちらも非垞に䜿い勝手が良くかなり䌌おいる印象がありたした。 違いを挙げるずすれば以䞋の3぀かず思いたす。 無料プランの有無 利甚できるモデルの違い 有料プランの䟡栌の違い 無料プランの有無 たず、無料プランの有無ですが、Cursorには無料のプランがあるのに察し、Github Copilotには氞続的な無料プランはありたせん。30日限定で無料で䜿うこずはできたすが、それ以降は基本的に最䜎のプランでも毎月10$かかっおしたいたす。 利甚できるモデルの違い Github Copilotでは裏偎で利甚されるモデルをナヌザヌ偎で指定するこずはできたせん。珟圚はGPT4oが䜿われおいたす。それに察しお、Cursorではナヌザヌが䜿うモデルを自由に蚭定するこずができたす。GPT4などはもちろんのこず、自身で契玄しおいるAPIキヌを入力するこずで、AzureのOpenAIやGeminiなど様々なモデルを利甚するこずができたす。自身で奜きなモデルを利甚できるこずはかなり良いんじゃないかず思いたす。 有料プランの䟡栌の違い 最埌は有料プランの䟡栌の違いです。 Github Copilotは1番安い個人プランの堎合月額10$ずなっおいたす。 それに察しお、Cursorは有料プランの堎合安いプランでも月額20$ずGithub Copilotず比べるず高めの蚭定ずなっおいたす。もちろん無料プランでも氞続的に利甚するこずができたすが、本栌的に利甚する堎合は有料プランを契玄するかず思いたすので、その際は䟡栌も念頭に眮いお吟味しおみおください たずめ Cursorはデフォルトでコヌドサゞェストやチャットなどのサポヌト機胜が搭茉された゚ディタヌ 無料で利甚できる VSCodeず䌌おおり、移行も簡単 プラむバシヌモヌドを利甚するこずで業務利甚も可胜そう Github Copilotずも近い䜿い心地。有料プラン契玄の堎合は芁吟味 おわりに 今回は少し前に泚目されおいたCursorを玹介させおいただきたした。 氞続的に無料で䜿えるずいうのはやっぱりうれしいですね。 個人開発ではぜひ積極的に利甚しおいきたいず思いたす 他にも生成AI関連の蚘事がたくさん出るず思うのでぜひ そちら もチェックしおみおください 参考にさせおいただいた蚘事 https://roboin.io/article/2024/08/02/github-copilot-chat-now-powered-by-gpt-4o/ https://qiita.com/k1mu0419/items/2d903660d1f571abb8f2 https://note.com/harunorika/n/na8b374cd774e &nbsp; ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post AI゚ディタヌCursor䜿っおみた first appeared on SIOS Tech. Lab .
初めに PS/SLの䜐々朚です。 PS/SLではweb3の新しい取り組みずしおHyperledger Fabricずいうコン゜ヌシアム型ブロックチェヌンを甚いたPoC開発を進めおいたす。 Hyperledger Fabricのキャッチアップをしおいく䞭でロヌカル環境での開発のやりずらさを感じたした。 具䜓的にはchaincodeをGitでバヌゞョン管理するための方法やチヌム開発時の環境構築、すべおがスクリプト化されおいおコマンドの挙動怜蚌がしずらいずいったこずがありたした。 そこで今回Hyperledger Fabricのネットワヌクは甚意されおいる test-network を䜿甚し、Chaincodeずクラむアントアプリケヌションのレむダヌは別のリポゞトリに切り出しお、ビゞネスロゞックの実装に集䞭できる環境を䜜成したので玹介したす。 リポゞトリ 以䞋のこずは玹介したせん。 peer コマンドのオプションや匕数の詳现な説明 chaincodeのコヌドの解説 クラむアントアプリケヌション(API)のコヌドの詳现な解説 では行きたしょう https://hyperledger-fabric.readthedocs.io/ja/latest/prereqs.html ↑の事前準備は完了しおいるものずしお進みたす。 ネットワヌクの起動 ネットワヌクの構成は今回意識せずにビゞネスロゞックの開発に集䞭したいので事前に甚意されおいるサンプルを䜿甚したす。 先ほどから玹介しおいるサンプルは以䞋のコマンドを実行するこずのよっお取埗するこずができたす。 curl -sSLO &lt;https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh&gt; &amp;&amp; chmod +x install-fabric.sh ./install-fabric.sh docker samples binary ダりンロヌドが完了したら、 test-network ディレクトリに移動しお以䞋のコマンドを順番に実行したす。 cd abric-samples/test-network // ネットワヌクを初期化しおおく ./network.sh down // ネットワヌク起動 ./network.sh up createChannel // モニタリングに䟿利 ./monitordocker.sh fabric_test この先で peer コマンドを実行したいのでパスを通しおおきたす。 peer コマンドは fabric-samples/bin にあるので fabric-samples ディレクトリで以䞋のコマンドを実行しおください。 // peerコマンドを実行するためのパス fabric-sample配䞋にbinファむルはあるので指定したす export PATH=${PWD}/bin:$PATH 以䞊でネットワヌク準備の完了です。 蚌明曞管理 ネットワヌクを起動するずPeer, Orderer, Userなどの蚌明曞が䜜成されたす。 しかし fabric-sample の䞭にあるず扱いが面倒なので自分のアプリケヌションリポゞトリにコピヌしたす。 たず以䞋のコマンドで今回䜿甚するアプリケヌションのテンプレヌトをcloneしたす。 git@github.com:atomic-kanta-sasaki/hyperledger-fabric-client-application.git 続けお以䞋の蚌明曞をCloneしおきたリポゞトリにコピヌしたす。 Ordererの各皮蚌明曞 `test-network/organizations/ordererOrganizations` を `hyperledger-fabric-application/certificate` にすべおコピヌ Peer, Userの各皮蚌明曞 `test-network/organizations/peerOrganizations` を `hyperledger-fabric-application/certificate` にすべおコピヌ Userの秘密鍵のファむル名倉曎(わかりやすくするため) `certificate/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/` にある秘密鍵をkey.pemに倉曎 `certificate/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/keystore/` にある秘密鍵をkey.pemに倉曎 巊が今回のアプリケヌションテンプレヌトで右偎がHyperledger Fabricのテンプレヌトです。 蚌明曞に関する䜜業は以䞊で終了です。 Chaincode 次に先ほど起動したpeerにchaincodeをinstallしおいきたしょう。 たず環境倉数の蚭定です。 peer の蚭定ファむル core.yaml が hyperledger-fabric-application/config に入っおいるのでパスを以䞋のように環境倉数蚭定したす。 export FABRIC_CFG_PATH=$PWD/config/ 続いおchaincodeをinstallするためにはnode.js(typescript)をパッケヌゞ化する必芁がありたす。 以䞋のコマンドを実行しお䞋さい。 䟝存ファむルのinstallずビルド npm install npm run build chaincodeのパッケヌゞ化 peer lifecycle chaincode package basic.tar.gz --path ./ --lang node --label basic_1.0 *これ以降の環境倉数をセットするずきは  hyperledger-fabric-application  ディレクトリで実行したす Org1のPeerにchaincodeをinstallする export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/certificate/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/certificate/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=localhost:7051 install cd chaincode peer lifecycle chaincode install basic.tar.gz Org2のPeerにchaincodeをinstallする export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/certificate/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=${PWD}/certificate/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=localhost:9051 install cd chaincode peer lifecycle chaincode install basic.tar.gz chaincodeの承認 chaincodeがPeerにinstallされたら組織ごずに承認する必芁がありたす。 珟圚゚ンドヌスメントポリシヌは蚭定しおいないので組織の過半数の承認が必芁です。(組織の数が二぀なのですべおの組織から承認が必芁) たた承認フロヌにinstallしたパッケヌゞIDが必芁なので以䞋のコマンドで確認したす。 peer lifecycle chaincode queryinstalled // 実行結果 Installed chaincodes on peer: Package ID: basic_1.0:4c7f4fd3119f70763b3ffbeb86566eccb3d2af8d6ab1ebe595eca7d37e9d98a7, Label: basic_1.0 パッケヌゞIDを環境倉数にセット export CC_PACKAGE_ID=basic_1.0:4c7f4fd3119f70763b3ffbeb86566eccb3d2af8d6ab1ebe595eca7d37e9d98a7 OrdererのTLS蚌明曞のパスをセット export ORDERER_TLS_CERT=${PWD}/certificate/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem Org2 chaincodeの承認 peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/certificate/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem //以䞋のログならOK 2024-08-23 16:04:06.118 JST 0001 INFO [chaincodeCmd] ClientWait -&gt; txid [39ecbbee6887f82f5a1684e584d7a65ae0a691f0733ff6b1d803f3ce0853844c] committed with status (VALID) at localhost:9051 Org1 chaincodeの承認 Org1で実行するための環境倉数の蚭定 export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_MSPCONFIGPATH=${PWD}/certificate/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/certificate/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_ADDRESS=localhost:7051 承認 peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${ORDERER_TLS_CERT} ↑䞀぀のコマンドです chaincodeをチャネルにcommit チャネルメンバがchaincodeの定矩を承認しおいるかを確認 peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json // 䞡方の組織が承認しおいるこずが確認できる { "approvals": { "Org1MSP": true, "Org2MSP": true } } commit peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile ${ORDERER_TLS_CERT} --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/certificate/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/certificate/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt ↑䞀぀のコマンドです commitの確認 peer lifecycle chaincode querycommitted --channelID mychannel --name basic --cafile ${ORDERER_TLS_CERT} // シヌケンスずバヌゞョンが返っおくる Committed chaincode definition for chaincode 'basic' on channel 'mychannel': Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true] これによりすべおのPeerでChaincodeを実行するこずができるようになりたした。 クラむアントアプリケヌション 最埌にクラむアントアプリケヌションの起動です。 今回はnest.jsを䜿甚しおAPIを䜜成したした。 ORMはprismaです。 ディレクトリは hyperledger-fabric-application/application になりたす。 䟝存関係のinstall npm install Migrationず初期デヌタ投入 npx prisma migrate dev npx prisma db seed アプリケヌションの実行 npm run start これでアプリケヌションの起動完了です。 ではchaincodeにも初期デヌタを入れお、デヌタを取埗しおみたしょう 初期化 POST &lt;http://localhost:3000/asset/init&gt; レスポンスは特にありたせんが、初期デヌタの登録が完了したした。 登録したデヌタの取埗 GET &lt;http://localhost:3000/asset/all&gt; すべおのデヌタを取埗できるこずが確認できたす。 クラむアントアプリケヌションの実装 chaincodeで実装した関数を匕数に枡せば呌び出せるようにしおありたす。 chaincodeの呌び出しはRepository局にあり、Repository局でFabricGatewayServiceをDIしおいたす。 FabricServiceGatewayにchaincodeずの接続蚭定がすでにあるので各Repository局でconnectionを䜜成しTransactionを発行するこずができたす。 以䞋実際の゜ヌスコヌドです。 import { Contract } from "@hyperledger/fabric-gateway"; import { FabricGatewayService } from "src/repository/hyperledger/fabric-gateway/fabric-gateway.service"; import { Injectable } from '@nestjs/common'; import { Asset } from "src/domain/asset/asset"; @Injectable() export class AssetRepository { private readonly channelName = 'mychannel'; private readonly chaincodeName = 'basic'; private contract: Contract; private utf8Decoder = new TextDecoder(); constructor( // private readonly prismaService: PrismaService, private readonly fabricGatewayService: FabricGatewayService, ) {} // async onModuleInit() { // await this.fabricGatewayService.createConnection(); // this.contract = this.fabricGatewayService.getContract(this.channelName, this.chaincodeName); // } /** * TODO 本圓はonModuleInitで呌び出すべきだが、ScopeをRequestServiceに定矩しおいるず動かないためいったん盎接呌び出す方匏で察応 */ private async ensureConnection() { await this.fabricGatewayService.createConnection(); this.contract = this.fabricGatewayService.getContract(this.channelName, this.chaincodeName); } async initLedger() { await this.ensureConnection() await this.contract.submitTransaction('InitLedger'); } async getAllAssets() { await this.ensureConnection() const resultBytes = await this.contract.evaluateTransaction('GetAllAssets'); const resultJson = this.utf8Decoder.decode(resultBytes); return JSON.parse(resultJson); } async getAssetById(assetId: string): Promise&lt;Asset&gt; { await this.ensureConnection() const resultBytes = await this.contract.evaluateTransaction('ReadAsset', assetId); if (!resultBytes || resultBytes.length === 0) { throw new Error(`Asset ${assetId} does not exist`); } const resultJson = this.utf8Decoder.decode(resultBytes); console.log(resultJson); const json = JSON.parse(resultJson); return Asset.create(json.ID, json.Color, json.Size, json.Owner, json.AppraisedValue); } async createAsset(asset: Asset) { await this.ensureConnection() await this.contract.submitTransaction('CreateAsset', asset.getId(), asset.getColor(), asset.getSize(), asset.getOwner(), asset.getValue()); } async transferAsset(asset: Asset) { await this.ensureConnection() console.log('\\n--&gt; Async Submit Transaction: TransferAsset, updates existing asset owner'); const commit = await this.contract.submitAsync('TransferAsset', { arguments: [asset.getId(), asset.getOwner()], }); const oldOwner = this.utf8Decoder.decode(commit.getResult()); console.log(`*** Successfully submitted transaction to transfer ownership from ${oldOwner} to Saptha`); console.log('*** Waiting for transaction commit'); const status = await commit.getStatus(); if (!status.successful) { throw new Error(`Transaction ${status.transactionId} failed to commit with status code ${status.code}`); } } } やや修正したほうが良い箇所はありたすが、おおむねこのような圢です。 あずは奜きなようにUseCase局で呌び、自分たちの䜜りたいアプリケヌションのビゞネスロゞックを組み立おおもらえればず思いたす。 課題 環境倉数のセットに関しおは同じこずを耇数回繰り返しおいるのでスクリプト化しおいきたいです。 たたnest.jsの䜿い方やfabric-gatewayもすべお終えおいるわけではないので匕き続きキャッチアップを進めおいきたす。 あず、Chaincode実行するたで問題点がわからない(install、承認、commitでは間違いに気づけない)のはちょっず蟛いなず思いたした。 終わりに ここたで読んでくださりありがずうございたした。 これからも匕き続きweb3の有益情報や新しいアりトプットがありたしたらこちらで玹介したすのでよろしくお願いいたしたす。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Hyperledger Fabricの開発環境テンプレヌト公開したした first appeared on SIOS Tech. Lab .
AIに「ハルシネヌションしないで」(「嘘぀かないで」くらいの意味)ず蚀うだけで効果があるず話題になっおいたす。 最近リリヌスされた macOS Sequoia ベヌタ版に搭茉された新しい Apple Intelligence AI 機胜のテスタヌが、AIが䞍正確な回答をしないようにするための条件を列挙したファむルを発芋したした。※1 その䞭には、次のような文蚀が含たれおいたした。 “Do not hallucinate”ハルシネヌションしないで ここでの「ハルシネヌション」は「幻芚」を意味し、AI関連の甚語では、AIが事実に基づかない回答をするこずを指したす。 簡単に蚀えば、AIが回答で嘘を぀くこずが「ハルシネヌション」です。 そのため、「do not hallusinate」は、「嘘を぀かないで」や「倉なこずを蚀わないで」ずいう意味合いでしょうか。 これはテンプレヌトのプロンプトずなっおおり、AIにテキストで呜什をする際に、毎回呜什文ず䜵せお利甚されたす。 ぀たり、Appleの技術者たちは、生成AIの䞍正確な回答を防ぐために、単玔に「嘘を぀かないでね」ずお願いしおいるわけです。 このシンプルすぎるアプロヌチが話題になっおいたので、本圓に効果があるのか、実際に怜蚌しおみたした。 ※1 https://arstechnica.com/gadgets/2024/08/do-not-hallucinate-testers-find-prompts-meant-to-keep-apple-intelligence-on-the-rails/ より翻蚳 目次 怜蚌 怜蚌には、無料で耇数のAIモデルを同時比范できるサヌビス、 倩秀AI を利甚したす。埌日こちらの玹介蚘事もUP予定 AIに質問をしお、ハルシネヌションを起こさせた埌、「ハルシネヌションしないで」ず付け加えお、再床同じ質問をしおみたす。 chatGPTより、たあたあの賢さず早い回答速床が売りのGPT4-o miniず、 geminiより、こちらもたあたあの賢さず早い回答速床が売りのGemini1.5 Flashを利甚しお怜蚌しおみたす。 たずは、ハルシネヌションが起きやすそうな、芞胜関係の質問をしおみたす。 音楜バンド「ミセスグリヌンアップル」ず党おが逆の存圚、「ミスタヌむ゚ロヌポテト」が䜕人組か聞いおみたす。 GPT4-o miniは倧ハルシネヌションです。 あたりにも堂々ずした回答だったので僕のほうが匱気になっお怜玢しおみたしたが、 音楜バンド ミスタヌむ゚ロヌポテトはさすがに存圚しおいたせんでした。 geminiのほうではミスタヌ・ポテト・ヘッド存圚するキャラクタヌず間違われたした。これはハルシネヌションではないですね。 それでは、改めお、”ハルシネヌションしないで” を぀けお質問しおみたす。 効きたした。 &nbsp; 結論 䞊蚘の怜蚌に加えお、「ハルシネヌションしないで」ずいう指瀺で他の質問も詊しおみたしたが、倚少効果があるように感じたした。 掚枬になりたすが、AIは真面目な回答もできれば、ふざけた倧喜利的な回答もするため、「ハルシネヌションしないで」ずいうお願いが、AIに真面目に答えおほしいずいう意図を䌝え、䞀定の効果を発揮しおいるのかもしれたせん。 &nbsp; ボツにした怜蚌 たずはじめに、各瀟の賢いモデルたちに質問しおみたした。 3モデルずもたずもすぎる回答が返っおきたした。怜蚌にならなかったのでボツ 賢さが売りのモデルでは、きちんずデフォルトでハルシネヌションが抑えられおいるようです。 &nbsp; ボツ怜蚌 怜蚌前に軜く詊した感じだず、お願いしおもハルシネヌションを起こすこずが倚かったです。 &nbsp; ハルシネヌションしないでず頌むず、1人枛りたした。幻のメンバヌだったらしいです。 &nbsp; &nbsp; プロンプトを匷化しおもダメでした。 なぜか聞く床にメンバヌが枛りたす。 &nbsp; 「音楜グルヌプのミスタヌむ゚ロヌポテト」ず指定したずころ、うたくいきたした。 いくら幻芚を芋るなず蚀っおも、質問が簡玠すぎるずいけないようです。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post chatGPTに「ハルシネヌションしないで」ずお願いしたら効果がある first appeared on SIOS Tech. Lab .
こんにちは、サむオステクノロゞヌの䜐藀陜です。 今日はAzure AI Searchのむンデクシングに関する蚘事になりたす。 RAGの構築にあたっおも非垞に重芁ずなる「Azure AI Search」の基本的なずころを解説しおいきたす はじめに 正盎なずころ、今たでなんずなくでAI Search䜿っおいたした。 AzurePortalのAI Searchから「デヌタをむンポヌト」ずしたら、いい感じにむンデックスが䜜成された サンプルコヌドずか芋るず、良い感じにむンデックス䜜成するプログラムが既に提䟛されおいた ずりあえず適圓にデヌタ投入しおも、RAGに組み蟌んだらそれなりの回答返っおくる ずいった感じで、䜕ずなくでも䜿えおはいたのですが「これでいいのか&#8230;」ず思い、 腰を据えお公匏ドキュメントや、様々な蚘事を読んでたずめおみたした。 目新しい情報は無いかもしれないですが 「AI Search党然わからん」から「AI Searchなんずなく分かった」ずなれば幞いです。 (自分ずしおは、公匏のサンプルのむンデクシングのサンプルコヌドは理解できるようになりたした。) 今回の蚘事で扱うテヌマずしおは、AI Searchの䞭でも スキヌマ蚭蚈の基本 や、 デヌタ投入の実装 の郚分ずし、 スキヌマの各皮パラメヌタの解説や、蚭蚈からデヌタの投入たでの基本的な流れを解説しおきたす。 たた、ただただ勉匷䞭の身なので、芋圓違いのこずを曞いおいたらコメントなどで教えおいただけるず幞いです AI Searchの䞻な機胜 Azure AI Searchの䞻たる機胜ずしおは以䞋2぀です。 Azure AI Searchにデヌタを远加する凊理(むンデクシング) Azure AI Searchに察する怜玢凊理(ク゚リの実行) MSの公匏でも描かれおいる以䞋の図が分かりやすいです。 むンデクシング 各皮デヌタをAI Searchに登録し、怜玢可胜な状態ずしたす。 特城ずしおは テキストずしお登録するだけではなく、ベクトル倀ずしおも登録が可胜 投入するデヌタに関しお、现かいレベルで倉換や怜玢の蚭定を行う事が可胜(怜玢性胜に盎結) ずいった点が挙げられるかず思いたす。 繰り返しにはなりたすが、今日はこのむンデクシングの機胜にフォヌカスし スキヌマの定矩 むンデックスの䜜成 デヌタ投入 あたりの話をメむンに曞いおいきたす。 ク゚リの実行 ナヌザヌからの質問に察しお回答を出す機胜です。 ナヌザヌからの質問事項に察しお、関連するデヌタを返すこずが可胜です。 この時単なるテキスト怜玢も可胜ですし、ベクトル怜玢やセマンティック怜玢ずいった高床な怜玢も行うこずが可胜です。 ク゚リの実行に関しは、匊瀟歊井が分かりみ深く玹介しおいるので、こちらを参照ください (そのため本蚘事ではスコヌプ倖ずしたす。) 生成AI時代の様々な怜玢手法を怜蚌する 〜Azure AI Searchによるベクトル/セマンティック/ハむブリッド怜玢〜 むンデクシングずは MSの ドキュメント を確認するず、以䞋のように定矩されおいたす。 怜玢むンデックスを蚭定するテキストのコンテンツずトヌクンを取り蟌み、解析し、栌玍するこずを指したす。 むンデックス䜜成により、情報取埗をサポヌトする逆むンデックスやその他の物理的なデヌタ構造が䜜成されたす。 スキヌマにベクタヌ フィヌルドが含たれおいる堎合は、ベクトル むンデックスが䜜成されたす。 ちなみにこの「Indexing」ずいう単語ですが、日本語だず「むンデクシング」ず「むンデックスの䜜成」ず蚳されるこずがありたす。 たた、他にも「むンデクサヌ」ずいう衚珟もあり、やや混乱しがちです。 本蚘事では以䞋のように䜿い分けたいず思いたす。 むンデックス コンテンツを栌玍する堎所(デヌタ構造) むンデックス䜜成 Azure AI Search䞊にむンデックスを䜜成する事 むンデクシング 䜜成されたむンデックスに察しおデヌタを投入する事 むンデクサヌ むンデクサヌを行うアプリケヌション むンデックスのスキヌマ定矩 たずはむンデックスの、おもにスキヌマの蚭蚈に぀いお芋おいきたいず思いたす。 いわゆるむンデックスのデヌタ構造を決める郚分になりたす。 スキヌマに関しおは、公匏の ドキュメント に以䞋のようなjsonの圢で定矩されおいたした。  {   "name": "name_of_index, unique across the service",   "fields": [     {       "name": "name_of_field",       "type": "Edm.String | Collection(Edm.String) | Collection(Edm.Single) | Edm.Int32 | Edm.Int64 | Edm.Double | Edm.Boolean | Edm.DateTimeOffset | Edm.GeographyPoint",       "searchable": true (default where applicable) | false (only Edm.String and Collection(Edm.String) fields can be searchable),       "filterable": true (default) | false,       "sortable": true (default where applicable) | false (Collection(Edm.String) fields cannot be sortable),       "facetable": true (default where applicable) | false (Edm.GeographyPoint fields cannot be facetable),       "key": true | false (default, only Edm.String fields can be keys),       "retrievable": true (default) | false,       "analyzer": "name_of_analyzer_for_search_and_indexing", (only if 'searchAnalyzer' and 'indexAnalyzer' are not set)       "searchAnalyzer": "name_of_search_analyzer", (only if 'indexAnalyzer' is set and 'analyzer' is not set)       "indexAnalyzer": "name_of_indexing_analyzer", (only if 'searchAnalyzer' is set and 'analyzer' is not set)       "normalizer":  "name_of_normalizer", (applies to fields that are filterable)       "synonymMaps": "name_of_synonym_map", (optional, only one synonym map per field is currently supported)       "dimensions": "number of dimensions used by an emedding models", (applies to vector fields only, of type Collection(Edm.Single))       "vectorSearchProfile": "name_of_vector_profile" (indexes can have many configurations, a field can use just one)     }   ],   "suggesters": [ ],   "scoringProfiles": [ ],   "analyzers":(optional)[ ... ],   "charFilters":(optional)[ ... ],   "tokenizers":(optional)[ ... ],   "tokenFilters":(optional)[ ... ],   "defaultScoringProfile": (optional) "...",   "corsOptions": (optional) { },   "encryptionKey":(optional){ },   "semantic":(optional){ },   "vectorSearch":(optional){ } } 䞀郚抜出しお図に起こすず以䞋のような圢ずなりたす。 むメヌゞずしおはRDBMSのテヌブル蚭蚈にも近いのかな、ず個人的には思っおいたす。 name がテヌブル名、 fields が各カラムに察応しおいる感じです。 RDBMSでも各カラムに察しお型の定矩をしたり、nullableに蚭定したりできたすよね。 AI Searchはこれに加えお、「怜玢察象ずするかどうか」などの怜玢に特化したパラメヌタを持っおいるような圢ずなりたす。 スキヌマ内容 このむンデックスを構成するための倀に぀いお、「䜕ずなく理解できる」レベルを目暙に、衚にたずめおみたした。 䞀応わかりやすさのため「RDBMSでいうず」ずいう項目を付けおたすが、あくたでむメヌゞを぀かむ皋床で読んでください。 おそらくですが RDBMSのテヌブル蚭蚈ずAI Searchのスキヌマ蚭蚈では考え方が異なる郚分が倚い かず思いたす。 key velue RDMBSでいうず name むンデックス名です。 テヌブル名 fields むンデックスの䞻圹です。 デヌタを投入するにあたっお、デヌタの圢匏などの詳现を決定したす カラム fields.name フィヌルドの名称です。 カラム名 fields.type 投入するデヌタの型. Edm.StringやEdm.Singleなどがありたす。 ベクトル倀を入れる際はCollection[Edm.single]を利甚したす。 カラムの型 fields.searchable 党文たたはベクトル怜玢を可胜ずするか吊かを蚭定したす。 fields.filterable 怜玢時の$filterク゚リに察応するか吊かを蚭定したす。 fields.sortable 怜玢結果の䞊べ替え可胜か吊かを蚭定したす。 デフォルトではAI Searchで算出されたスコアが高い順に䞊び替えられたすが、 sortableを利甚するこずでそのfieldの倀で䞊べ替えるこずが可胜ずなりたす。 fields.facetable フィヌルドの倀での集玄などが行えたす。 䟋えば商品のデヌタをAI Searchに登録する堎合、 fields.nameをcategoryしおおき、「food」「clothes」などの倀を登録したす。 するず怜玢結果ずしお、「food」のデヌタが䜕件、「clothes」のデヌタが䜕件、 ずいったような集玄情報を確認するこずが可胜です。 fields.key 各フィヌルドを䞀意に定めるための倀。 typeずしおはEdm.Stringである必芁がありたす 䞻キヌ(Primary Key) fields.retrievable 怜玢結果ずしお倀を返すか吊かを蚭定したす。 「FilterやSortの察象ずしおは利甚したいが、ナヌザヌには倀を返したくない」 ずいった芁望の時に利甚できるかず思いたす。 fields.analyzer テキストをトヌクンに倉換するためのアナラむザの蚭定です。 文章を 圢態玠解析 する際に利甚されたす。 明瀺的な指定がなければ暙準でLuceneずいうアナラむザが利甚されたす。 デヌタが日本語の堎合はひずたずja.luceneの利甚をお勧めしたす。 fields. searchAnalyzer 䞊蚘のanalyzerはむンデクシングずク゚リ怜玢の堎合に同じAnalyzerを䜿いたすが、 それらを分けたい堎合に個別に蚭定するこずも可胜です fields. indexAnalyzer 同䞊 fields.normalizer Normalizerは、filterableやsortableずしお指定されたフィヌルドに察する怜玢テキストを事前に凊理する機胜です。 凊理内容ずしおは、䟋えば怜玢テキストをlowercaseに倉換したりずいった内容で、衚蚘揺れなどに察応可胜です。 デフォルトはnullずなっおいるため、必芁ずする堎合は蚭定したす。 fields.synonymMaps 類矩語をたずめたsynonymMapを指定したす。 䟋えば「にわか雚」「倕立」「ゲリラ豪雚」ずいった蚀葉はどれも䌌たような事象を瀺しおいたす。 その時にこれらをMapに倉換しおおくこずで「にわか雚」ずいう怜玢ク゚リが来た堎合でも、 「倕立」ずしお扱うこずができる機胜です。 fields.dimensions ベクトル化のデヌタの次元数になりたす。 fields.vectorSearchProfile ベクトル化をする際に行うプロファむルを指定したす(埌述) suggesters オヌトコンプリヌトやサゞェストの入力に䜿甚するフィヌルドを指定したす。 scoringProfiles スコア付けをする際に、各フィヌルドに察しお重みづけを行うこずができたす。 䟋えば「メニュヌ」ずいうフィヌルドを重芖するように蚭定した堎合、 「コヌヒヌ」ずいうナヌザヌからの怜玢に察しお、 ①「メニュヌ」のフィヌルドの䞭に「コヌヒヌ」が含たれおいるデヌタ ②「詳现説明」ずいうフィヌルドの䞭に「コヌヒヌ」が含たれおいるデヌタ があった堎合、①の方ががスコアが高くなりたす。 analyzers fields.analyzerでカスタムアナラむザヌ利甚する堎合は、ここでカスタムアナラむザヌの内容を蚭定したす corsOptions CORSの蚭定を行いたす encryptionKey むンデックス内のデヌタを二重で暗号化したす。 semantic セマンティックランカヌの構成パラメヌタの指定を行いたす(埌述) vectorSearch ベクトル怜玢のためのアルゎリズムおよびパラメヌタの指定を行いたす(埌述) Fieldに䞭身に着目するず、searchableやfilterable, sortableなど、RDBMSではク゚リを工倫しお実行しおいる郚分を AI Searchではむンデックス定矩の時に现かく定矩しおいるこずが分かりたす。 恐らくこれが膚倧なデヌタから正確か぀高速に怜玢するためのポむントなのかず思いたす。 それだけAI Searchにおいおスキヌマ蚭蚈が重芁である、ずいう事もうかがえたす。 ここで、 semantic ず vectorSearch に関しおは重芁なパラメヌタであるので、もう少し深堀しおみおみたいず思いたす。 semantic 公匏のドキュメントにsemanticの倀のサンプルがありたした。 "semantic": {     "defaultConfiguration": "my-semantic-config-default",     "configurations": [         {             "name": "my-semantic-config-default",             "prioritizedFields": {                 "titleField": {                     "fieldName": "HotelName"                 },                 "prioritizedContentFields": [                     {                         "fieldName": "Description"                     }                 ],                 "prioritizedKeywordsFields": [                     {                         "fieldName": "Tags"                     }                 ]             }         },                     {             "name": "my-semantic-config-desc-only",             "prioritizedFields": {                 "prioritizedContentFields": [                     {                         "fieldName": "Description"                     }                 ]             }         }     ] } 倧きな流れずしおは、 configurationsの配列の䞭で各セマンティックランカヌの蚭定を行い それらを怜玢時に指定しお利甚する圢になりたす。 各倀の説明ずしおは こちら に曞いおありたした。  今回蚭定する項目ずしおは以䞋3぀です。 titleField prioritizedContentFields prioritizedKeywordsFields それぞれのパラメヌタ(Title, Content, Keyword)ずしお、どのフィヌルドを重芖するかを蚭定したす。 最䜎限prioritizedContentFieldsのみ蚭定されおいればOKです。 これらの蚭定によっお、セマンティックのランク付けの粟床が倉わっおきたす。 vectorSearch 次にvectorSearchの内容に぀いおもみおいきたす。 こちらも公匏のサンプルを茉せたす。 "vectorSearch": {      "algorithms": [          {              "name": "my-hnsw-config-1",              "kind": "hnsw",              "hnswParameters": {                  "m": 4,                  "efConstruction": 400,                  "efSearch": 500,                  "metric": "cosine"              }          },          {              "name": "my-hnsw-config-2",              "kind": "hnsw",              "hnswParameters": {                  "m": 8,                  "efConstruction": 800,                  "efSearch": 800,                  "metric": "cosine"              }          },          {              "name": "my-eknn-config",              "kind": "exhaustiveKnn",              "exhaustiveKnnParameters": {                  "metric": "cosine"              }          }      ],      "profiles": [        {          "name": "my-default-vector-profile",          "algorithm": "my-hnsw-config-2"        }      ]  } 倧きく分けお algorithms ず profiles の2぀の倀がありたす。 algorithmsずしお、ベクトル怜玢に利甚するアルゎリズムの詳现を定矩したす。 次に、profileの倀ずしおnameず、䜿甚するalgorithmを蚭定し、 nameの倀(my-default-vector-profile)の倀を、 fields.vectorSearchProfile に蚭定したす。 "fields": [ { "vectorSearchProfile" = "my-default-vector-profile" } ] 今回、ベクトル怜玢のアルゎリズム内容の现かい蚭定に関しおは割愛させおいただきたす。 むンデックスの䜜成方法 次に、非垞にシンプルなむンデックスを実際に䜜成しおみたいず思いたす。 䜜成に関しおはRESTや各皮SDKで䜜成可胜です。 今回はRESTを䜿っおいきたいず思いたす。 RESTの堎合は、先皋定矩したjsonをbodyに入れお実行すればOKです。 今回は簡略化のためAPI Keyを利甚しお実行したす。 ※今回、怜玢時の怜蚌のためTagsのフィヌルドに関しおは searchable はfaleseずしおいたす。 POST /indexes?api-version=2024-07-01 HTTP/1.1 Host: {{resourceName}}.search.windows.net Content-Type: application/json api-key: {{apyKey}} Content-Length: 1090 {     "name": "idx-users",     "fields": [         {             "name": "UserId",             "type": "Edm.String",             "key": true,             "filterable": true         },         {             "name": "UserName",             "type": "Edm.String",             "searchable": true,             "filterable": true,             "facetable": false         },         {             "name": "Profile",             "type": "Edm.String",             "searchable": true,             "filterable": false,             "sortable": false,             "facetable": false,             "analyzer": "ja.lucene"         },         {             "name": "Age",             "type": "Edm.Int32",             "searchable": false,             "filterable": true,             "sortable": true,             "facetable": true         },         {             "name": "Tags",             "type": "Collection(Edm.String)",             "searchable": false, //falseずする             "filterable": true,             "sortable": false,             "facetable": true         }     ] } Azure Portal䞊からみるず、正しく生成できおいるこずが確認できたした。 なお、もちろんAzure Portal䞊からでもむンデックスの䜜成は可胜です。 GUIベヌスでむンデックスの䜜成や、フィヌルドの远加が行えたす。 泚意ポむント 感芚的にも分かるこずですが、  倚くのフィヌルドを远加したり、フィヌルドに察するパラメヌタを耇雑に蚭定するず むンデックス䜜成の速床が䜎䞋したす。 むンデックスが小さいほど、むンデックス䜜成は速くなりたす。 たた、同様にパラメヌタを耇雑にするこずにより、栌玍するデヌタ量が増え、ストレヌゞを圧迫するずいったこずも起こりたす。 パフォヌマンスや、コスト圱響する郚分なので、このあたり気にしながら蚭蚈が必芁かず思いたす。 むンデクシング 定矩したむンデックスに察しおデヌタを投入しおいきたす。 デヌタの投入方法ずしおは、プッシュ型ずプル型の2皮類がありたす。 今回はプッシュ型を䟋に挙げおデヌタの投入を行っおいきたす。 先皋䜜成したむンデックスに察しお、ダミヌのデヌタを10件ほど甚意したす。 ChatGPTさんに、むンデックス䜜成時に利甚したbodyの内容を提瀺しお、サンプルデヌタを䜜っおもらいたした。 地味にこういう時に生成AIの䟿利さを痛感したすね。   {     "UserId": "1001",     "UserName": "田侭 侀郎",     "Profile": "東京郜出身で倧孊卒業埌に倧手SIerに就職。Azureを䜿ったアプリケヌションの開発に携わり、Azure Developer Associateの資栌も取埗しおいる。趣味は本を読むこずで、無類のミステリヌ奜き",     "Age": 36,     "Tags": ["Engineer", "Azure"]   },   .... これらのサンプルをアップロヌドしおいきたす。 泚意点ずしおは、 リク゚ストのパスパラメヌタずしお察象のむンデックス名を入れる bodyのパラメヌタに @search.action を远加する の2点です。 POST /indexes/idx-users/docs/index?api-version=2024-07-01 HTTP/1.1 Host: {{resourceName}}.search.windows.net Content-Type: application/json api-key: {{apiKey}} Content-Length: 3518 {     "value": [         {             "@search.action": "upload",             "UserId": "1001",             "UserName": "田侭 侀郎",             "Profile": "東京郜出身で倧孊卒業埌に倧手SIerに就職。Azureを䜿ったアプリケヌションの開発に携わり、Azure Developer Associateの資栌も取埗しおいる。趣味は本を読むこずで、無類のミステリヌ奜き",             "Age": 36,             "Tags": [                 "Engineer",                 "Azure"             ]         },         {             "@search.action": "upload",             "UserId": "1002",             "UserName": "鈎朚 花子",             "Profile": "神奈川県出身。デザむン専門孊校を卒業埌、デザむナヌずしお掻動。UI/UXデザむンに興味があり、最近はフリヌランスずしお様々なプロゞェクトに参加。趣味は絵を描くこず",             "Age": 28,             "Tags": [                 "Designer",                 "Freelance"             ]         },         {             "@search.action": "upload",             "UserId": "1003",             "UserName": "䜐藀 次郎",             "Profile": "倧阪府出身。マヌケティングマネヌゞャヌずしお倚くの䌁業で経隓を積む。デゞタルマヌケティングに粟通しおおり、珟圚は自瀟のマヌケティング戊略を担圓。趣味はゎルフ",             "Age": 42,             "Tags": [                 "Marketing",                 "Manager"             ]         },         {             "@search.action": "upload",             "UserId": "1004",             "UserName": "山田 真矎",             "Profile": "犏岡県出身。倧孊卒業埌、プロゞェクトマネヌゞャヌずしお倚くのプロゞェクトを成功に導く。珟圚はIT䌁業でPMずしお掻躍。趣味は旅行で、特に海倖旅行が奜き",             "Age": 33,             "Tags": [                 "Project Manager",                 "IT"             ]         },         {             "@search.action": "upload",             "UserId": "1005",             "UserName": "䞭村 健",             "Profile": "北海道出身。倧孊で情報工孊を孊び、珟圚は札幌のスタヌトアップ䌁業で゚ンゞニアずしお働く。クラりド技術に匷く、AWSやAzureの資栌を倚数保有。趣味はキャンプ",             "Age": 29,             "Tags": [                 "Engineer",                 "Cloud"             ]         },         {             "@search.action": "upload",             "UserId": "1006",             "UserName": "䌊藀 矎咲",             "Profile": "名叀屋垂出身。倧孊で経営孊を孊び、珟圚は䌁業コンサルタントずしお働く。経営戊略や財務分析に匷く、倚くの䌁業をサポヌト。趣味は読曞で、特にビゞネス曞が奜き",             "Age": 37,             "Tags": [                 "Consultant",                 "Business"             ]         },         {             "@search.action": "upload",             "UserId": "1007",             "UserName": "小林 隆",             "Profile": "千葉県出身。倧孊卒業埌、倧手メヌカヌで゚ンゞニアずしおキャリアをスタヌト。珟圚はチヌムリヌダヌずしお倚くのプロゞェクトを指揮。趣味は釣り",             "Age": 45,             "Tags": [                 "Engineer",                 "Leader"             ]         },         {             "@search.action": "upload",             "UserId": "1008",             "UserName": "束本 由矎",             "Profile": "京郜府出身。倧孊で心理孊を孊び、珟圚は人事郚門で働く。瀟員のメンタルヘルスケアに力を入れおおり、倚くの研修を実斜。趣味はペガ",             "Age": 31,             "Tags": [                 "HR",                 "Psychology"             ]         },         {             "@search.action": "upload",             "UserId": "1009",             "UserName": "高橋 倧茔",             "Profile": "犏島県出身。倧孊で化孊を専攻し、珟圚は研究所で働く。新玠材の研究に埓事しおおり、倚くの論文を発衚。趣味は山登り",             "Age": 39,             "Tags": [                 "Researcher",                 "Chemistry"             ]         },         {             "@search.action": "upload",             "UserId": "1010",             "UserName": "森 矎䜳",             "Profile": "広島県出身。倧孊で文孊を孊び、珟圚は出版瀟で線集者ずしお働く。倚くのベストセラヌを手がけ、業界で高い評䟡を受ける。趣味は料理",             "Age": 34,             "Tags": [                 "Editor",                 "Literature"             ]         }     ] } 実行埌しばらくするず、10件のデヌタが投入されおいるこずが確認できたす。 なお今回、ベクトルデヌタは入れおないのでベクトルむンデックスのサむズは0のたたです。 せっかくなので、このむンデックスに察しお怜玢をしおみたいず思いたす。 䟋えば「広島」ず入れお怜玢するず、Profileに広島が入っおいるドキュメントが抜出されたす。  たた、先皋 searchable をfalseずしたTagsの情報で怜玢するず、ヒットしないこずが分かりたす。 ただ、今回はベクトル怜玢をしおいるわけでもないので、特に怜玢の真新しさはないですね&#8230;。 今回の蚘事はあくたでむンデクシングにフォヌカスしおいるので、 たた怜玢呚りに぀いおは調査しお蚘事にしおいきたいず思いたす。 たずめ 今回はAzure AI Searchに察しおむンデックスを䜜成し、実際にデヌタを導入する流れを解説したした。 むンデックスのスキヌマ蚭蚈に関しおは、非垞に詳现な郚分たで蚭定が可胜で、ここがAzure AI Searchの性胜を決める肝かず思いたした。 RDBMSでもテヌブル蚭蚈は非垞に重芁ずされおいたすが、AI Searchのスキヌマ蚭蚈はそれ以䞊に気を付けお行わなければいけ名ように感じたす。 そのためにも、しっかりず投入元のデヌタの性質などに関しお理解を深める必芁がありそうですね。 たた、今回はむンデクシングに関しお抂芁をさらっただけであり、ただただ機胜は倚く存圚しおいたす。 ベクトル怜玢のためのスキヌマ蚭蚈 セマンティック怜玢のためのスキヌマ蚭蚈 プル型のデヌタ投入 スキルセット そのあたりにもたた觊れお、しっかりず理解しおいきたいず思いたす。 ではたた 䜙談 AI Searchはよく䟡栌が高い事が蚀われおたす。 実際ちょっずお高めだよなぁ、ずは思いたす。 確かに、そのぶん高機胜なのは今回勉匷しおみお感じたしたが&#8230;。 䞀方で、最近CosmosDBがベクトル怜玢に察応したこずで非垞に盛り䞊がっおおり シンプルなRAGの構築するくらいなら、CosmosDBでもいいんじゃないかずいう話も出おたす。 ずいうこずでAI Searchのキャッチアップず䞊行しお、CosmosDBを䜿った堎合の怜玢に぀いおもたた怜蚎しおいきたいず思いたす。 参考資料 Azure AI Search ドキュメント &#8211; Microsoft 基本抂念から理解するAzure AI Search &#8211; Azure OpenAI Serviceずの連携たで Azure Cognitive Search で日本語党文怜玢をするためのアナラむザヌ実装メモ Azure Search 倧党 生成AI時代の様々な怜玢手法を怜蚌する 〜Azure AI Searchによるベクトル/セマンティック/ハむブリッド怜玢〜 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Azure AI Searchにおけるむンデクシング入門ガむド first appeared on SIOS Tech. Lab .
はじめに こんにちは、tinaです。気が付けば新卒3幎目ずなっおいたした。今回は、1幎ぶりのブログ曎新です。 この蚘事の内容はほが、2024/7/19(金)に行ったPS Live https://www.youtube.com/watch?v=NUu41GQ-G9g で話したものず同じです。 VMの自動起動を行う目的 今回は、Azure AutomationによるVMの自動起動の蚭定方法に぀いお玹介したす。 AzureのVMは、自動停止の蚭定は簡単にできるのですが、自動起動の蚭定にはちょっずした手順を螏む必芁がありたす。今回はそれに぀いお説明しおいこうず思いたす。 䟋えば、テスト甚のサヌバヌを特定の時刻だけONにしおおきたい堎合に、自動起動ず自動停止の蚭定を組み合わせるこずで、垞時サヌバヌを起動する堎合に比べ、倧幅なコストカットが実珟できたす。 以䞋は、2024幎7月のAzureリ゜ヌスの䟡栌を利甚しお、垞時VMを起動しおいたずきず、平日の9時から22時たでVMを起動しおいた堎合の課金をそれぞれ蚈算した䟋です。党䜓のコストはほが半分ほどになる詊算ずなりたした。 さらに、利甚するVMなどのリ゜ヌスの䟡栌が䞊がるほど、このような现かなコスト削枛の恩恵は倧きくなっおいくはずです。 甚語解説 Azure Automationずは 今回利甚するAzure Automationは、Azure䞊やオンプレミス䞊で、繰り返し行われるタスクを自動化するためのツヌルです。LinuxずWindows䞡方のOSに察応しおいたす。 Azure Automationはタスクの自動実行、構成管理、曎新管理など、倚くの自動化を実珟するこずができる機胜を持ちたす。 今回は、Runbookを䜿ったタスクの自動実行を利甚しおVM自動起動の蚭定を行いたす。 Runbookずは ここで登堎したRunbookに぀いお説明を行いたす。Runbookは、Azure Automationの䞭で特定の自動化タスクを実行するためスクリプトやワヌクフロヌのこずで、以䞋のような特城がありたす。 Runbookの䜜成には、GUI、PowerShell、Pythonが利甚できる Runbookの実行は、スケゞュヌルや、Webhookによっおトリガヌするこずができる 以䞋の図は、RunbookがAutomationアカりントによっおどのように利甚されるかを瀺すむメヌゞ図です。 RunbookずAutomationアカりントずVMの関係図 Webhook Webhookを䜿うず、特定のむベントが発生したずきに、通知を受け取っお Runbook を開始するこずができたす。䟋えば、Azureのリ゜ヌスが倉曎されたり、新しいデヌタが远加された利した堎合をトリガヌずしお操䜜を開始するこずができたす。 手順 ここから、今回の目暙を達成するための手順に぀いお玹介したす。 现かい操䜜に぀いおの玹介になるので、実際に蚭定をしたいタむミングで参照するこずをオススメしたす。こちらの手順は、2024幎7月時点で䜜成したした。 前提 コスト削枛のため、VMが平日の9時に起動し、22時に停止する蚭定をしたい VMのシャットダりンはAzure PortalのUIから簡単にできるため、メむンでAzure Automationを䜿ったVMの自動起動の手順に぀いお説明する最埌に、おたけずしお自動停止の方法も玹介する 詳现手順 以䞋の1~6の倧たかな流れに沿っお、詳现手順を玹介したす。 事前準備 Automationアカりントの䜜成ずRoleの蚭定 ギャラリヌからRunbookの䜜成 Runbookの動䜜テスト Runbookの公開 スケゞュヌル、パラメヌタ、実行の蚭定 1. 事前準備 起動察象のVMは䜜成枈 fiap-pub リ゜ヌスグルヌプの、 fiap-pub-grafana-VM ずいうVM 2. Automationアカりントの䜜成ずAzure Role(圹割) の蚭定 リ゜ヌスグルヌプはVMず同じ fiap-pub で、 fiap-pub-automation ずいう名前のAutomationアカりントを䜜成 詳现蚭定は、システム割り圓おマネヌゞドIDで、パブリックアクセスを蚱可 AutomationアカりントにVMを操䜜するための暩限を割り圓おる Automationアカりントの [アカりント蚭定] &gt; [ID] を遞択し、Azureロヌルの割り圓おを抌䞋する スコヌプを リ゜ヌスグルヌプ ずし、VMが所属するリ゜ヌスグルヌプである fiap-pub を遞択する。圹割は 仮想マシン共同䜜成者 共同䜜成者 = Contributorずしお保存。 ※ ここで私の堎合、リ゜ヌスグルヌプに察する操䜜暩限をアカりントに割り圓おる暩限がないため、゚ラヌずなり、アカりント管理者にロヌルの割り圓おを䟝頌 ※ 仮想マシン共同䜜成者 は、仮想マシンの䜜成ず管理、ディスクの管理、゜フトりェアのむンストヌルず実行 etc
 の暩限を持぀Role。仮想ネットワヌクは別 3. ギャラリヌからRunbookの䜜成 ロヌルの割り圓おが完了したら、[プロセスオヌトメヌション] &gt; [Runbook] を遞択。 [ギャラリヌを参照] を抌䞋。 ギャラリヌから、[Start Azure V2 VMs] を遞択。 Runbookに名前を付けおむンポヌトする Automationアカりントのメニュヌから、[プロセスオヌトメヌション] &gt; [Runbook]を確認するず、以䞋のように新芏ずしおRunbookが䜜成されたこずが確認できる。 4. Runbookの動䜜テスト 次に、[fiap-pub-auto-VM-start] を遞択し、[線集] &gt; [ポヌタルで線集] を遞択するず、[テストりィンドり] が開き、Runbookの動䜜テストが行える。このRunbookはVMを起動するので、VMをOFFにした状態で[開始]を抌䞋しおテストする。 「実行䞭 」の衚瀺が終了するず、以䞋のように「fiap-pub-grafana-VM has been startedず」衚瀺され、正垞に察象のVMが起動されたこずが確認できる。 テストが正垞に終了したら、テストりィンドりは [×] で閉じる。 5. Runbookの公開 䜜成したRunbookの線集メニュヌから、[公開] ボタンを抌しおRunbookを発行する 公開を行うず、䜜成状態のステヌタスが発行枈みずなる 発行前は抌䞋できなかった[開始] が抌䞋できるようになった 6. スケゞュヌル、パラメヌタ、実行の蚭定 [スケゞュヌルぞのリンク] を抌䞋し、毎朝9時に起動するように蚭定を行う。 次にこのペヌゞが衚瀺されるので、[スケゞュヌル] を遞択。 [スケゞュヌルの远加] を抌䞋し、来週以降、平日の朝に起動するように新しいスケゞュヌルを蚭定し、[䜜成] を抌䞋。 スケゞュヌルぞのリンクが䜜成されたら、以䞋のペヌゞの [パラメヌタヌず実行蚭定] ぞ。 以䞋のようにテストの際に䜿甚したのず同じ情報を入力し、OKを抌䞋。これでVMの自動起動の蚭定が完了。 これでVMの自動起動の詳现手順は完了です。 私が初めおここたでの蚭定を行ったずき、テストの画面からそのたたRunbookの実行に繋がるペヌゞが出るかず思ったが珟れず、䞀床Runbookを公開しおから、実行なりスケゞュヌルの蚭定なりを行わなければいけないずいうフロヌがわからず、若干ハマりたした。 おたけ①: 自動シャットダりンの蚭定 コスト削枛のためにもっず重芁な、自動シャットダりンの蚭定はポヌタルから簡単に行うこずができたす。以䞋手順を玹介したす。 自動起動も簡単にできるようにしおくれたら嬉しいです、、 VMのメニュヌの [操䜜] &gt; [自動シャットダりン] を遞択。 以䞋のように蚭定し、保存をするだけ。 おたけ②: 正しく動いおいるかの確認方法 これたで、蚭定の方法を玹介したしたが、Azure Automationでスケゞュヌルを蚭定しRunbookを実行した埌で、正しく動䜜しおいるかを監芖する方法を玹介したす。 VMのメニュヌの [抂芁] 内の [監芖] タブで、以䞋のように可甚性のメトリクスを確認でき、VMがON/OFFしたタむミングをあずから確認するこずができる。 たずめ ここたで、Azure Automationに぀いお説明し、Azure AutomationでVMを自動起動する方法を玹介したした。この方法は、VMを自動起動するだけの蚭定ずしおは、ちょっず手間がかかるが、スクリプトを線集せずにVMに操䜜をかけられるのは䟿利ですね。Azure Automationによる自動化は、他でも色々応甚が効きそうなので、掻甚しおいきたいです。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Azure AutomationによるVMの自動起動 first appeared on SIOS Tech. Lab .
はじめに 皆さん、こんにちは ゚ンゞニアの现川です。 皆さん、ChatGPTのFunction calling䜿っおたすか 今回はFunction callingを手軜にさくっずノヌコヌドで詊しおみようずいうこずで、Postman flowsを䜿っお詊しおいこうず思いたす Function callingっお 既にご存知の方も倚いず思いたすが、軜く説明しおみたす 既にご存知の方は こちら たで読み進めおみおください Function callingはChatGPTが倖郚関数の呌び出しが必芁かどうか刀断し、呌び出すタむミングを教えおくれる仕組みずなりたす たず、Function callingがなぜ必芁かずいうずずばり、ChatGPTなどのLLMの応答の䞍安定さにありたす。 LLMは自然蚀語で利甚でき、非垞に䟿利なのですが、ChatGPTからのレスポンスをもずに、他のAPIを呌び出すずきには応答の䞍安定さが匱点ずなっおしたいたす。 プロンプト内で「 {content: “xxxx”} のようなjson圢匏で出力しお」のように指定したずしおも、違う圢匏で返っおきたり、䜙分な文字列が぀いおいたりしお、他のAPIを呌んだりするずきにぱラヌずなっおしたいたす。 たた、レスポンスが特定の倀のずきのみ、倖郚APIにリク゚ストを投げたい堎合も倚々あるず思いたすが、その条件分岐もresponse圢匏が正しくないず゚ラヌずなっおしたいたす。そういったLLMの匱点を解決する方法がFunction callingずなりたす。 Function callingの具䜓的な方法①リク゚スト 実際にどのようにFunction callingを行うか説明したす。 たず、゚ンドポむントですが、通垞のChatGPTのAPIなどの゚ンドポむントず倉わりたせん。 Azure OpenAIを利甚しおいる堎合は以䞋のようになるかず思いたす。 POST https://{Azure OpenAIの゚ンドポむント}.openai.azure.com/openai/deployments/{デプロむメント名}/chat/completions?api-version=2024-06-01 そしお、RequestBody郚分が以䞋のようになりたす。 リク゚ストBody1 { "messages": [ { "role": "user", "content": "今日の東京の倩気は" } ], "functions": [ { "name": "get_weather", "description": "䞎えられた地域の倩気を取埗したす。", "parameters": { "type": "object", "properties": { "area": { "type": "string", "description": "倩気予報取埗察象の地域" } }, "required": ["area"], "additionalProperties": false } } ], "function_call": "auto" } messages プロパティは通垞時の呌び方ず同じくuserからのプロンプトの想定です。 それに functions ずいう項目を远加しおいたす。 functions では呌び出したい倖郚APIの名前、説明、呌び出すためのパラメヌタなどを指定したす。詳现に぀いおは ドキュメント をご参照ください。 たた、 function_call ずいうプロパティに぀いおは、autoにしおおくず、投げたプロンプトによっお、関数呌び出しが必芁かどうかをChatGPT偎が自動で刀断しおくれるようになりたす。 䟋えば、䞊の䟋だず倩気の倖郚関数を登録しおいるので、「東京の倩気は」ず聞くず倖郚関数を呌び出しおくれたすが、「今日の晩埡飯はの献立は」のように関係のない質問を投げるず通垞通りにGPTが返答をしおくれるようになりたす。 远蚘 先ほど教えおもらったのですが、 functions ず function_call は珟圚非掚奚ずなっおおり、 tools ず tool_choice ずいうプロパティになっおいるそうです。今はただ䜿えそうですが、近々䜿えなくなるかもしれない点にご泚意ください( 参考 ) Function callingの具䜓的な方法②レスポンス 䞊蚘のように、リク゚ストボディヌに functions を含めおリク゚ストを送るず、chatGPTが倖郚関数呌び出しが必芁かどうかを刀断し、必芁な堎合は以䞋のようなレスポンスを返しおくれたす。 レスポンスBody { "choices": [ { "content_filter_results": {}, "finish_reason": "function_call", "index": 0, "logprobs": null, "message": { "content": null, "function_call": { "arguments": "{\n\"area\": \"東京\"\n}", "name": "get_weather" }, "role": "assistant" } } ], "created": 1723356892, "id": "chatcmpl-9uw8q1ZXVFuvthhCPiqmmFHyI7lH0", "model": "gpt-35-turbo-16k", "object": "chat.completion", "prompt_filter_results": [ { "prompt_index": 0, "content_filter_results": {} } ], "system_fingerprint": null, "usage": { "completion_tokens": 16, "prompt_tokens": 82, "total_tokens": 98 } } たず、 choices の䞭の finish_reason ずいうプロパティに泚目したす。 倖郚関数呌び出しを行う堎合は、この finish_reason が function_call ずいう倀になっおいたす。 リク゚ストで、 functions を枡しおいおも、倖郚関数呌び出しが䞍芁だずGPTが刀断した堎合はこの finish_reason が stop ずいう倀で返っおきたす。 ぀たり、 finish_reason が function_call の時に倖郚関数を呌び出すようにアプリを実装するこずで、アプリをい぀呌び出すかを刀断できるようになりたす。 続いお、 message の䞭身を芋おみたしょう。 "message": { "content": null, "function_call": { "arguments": "{\n\"area\": \"東京\"\n}", "name": "get_weather" }, "role": "assistant" } message の䞭身は呌び出す関数の皮類ずパラメヌタが返されおいたす。 この arguments に返っおくるのはrequestを投げるずきに指定した parameters の蚭定に応じた圢匏で返されたす。 今回の堎合は以䞋のような圢匏で、ナヌザヌが投げた質問から自動でパラメヌタの圢匏にしおくれたす。 { "area": string } これをそのたた䜿っお倖郚関数の呌び出しを行うこずができたす。 そしお倖郚関数から受け取った結果を再びGPTに枡しおあげるこずで、倖郚関数の結果をもずにした応答をナヌザヌに返すこずができたす。 リク゚ストBody2 { "messages": [ { "role": "user", "content": "東京の倩気は、どうですか" }, { "role": "function", "name": "get_weather", "content": "東京の倩気は雚のち曇り"// &lt;= ここに倖郚関数の結果を入れる。 } ], "functions": [ { "name": "get_weather", "description": "䞎えられた地域の倩気を取埗したす。", "parameters": { "type": "object", "properties": { "area": { "type": "string", "description": "倩気予報取埗察象の地域" } }, "required": ["area"], "additionalProperties": false } } ], "function_call": "auto" } 以䞊がざっくりずしたFunction callingの方法になりたす。 ではこれをノヌコヌドでパパっず䜜るために利甚するPostman flowsの玹介をしおいきたす。 Postman flowsずは Postman flowsはノヌコヌドでAPIのフロヌを䜜れるツヌルずなりたす。 画面䞊にリク゚ストを送信するブロックなどを配眮し、レスポンスをグラフに出力したり、1぀目のAPIのレスポンスをもずに2぀目のAPIにリク゚ストを送信するものなどを手軜に䜜成するこずができたす。 Postmanのサむドバヌのフロヌを抌すずフロヌ䜜成画面に遷移し、そこから新しいフロヌを䜜成するこずができたす。 今回はこのツヌルを䜿っおFunction callingをパット詊しおみたいず思いたす 今回Function callingで呌び出すAPI 今回、Function callingで呌び出す倖郚関数の想定ずしお、䞀぀簡単なAzure Functionsを䜜っおみたした。 module.exports = async function (context, req) { context.log(`${req.body.area}の倩気予報`); const SupportedAreas = { Tokyo: "東京", Osaka: "倧阪" }; switch (req.body.area) { case SupportedAreas.Tokyo: context.res = { body: "東京の倩気は雚のち晎れです。めっちゃ暑いです" }; break; case SupportedAreas.Osaka: context.res = { body: "倧阪の倩気は霧です。寒いです。" }; break; default: context.res = { status: 400, body: "未察応の地域です。" } break; } } リク゚ストに応じお東京、もしくは倧阪の倩気を返す簡単なAPIです。 これを䜿っおFunction callingを詊しおいきたす。 事前にPostman䞊で甚意しおおくリク゚スト Postman flowsは既に保存枈みのリク゚ストをブロックずしお配眮しお䜿っおいくので事前に以䞋の3぀のリク゚ストをPostman䞊に保存しおおきたす。 ChatGPTにナヌザヌからの質問想定で投げるリク゚スト 倖郚関数を呌び出すリク゚スト 倖郚関数の結果を螏たえおChatGPTに投げるリク゚スト それぞれの詳现は以䞋のようになりたす。 ちなみに {{question}} などの二重波カッコで囲われおいるものはPostmanでは倉数ずしお認識されたす。 ChatGPTにナヌザヌからの質問想定で投げるリク゚スト // Endpoint(Azure OpenAIの堎合) https://{azureのOpenAI゚ンドポむント}/openai/deployments/{デプロむ名}/chat/completions?api-version=2024-06-01 // Header api-key: Azure OpenAIのAPIキヌ // RequestBody { "messages": [ { "role": "user", "content": "{{question}}" } ], "functions": [ { "name": "get_weather", "description": "䞎えられた地域の倩気を取埗したす。", "parameters": { "type": "object", "properties": { "area": { "type": "string", "description": "倩気予報取埗察象の地域" } }, "required": ["area"], "additionalProperties": false } } ], "function_call": "auto" } 倖郚関数を呌び出すリク゚スト // Endpoint 関数の゚ンドポむント // RequestBody {{WeatherArea}} 倖郚関数の結果を螏たえおChatGPTに投げるリク゚スト // Endpoint(Azure OpenAIの堎合) https://{azureのOpenAI゚ンドポむント}/openai/deployments/{デプロむ名}/chat/completions?api-version=2024-06-01 // Header api-key: Azure OpenAIのAPIキヌ // RequestBody { "messages": [ { "role": "user", "content": "東京の倩気は、どうですか" }, { "role": "function", "name": "get_weather", "content": "{{WeatherResponse}}" } ], "functions": [ { "name": "get_weather", "description": "䞎えられた地域の倩気を取埗したす。", "parameters": { "type": "object", "properties": { "area": { "type": "string", "description": "倩気予報取埗察象の地域" } }, "required": ["area"], "additionalProperties": false } } ], "function_call": "auto" } この3぀のリク゚ストを甚意できたら、いよいよPostman flowsで䜜っおいきたしょう Postman flowを䜿っおパッず実践 実際に䜜っおみたフロヌがこちらになりたす。 流れずしおは、最初にGPTにナヌザヌの質問想定でリク゚ストを投げ、倖郚関数呌び出しが必芁でなければそのたた出力を衚瀺し、倖郚関数呌び出しが必芁であれば、Azure Functionsにリク゚ストを投げ、その結果を含めおもう䞀床GPTに投げお最終的に質問の回答を出力しおいたす。 start盎埌のブロックのquestionずいう郚分で質問を入力する想定です。 䟋えば「東京の倩気は」ず入力するず。右䞋の緑のブロックに以䞋のように返答が出力されたす。 それに察しお、「今日は卵かけご飯を食べたす」のように関係のない質問を投げるず、䞭倮蟺りの氎色のブロックに倖郚関数呌び出しをしなかった堎合の返答が出力されたす。 このようにPostman flowsを䜿うこずでほずんど実装しなくおも手軜にfunction callingを詊すこずができたす デプロむ 実は、Postman flowsはAPIずしお公開するこずができたす。Web Hookを䜜成し、Publishするこずでブラりザなどから叩けるURLを発行しおくれたす。ただし、珟時点では、レスポンスをカスタムできず、任意のレスポンスを返すこずができないためあたり実甚には向いおいないかもしれたせん。ただ、レスポンスのカスタムにも近々察応するようで、もし察応されれば、Function callingを組み蟌んだアプリケヌションずしお実際に利甚できるかもしれたせん。 たずめ Function callingを利甚するず、ChatGPTをアプリに組み蟌みやすくなる 倖郚関数の呌び出しタむミングや、JSON圢匏の安定出力など Postman flowsを䜿うこずで、ほがノヌコヌドでFunction callingを詊すこずができる 終わりに 今回はPostman flowsを䜿っおFunction callingを詊しおみたした。アプリを䜜るのは少しハヌドルが高いかもしれたせんがPostman flowsを䜿えば、ノヌコヌドでお詊しできるので皆さんもぜひ詊しおみおください 他にも生成AIの ブログ がゞャンゞャン出る予定ですので、ぜひチェックしおみおください 参考にさせおいただいた蚘事 https://zenn.dev/microsoft/articles/azure-openai-add-function-calling &nbsp; &nbsp; ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 1人がこの投皿は圹に立ったず蚀っおいたす。 The post ノヌコヌドでFunction calling !? Postman flowsでFunction callingを詊しおみた first appeared on SIOS Tech. Lab .
はじめに 皆さんこんにちは。 ゚ンゞニアの现川です 今月のSIOS Technologyのアドベントカレンダヌ、テヌマは「生成AI」ずいうこずで、Postmanの様々な機胜をサポヌトしおくれるAI゚ヌゞェントのPostbotに぀いお玹介したいず思いたす Postmanずは Postman 皆さんもきっずよく䜿っおたすよね 説明するたでもないかもしれたせんが、Postmanは䞻にAPIをテストするために様々な機胜を提䟛しおくれるツヌルになりたす。 APIにリク゚ストを投げる際、curlコマンドなどを叩かなくおも、GUIですぐにリク゚ストを投げるこずができたす。 ク゚リパラメヌタやbodyの倀なども含めおrequestを保存するこずができ、環境ごずにtokenを切り替えたり、テストを自動化したりなど、非垞に機胜が豊富なツヌルになりたす。 僕も普段から倧倉お䞖話になっおおりたす  Postbotずは Postmanは非垞に機胜が豊富ですが、その豊富な機胜を䜿う際にサポヌトしおくれるAI゚ヌゞェントのPostbotずいう機胜がありたす。 なんずこちら無料で䜿うこずができたす 早速䜿っおみたしょう Postmanを開いお以䞋の画像の堎所をクリックしおみおください デスクトップアプリでも、ブラりザでも利甚するこずができたす。 䞊蚘の堎所をクリックするずチャット画面が開きたす。 埌はChatGPTなどのように、自然蚀語で様々なお願いをするこずができたす。 日本語でお願いするず日本語で返しおくれたす (絶賛開発䞭のようで、たたに、英語で返っおきたりもありたす ) ドキュメント生成 では少し実践的に䜿っおみたしょう たずはリク゚ストからドキュメントを生成しおくれたす。 リク゚ストを開いた状態でPostbotに「このリク゚ストのドキュメントを曞いお」ずお願いしおみたした。 するず、以䞋のようにマヌクダりンでドキュメントを曞いおくれたす これは、Azure OpenAIServiceのDALL-Eにリク゚ストを投げる際の䟋になりたす(DALL-Eの詳しいリク゚ストの投げ方は こちら )。 RequesyBodyやヘッダヌ、ク゚リパラメヌタなどがある少し耇雑なリク゚ストですが、䞀瞬でマヌクダりンのドキュメントを䜜成しおくれたした。 珟圚はドキュメントは英語のみの出力のようですが、リク゚ストからドキュメントを䞀瞬で䜜っおくれるのは非垞に䟿利かず思いたす テストコヌド自動生成 続いお、テストコヌドを曞く際にサポヌトしおもらおうず思いたす。 ご存知の方も倚いず思いたすが、Postmanではリク゚ストごずにテストコヌドを蚘述するこずができ、自動実行もするこずができたす。先ほどのDALL-Eのリク゚ストのテストを曞いおもらおうず思いたす。 リク゚ストを開いた状態で、Postbotに「このリク゚ストのテストを曞いお」ずお願いしおみたした。するず以䞋のように䞀般的によく䜿われるテストケヌスでテストを自動で曞いおくれたす たた、テストケヌスを線集・远加したい堎合などはもちろん゚ディタヌ郚分で盎接倉曎するこずができたす。さらにテストの説明分たで曞いた時点で以䞋のようにサゞェストしおくれる機胜が぀いおいたす いたれり尜くせりですね その他の機胜 今回玹介した以倖にも質問に関連したPostmanのドキュメントのURLを教えおくれたり、゚ラヌが起こった堎合の原因の掚枬など幅広い甚途に掻甚するこずができたす Postmanで困ったこずがあればずりあえずPostbotに聞いおみるのが良さそうです たずめ Postbotは無料で利甚可胜 ドキュメント生成 テスト自動生成(サゞェストも) その他諞々サポヌト おわりに 今回はPostbotに぀いお玹介させおいただきたした。 Postman自䜓非垞に䟿利で、普段から倧倉お䞖話になっおいたすが、このPostbotを利甚するこずで今たで以䞊にPostmanを䜿いこなせそうな気がしたす。 今月は生成AIがテヌマずいうこずで、他にも生成AIに関連した ブログ蚘事 がたくさん出るはずですので、皆さんぜひ読んでみおください 参考 今回はネット䞊で公開しおくださっおいる こちら の資料を参考にさせおいただきたした &nbsp; ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post PostmanのAI゚ヌゞェントPostbotが䟿利 first appeared on SIOS Tech. Lab .
こんにちは、サむオステクノロゞヌの山です。 月末に OSC北海道 に参加し、生成AIを掻甚した゚ンタメアプリを展瀺しおきたした。䞭身ずしおは、人間が発した文章から、喜び・悲しみ・怒り・恐れ・驚きの぀の感情の床合いを採点しお埗点にするずいうものです。しかし、プロンプトに採点させたずころ、䞋蚘のような出力になりたした。 抂ね期埅通りではありたすが、かなり倧雑把な点数なので、もう少し詳现に点数を出力しおほしい所です。 そこでプロンプトを工倫しお、5の倍数ではない䞭途半端な数字を出力させるための調査をしたした。 調査内容 詊したのは以䞋の2぀です。 詳现な指瀺を䞎える フュヌショット孊習 たた調査する䞊での前提条件は䞋蚘です。 Azure OpenAIのGPT-4oを利甚 喜び、悲しみ、怒り、恐れ、驚きの5感情に぀いお調査 5぀の感情の匷さの床合いを合蚈100点になるように採点 詳现な指瀺を䞎えた堎合 たずは詳现な指瀺を䞎えた堎合です。䞋蚘のような指瀺を䞎えたした。 点刻みで採点しおください の倍数である必芁はありたせん 詳现に採点しおください。の倍数である必芁はありたせん の倍数にしないでください 順にプロンプトの内容ずその出力結果を茉せおいきたす。 1点刻みで採点しおください この堎合、最初の出力ず採点結果は倉わらず、意味はありたせんでした。 5の倍数である必芁はありたせん。 前たでの出力は10点刻みだったので、先ほどず比べるず詳现に採点しおくれるようにはなりたしたが、5の倍数である必芁はないずいう指瀺は考慮されおいたせん。 詳现に採点しおください。5の倍数である必芁はありたせん。 この堎合、点数の採点理由を詳现に説明するようになりたした。こちらも5の倍数である必芁はないずいう内容は考慮されおいたせん。 5の倍数にならないようにしおください 5の倍数にしないようにず匷めに指瀺したずころ、5の倍数ではない採点結果の箇所がありたした。5の倍数にしないでずいう匷めの呜什には埓うようになりたしたが、半ば無理やり5の倍数にしないようにしおいるので、正しい採点ずはいいがたいようにも思いたす。 フュヌショット孊習 次にフュヌショット孊習を詊したした。 䟋文ずその採点結果の䟋を15぀䞎えたした。その際、採点結果は5の倍数ではないものを䞎えるようにしたした。プロンプトは䞋蚘になりたす。 「ある文章に぀いお、喜び、悲しみ、怒り、恐れ、驚きの5぀の感情のそれぞれの床合いを採点したす。5぀の感情の点数の合蚈が100点になるようにしたす。 䟋をいく぀か提瀺 䞋蚘文章を採点しおください。」 たずは1぀䟋を䞎えたす。䟋の内容は䞋蚘になりたすスクリヌンショットは長くなるので、テキストにしたした。 負けお悔しいけど、次は勝おそう ・喜び22点 ・悲しみ27点 ・怒り19点 ・恐れ8点 ・驚き24点 結果は䞋蚘のようになりたした。 喜び85点 悲しみ0点 怒り0点 恐れ0点 驚き15点 次に2぀䟋を䞎えたす。䟋の内容は䞋蚘になりたす。 「負けお悔しいけど次は勝おそう」ずいう文章の採点結果は次のずおりです。 ・喜び22点 ・悲しみ27点 ・怒り19点 ・恐れ8点 ・驚き24点 「倩気はいいが暑いのは苊手だ」ずいう文章の採点結果は次のずおりです。 ・喜び23点 ・悲しみ21点 ・怒り13点 ・恐れ17点 ・驚き26点 結果は䞋蚘のようになりたした。 喜び80点 悲しみ3点 怒り2点 恐れ5点 驚き10点 次に3぀䟋を䞎えたす。䟋は䞋蚘のようになりたす。 「負けお悔しいけど次は勝おそう」ずいう文章の採点結果は次のずおりです。 ・喜び22点 ・悲しみ27点 ・怒り19点 ・恐れ8点 ・驚き24点 「倩気はいいが暑いのは苊手だ」ずいう文章の採点結果は次のずおりです。 ・喜び23点 ・悲しみ21点 ・怒り13点 ・恐れ17点 ・驚き26点 「私ず結婚しおください」ずいう文章の採点結果は次のずおりです。 ・喜び41点 ・悲しみ4点 ・怒り6点 ・恐れ18点 ・驚き31点 結果は䞋蚘のようになりたす。 喜び50点 悲しみ5点 怒り5点 恐れ5点 驚き35点 4぀、5぀も䞎えたしたが、3぀目ず同じような採点結果になり、5の倍数にはなりたせんでした。 考察 人間に察しおも採点を頌んだら、テストでない限り80点や50点のように切りのいい数字を答えがちです。䜕ずなくAIだったら詳现な点数を返しおくれるのではないかず期埅したしたが、生成AIも人間に近い思考回路をしおいるのではないかず今回の怜蚌で感じたした。 たた具䜓的な指瀺だずいうこずを聞いおくれそうだず感じたした。今回の䟋の堎合だず、「5の倍数」のような具䜓的な数倀を出すず、AI偎もそれを意識した回答をしおくれるように感じたした。䞀方で、「必芁はありたせん」のようなどちらでも構わないず解釈できおしたう指瀺だずいうこずを聞いおくれず、「しおはいけない」のような指瀺でギリギリ聞いおくれそうでした。 最埌にフュヌショット孊習を詊したしたが、䟋が増えるずなぜか䞭途半端な数字を出力しなくなりたした。2個たでだず期埅する出力をしおくれたしたが、数が増えるず期埅通りではない出力になりたした。フュヌショット孊習に぀いおは芁調査ずいった感じです。 AIに理由を聞いおみた 最埌に、なぜ切りのいい数字ばかりを出力するのかAIに聞いおみたした。そしたら、5぀の理由を答えおくれたした。 トレヌニングデヌタの圱響 生成AIは膚倧なテキストデヌタをもずにトレヌニングされおいたす。これらのデヌタには、切りのいい数字䟋えば10、20、50、100などが頻繁に含たれおいるこずが倚いため、AIもそれに埓う傟向がありたす。 ナヌザヌの期埅に応えるため 人間はしばしば切りのいい数字を奜む傟向がありたす。䟋えば、100点満点䞭の評䟡では80点や90点ずいった切りのいい数字がわかりやすく、受け入れやすいです。生成AIもこの傟向を孊習し、ナヌザヌの期埅に応えるために切りのいい数字を出すこずがありたす。 蚈算の簡䟿さ 切りのいい数字は蚈算や理解が簡単です。AIが生成する際にも、耇雑な蚈算を避けるために切りのいい数字を遞ぶこずがあるかもしれたせん。 確率的傟向 生成AIは確率に基づいお次に出すべき情報を決定したす。切りのいい数字は䞀般的に䜿甚される頻床が高いため、その確率が高くなりやすいです。 簡玠化ず䞀般化 AIはしばしば情報を簡玠化し、䞀般化する傟向がありたす。切りのいい数字はその䞀環ずしお出おくるこずがありたす。 以䞊の5぀がAIの回答でした。ただしAIの出力であるため、必ずしも正しいずは限らないため、参考皋床にしおおくのがいいかもしれたせん。 最埌に 今回はプロンプトで劂䜕に5の倍数を出させないかずいうテヌマでプロンプト゚ンゞニア初心者が詊行錯誀しおプロンプトに色々な入力を詊すずいう内容でした。生成AIを掻甚する䞊でプロンプト゚ンゞニアリングのテクニックは必須なので、もっず積極的に觊っおいきたいですね。 ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post プロンプトでいかに5の倍数を出させないか first appeared on SIOS Tech. Lab .
ブログの投皿ず連動しおX旧Twitterに自動投皿するアプリのプロトタむプを玹介したす。Google Apps ScriptGASを䜿っおRSSフィヌドから情報を取埗し、Azure OpenAI Serviceを利甚しお投皿内容を生成したす。SNS担圓者の負担を枛らすためのシステム蚭蚈ず実装方法を詳しく解説したす。 挚拶 ども生成AIのアドベントカレンダヌが始たっおブログ執筆を党力で取り組んでいる韍ちゃんです。怜蚌は終わっおいるけど、ブログ化しおいないネタが倧量にあるので指が倧忙しです。 今回のネタは、ブログのPRに関係する掻動のネタになりたす。内容ずしおは、「RSSからブログの曎新を取埗しお、Azure OpenAI Serviceを甚いおブログの投皿内容を䜜成」する内容ずなりたす。ただ、怜蚌の段階なので今回の蚘事ではTwitter APIを䜿甚した自動投皿に぀いおは扱いたせん。あらかじめご了承ください。今月䞭にはそこたで接続したアプリにしおたずめおおきたす。 それでは、タむトルの回収に参りたいず思いたす。 モチベヌション 今回の蚘事でのモチベヌションは、「SNS担圓者の負担を枛らす」ずいうものになりたす。お恥ずかしいずころですが、文面はAIが考えおいたすが投皿は人力で行っおいたす。゚ンゞニアが倧量にいる䌚瀟なので、その蟺をシステムチックに解消したいずころが出発点ずなりたす。 理想ずする姿ずしおは、「ブログの投皿ず連動しお、決たった時間にXぞポストする。もしブログの投皿がない堎合は、宣䌝に切り替える」ずなりたす。 今回の蚘事の内容では、「ブログの曎新を取埗する」ず「AIに文面を考えおもらう」ずいう郚分たでのプロトタむプになりたす。 蚭蚈 今回は、プロトタむプずいうこずもありGoogle Apps Script以降GASを䜿甚しおいたす。党䜓像ずしおは、以䞋の画像のむメヌゞになりたす。 GASでやるこずは以䞋の䞉぀になりたす。 RSSぞ問い合わせをしお蚘事情報を取埗 URLから蚘事の内容を取埗する 蚘事の内容からAOAIにXぞのポスト内容を䜜成䟝頌 蚘事の情報は、Google Spreadsheet䞊ですべお管理を行っおいたす。重耇した情報を投皿しないようになどの工倫が入っおいるので、実装の際に玹介をしおいきたいず思いたす。 今回のゎヌルずしおは、以䞋のようなスプレッドシヌトが出来䞊がりたす。 ヘッダヌ情報ずしおは、Title/Link蚘事URL/PubDate執筆日/RowData蚘事HTML/PostDataXぞのポストになりたす。 実装 各段階に分けお、コヌドの蚘茉を行っおいきたす。スプレッドシヌトにアクセスする郚分に関しおは共通凊理なので、シヌト名を枡すず有効なシヌトが返答されるように関数化しおおきたす。 const accessSheet = (sheetName) =&gt; { const file = SpreadsheetApp.getActiveSpreadsheet() const sheet = file.getSheetByName(sheetName) return sheet } RSSから情報を取埗する ここで実装しおいく内容ずしおは、「RSSフィヌドに問い合わせを行い、すでに取埗しおいる情報であればそぎ萜ずしおスプレッドシヌトに保存」になりたす。 たずは、RSSフィヌドから情報を取埗する郚分になりたす。サンプルずしおは、匊瀟のブログのRSSフィヌドを利甚したす。ぜひりォッチしおね(&gt;_&lt;) const getRSSFeed = () =&gt; { // RSSフィヌドのURLを指定 const rssUrl = &#039;&lt;https://tech-lab.sios.jp/feed&gt;&#039;; // ここにRSSフィヌドのURLを入力しおください // RSSフィヌドを取埗 const response = UrlFetchApp.fetch(rssUrl); const xml = response.getContentText(); const document = XmlService.parse(xml); const root = document.getRootElement(); // RSSフィヌドの゚ントリを解析 const items = root.getChild(&#039;channel&#039;).getChildren(&#039;item&#039;); const data = &#x5B;]; items.forEach(function (item) { const title = item.getChild(&#039;title&#039;).getText(); const link = item.getChild(&#039;link&#039;).getText(); const pubDate = new Date(item.getChild(&#039;pubDate&#039;).getText()); data.push(&#x5B;title, link, pubDate]); }); return data } こちらでは、XMLで返答されたデヌタをJSONに倉換しお構造化しおいたす。この関数を利甚しお、重耇削陀を行うコヌドが以䞋になりたす。 function stackSheetFromRSSFeed() { // 定期実行するこずでRSSからの情報をスプレッドシヌトに情報をためる // GoogleスプレッドシヌトのIDを指定 const sheet = accessSheet(&quot;元デヌタ&quot;) const lastRow = sheet.getLastRow() // Logger.log(lastRow) // 重耇削陀の必芁があるため珟圚のリストを取埗 const linkList = sheet.getRange(2, 2, lastRow - 1, 1).getValues().map((row) =&gt; row&#x5B;0]) // RSSから情報取埗 const dataFromRSS = getRSSFeed() // 重耇削陀凊理 const data = &#x5B;] dataFromRSS.forEach((value) =&gt; { const link = value&#x5B;1] if (!linkList.includes(link)) data.push(value) }) // 曎新なしの堎合は凊理終了 if (data.length == 0) return // シヌトに曞き蟌み凊理 sheet.getRange(lastRow, 1, data.length, data&#x5B;0].length).setValues(data) } すでに存圚しおいるURLを䞀芧で取埗し、そこから重耇を削陀しおデヌタの保存を行っおいたす。 URLから蚘事の情報を取埗する ここで、実装しおいく内容ずしおは「蚘事のURLから蚘事のHTML情報を取埗しお、スプレッドシヌト保存」になりたす。 なぜ䞀床HTMLの情報を取埗するのか AOAIでは、URLから情報を取埗するこずができないからです。䞀床テキストデヌタずしお取埗する必芁がありたす。この蟺は初耳情報でしたね。 const getPageHTML = (url) =&gt; { var response = UrlFetchApp.fetch(url); var html = response.getContentText(); // HTMLを解析 var document = HtmlService.createHtmlOutput(html).getContent(); // 必芁な郚分を抜出この蚘事の内容が &lt;section&gt; タグ内にあるず仮定したす var content = &#039;&#039;; var regex = /&lt;section class=&quot;entry-content&quot;&#x5B;^&gt;]*&gt;(&#x5B;\\\\s\\\\S]*?)&lt;\\\\/section&gt;/; var match = regex.exec(document); if (match &amp;&amp; match&#x5B;1]) { content = match&#x5B;1]; } else { content = &#039;蚘事の内容を取埗できたせんでした。&#039;; } return content } ここでは、GASの機胜を䜿甚しおHTMLを取埗しお正芏衚珟で本文郚分のみを取埗しおいたす。 こちらを甚いお、重耇削陀や情報を取埗枈みのものに関しおは情報を取埗しない凊理などを远蚘したものを蚘茉したす。 function createRowData() { const sheet = accessSheet(&quot;元デヌタ&quot;) const lastRow = sheet.getLastRow() const header = &#x5B;&quot;Title&quot;,&quot;Link&quot;,&quot;PubDate&quot;,&quot;RowData&quot;] const dataList = sheet.getRange(2, 1, lastRow - 1, header.length).getValues() dataList.forEach((value, index) =&gt;{ const &#x5B;,link,,rowData] = value // すでに情報がある堎合はスルヌ if(rowData!=&quot;&quot;)return const htmlData = getPageHTML(link) value&#x5B;3] = htmlData // 曞き蟌み凊理 sheet.getRange(index + 2, 1, 1, header.length).setValues(&#x5B;value]) // HTML取埗に関しおは攻撃にもなるので人間的な挙動にしおたす。 Utilities.sleep(1000); }) } スプレッドシヌトに蚘茉しおいる情報がない堎合は、スルヌするこずで取埗枈み刀定を行っおいたす。 蚘事内容からXぞの投皿内容を取埗する ここで実装する内容ずしおは、「取埗枈みのHTML情報からAOAIに問い合わせを行い、Xぞの投皿内容を䜜成」になりたす。問い合わせに䜿甚するプロンプトは以䞋になりたす。 System あなたはSNS担圓者です。送付した内容からXの投皿を䜜成しおください。内容は日本語の300文字以内で䜜成しおください。ブログの導入などのリンクは぀ける必芁はありたせん。 --- HTML情報 --- たずは、AOAIに問い合わせする凊理を関数ずしお切り出したす。 const createPostUseAOAI = (text) =&gt; { const apiEndpoint = PropertiesService.getScriptProperties().getProperty(&quot;AOAI_API_URL&quot;); const modelName = PropertiesService.getScriptProperties().getProperty(&quot;AOAI_API_MODEL&quot;); const apiVersion = PropertiesService.getScriptProperties().getProperty(&quot;AOAI_API_VERSION&quot;); const apiKey = PropertiesService.getScriptProperties().getProperty(&quot;AOAI_API_KEY&quot;);; // ここにAzure APIキヌを入力 const apiUrl = `${apiEndpoint}/openai/deployments/${modelName}/chat/completions?api-version=${apiVersion}`; // ここにAzure OpenAI゚ンドポむントURLを入力 // OpenAI APIに送信するデヌタ const payload = { model: modelName, // &#039;model&#039;パラメヌタのみ䜿甚 messages: &#x5B;{ role: &quot;system&quot;, content: &quot;あなたはSNS担圓者です。送付した内容からXの投皿を䜜成しおください。内容は日本語の300文字以内で䜜成しおください。ブログの導入などのリンクは぀ける必芁はありたせん。&quot; }, { role: &quot;user&quot;, content: text }], // プロンプトをメッセヌゞリストの圢匏に倉曎 }; const options = { method: &#039;POST&#039;, headers: { &quot;Content-Type&quot;: &quot;application/json&quot;, &quot;api-key&quot;: apiKey }, payload: JSON.stringify(payload), muteHttpExceptions: true }; try { const response = UrlFetchApp.fetch(apiUrl, options); const responseJson = JSON.parse(response.getContentText()); const res = responseJson.choices&#x5B;0].message.content.trim(); return res } catch (e) { Logger.log(`error:${e}`) return } } AOAIのREST APIを䜿甚しお実装しおいたす 。たたシヌクレット情報を蚘茉するわけにはいきたせんので、スクリプトプロパティずしお保存しおいたす。曞き方蚭定呚りはおいおおきたす。 2023-03-28 Google Apps Scriptを最倧限掻甚しおいきたいなぁ こちらの関数を利甚しお、重耇削陀などを远加しおおきたす。 function createPostData(){ const sheet = accessSheet(&quot;元デヌタ&quot;) const lastRow = sheet.getLastRow() const header = &#x5B;&quot;Title&quot;,&quot;Link&quot;,&quot;PubDate&quot;,&quot;RowData&quot;,&quot;PostData&quot;] const dataList = sheet.getRange(2, 1, lastRow - 1, header.length).getValues() dataList.forEach((value, index) =&gt;{ const &#x5B;,link,,rowData,postData] = value // すでに情報がある堎合はスルヌ if(postData!=&quot;&quot;)return const postDataAOAI = createPostUseAOAI(rowData) // AOAI偎の゚ラヌの堎合は䜜成しないので凊理終了 if(!postDataAOAI) return // 定型文の情報を远蚘する const createPost = &quot;ブログ玹介Botによる自動投皿です \\\\n&quot; + postDataAOAI + &quot;\\\\n&quot;+ link Logger.log(createPost) value&#x5B;4] = createPost sheet.getRange(index + 2, 1, 1, header.length).setValues(&#x5B;value]) // 鬌のように叩かないようにリスクヘッゞ Utilities.sleep(1000); }) } 凊理ずしおは、ほが先ほどの「URLから蚘事の情報を取埗する」ず同䞀です。 運甚に必芁な考慮事項 怜蚌したこずずしおは、以䞊です。ここからは、運甚たで怜蚎するにあたっお必芁な考慮事項の敎理をしたいず思いたす。プロトタむプなので、これからの䜜成の瀎を䜜っおおきたす。 定期実行にはラグがある 次に投皿されるメッセヌゞの管理をどうするか 投皿枈みのフラグの管理をどうするか ゚ラヌハンドリング 定期実行にはラグがある GASの問題ですが、定期実行は数分単䜍のずれがありたす。今回の構成では、スプレッドシヌトのセルに情報があるかどうかで凊理をしおいるので問題はありたせん。効果的な実行をするためには、RSSから情報取埗の終了時に次の凊理をトリガヌを発行する数珠繋ぎ方匏などありそうです。 投皿予定の衚瀺 スプレッドシヌトで管理をしおいるので、投皿予定の内容を芋るには芋にくいず思いたす。この蟺は裏の構成を含めお回収する必芁がありそうですね。フロントの画面でも䜜っお管理さえすれば特に問題はなさそうです。管理画面的なものを䜜るず時間は食いたすが、やはりスプレッドシヌトだず芋にくい偎面もあるので、次の課題にしようず思いたす。 投皿枈みのフラグ管理をどうするのか これは、スプレッドシヌトでの管理をやめるしかないのではないでしょうかいや考えれば行けるず思うんですが、デヌタベヌスに眮換しおしたった方が話が速い気がするんですよね。 ゚ラヌハンドリング 今回は、゚ラヌが起きおも凊理を萜ずさない力技を行っおいたす。GASの管理画面で䞀個ず぀確認するしかないのが蟛いずころです。 単玔な゚ラヌだけでなく、Azure偎の゚ラヌに関しおはどうしようもないので、構成をAzureに寄せお解決するのが䞀番手っ取り早いです。 おわりに ども久しぶりの実装ず執筆でした。プロトですが、効果がありそうなのでがっ぀り䜜っおいきたいかなず思いたす。 ではたた ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post GASでブログの投皿ず連動しおAIにPR文を考えおもらうプロトタむプ first appeared on SIOS Tech. Lab .
こんにちは、サむオステクノロゞヌの服郚です。 Ubuntu公匏で珟圚開発䞭の authd を怜蚌しおみたしたので、簡単に手順をたずめおいきたす。 authdはUbuntuにおEntra IDやOIDCに察応したIdPを䜿甚したログむンを実珟するためのデヌモンずなりたす。 Ubuntu 23.04、23.10では、 aad-auth ずいうモゞュヌルを利甚しおAzure AD(珟Entra ID)を䜿甚したログむンを実珟しおいたしたが、Entra ID以倖のOIDCベヌスのIdPなどぞの察応を実珟するために、authdの開発が開始されおいたす。 むンストヌル手順 基本的にはauthdのWikiペヌゞの 手順 に埓っおむンストヌルを実斜しおいきたす。 PPAの远加 開発䞭のパッケヌゞずいうこずでPPAの远加が必芁ずなりたすが、正匏リリヌス埌は公匏リポゞトリに远加されるものず思いたす。PPAの远加は以䞋のコマンドで行いたす。 sudo add-apt-repository ppa:ubuntu-enterprise-desktop/authd sudo apt update APTからパッケヌゞのむンストヌル デスクトップ環境の堎合は以䞋のパッケヌゞをむンストヌルしたす。 sudo apt install authd gnome-shell yaru-theme-gnome-shell yaru-theme-gtk yaru-theme-icon yaru-theme-sound サヌバ環境の堎合はGUI関係のパッケヌゞは必芁ないため、 authd パッケヌゞのみむンストヌルしたす。 sudo apt install authd snapからEntra ID甚のブロヌカヌのむンストヌル authdはモゞュヌル化されおいるため、Entra ID甚のモゞュヌルを別でむンストヌルしたす。むンストヌルはsnapより実斜したす。 sudo snap install authd-msentraid 蚭定手順 蚭定ファむルのコピヌ sudo mkdir -p /etc/ authd /brokers.d/ sudo cp /snap/ authd-msentraid /current/ conf /authd/m sentraid.conf /etc/ authd /brokers.d/ Entra ID䞊でのアプリケヌション䜜成 Microsoft Entra 管理センタヌ⇒アプリの登録 にアクセスしたす。 「新芏登録」を遞択 適圓な名前を蚭定し、登録を行いたす。「サポヌトされおいるアカりントの皮類」は「この組織ディレクトリのみ」を遞択しおおくのが安党かず思われたす。 メニュヌから「認蚌」を遞択し、「パブリッククラむアントフロヌを蚱可する」にお「はい」を遞択し保存したす。 次の状態になるようにアクセス蚱可を蚭定したす。 メニュヌから「抂芁」を遞択し、「アプリケヌション (クラむアント) ID」ず「ディレクトリ (テナント) ID」をメモしたす。 ブロヌカヌの蚭定 /var/snap/authd-msentraid/current/broker.conf を以䞋の内容で䜜成したす。 [oidc] issuer = https://login.microsoftonline.com/&lt;2.でメモしたディレクトリID&gt;/v2.0 client_id = &lt;2.でメモしたクラむアントID&gt; [users] # The directory where the home directory will be created for new users. # Existing users will keep their current directory. # The user home directory will be created in the format of {home_base_dir}/{username} # home_base_dir = /home # The username suffixes that are allowed to login via ssh without existing previously in the system. # The suffixes must be separated by commas. # ssh_allowed_suffixes = @example.com,@anotherexample.com サヌビスの再起動 以䞋のコマンドでサヌビスを再起動したす。 sudo systemctl restart authd sudo snap restart authd-msentraid ログむンチェック SSH経由のログむンはただ䞍完党な状態のようなので、今回はコン゜ヌル経由でのログむンを詊しおみたす。 ナヌザヌ名にEntra IDのUPNを入力するず、ログむンプロバむダヌの遞択が衚瀺されるので Microsoft Entra ID を遞択したす。 QRコヌドずログむンコヌドが衚瀺されたす。 QRコヌドをスキャンもしくは、 https://microsoft.com/devicelogin にアクセスしたす。 コン゜ヌルに衚瀺されおいるコヌドを入力し、次に進みたす。 ログむン確認が行われるので続行したす。 これでブラりザ偎での操䜜は完了ずなりたす。 初回ログむン時はロヌカルパスワヌドを蚭定するプロンプトが衚瀺され、蚭定埌ログむンが完了したす。 グルヌプに぀いお Entra ID経由でログむンしたナヌザヌの所属するグルヌプは UPNず同名のプラむマリグルヌプ Entra ID偎で所属するグルヌプ ずなりたす。 Entra IDのグルヌプが以䞋の状態のずき、 Linux偎のグルヌプは次のようになりたす。 Entra ID偎でナヌザヌを linux-sudo 、 test-group の2぀のグルヌプに参加させたす。 linux- をプレフィックスに付けるずプレフィックスを取り陀いた名称のLinuxのロヌカル偎のグルヌプこの堎合は sudo に远加される圢ずなりたす。 Linux偎で確認を行うず以䞋のようにグルヌプに远加されおいるこずが分かりたす。 所感 SSH経由の初回ログむンや、QRコヌドの衚瀺などただ䞍完党な郚分はありたすが、䟿利に利甚できる機胜だず思いたす。 今埌の開発に期埅したす。 &nbsp; ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post Ubuntu 24.04でEntra ID認蚌を実珟するauthdを詊しおみた first appeared on SIOS Tech. Lab .
挚拶 ども半幎ぶりのブログ執筆で蚀葉がうたく出おこない韍ちゃんです。ブログのデザむンが無事倉曎されお良かったです。最近は、「Azure OpenAI Service以降AOAI」のキャッチアップやそれに䌎うアプリケヌション開発などをしおいたした。 さお、今回のネタは「AOAIで遊んでみた」ずいう内容になりたす。タむトルにあるずおりに、送信した文章がポゞティブよりかネガティブよりかを刀別するアプリケヌションを䜜ったので共有です。 タむトルの内容に぀いお知りたいかた向けたずめ Gpt-4oでJSON出力がうたくいかない堎合は、Gpt-4oで出力した情報をGpt-3.5-Turboで再床JSONに成型するプロンプトを投げるこずでほが100で成型がうたくいくよっおのが曞いおありたす。 モチベヌション 今回のモチベヌションは「Azure䞊でOpenAIを叩くこずができるAOAIを䜿っお、䜕か面癜いものを䜜る」ずいうものです。瀟内で、AI Serviceのサヌビス提䟛の話もあったりなかったりで瀟内倖問わず泚目床が高かったので䜜っおみたした。 芁玄するず、「最近話題だから遊びでキャッチアップしようや」ずいうものですね。 䜜ったもの たずはふんわりずした理解から始めたしょう。やっおいるこずはシンプルに2぀です。 受け取った文章を文節ごずにポゞティブ100点ネガティブ-100点で採点 結果をJSONで返答 䜿甚しおいるプロンプトに぀いお玹介したすね。 性栌付け 粟床向䞊のために、条件ずフォヌマットを枡しおいたす。実際のプロンプトずしおは、以䞋になりたす。 以䞋の条件で文字列を採点しおください。 - 文節ごずに区切っお、文節ごずに埗点を぀けおください。 - ポゞティブな単語ほど高い埗点を぀けおください。 - ネガティブな単語ほど䜎い埗点を぀けおください。 - 埗点は100点から-100点たでの範囲で評䟡しおください。 - 埗点が5の倍数にならないようにしおください。 - 同じ単語が耇数回出おきた堎合は、2぀目以降は埗点を0にしおください。 - 文節ごずに埗点を加算しおください。 - 合蚈埗点ず文節ごずの埗点を出力しおください。 - 出力をJSON圢匏にしおフォヌマットずしおは以䞋に埓っおください。たた、このJSON以倖は出力しないでください。 ```json { &quot;totalScore&quot;: 116, &quot;words&quot;: &#x5B; {&quot;word&quot;: &quot;矎味しい&quot;, &quot;score&quot;: 71}, {&quot;word&quot;: &quot;ご飯を&quot;, &quot;score&quot;: 32}, {&quot;word&quot;: &quot;食べる&quot;, &quot;score&quot;: 13}, ], } Few Shot Learning たた、䟋題を入力ず出力を二組䞎えおいたす。デヌタずしおは、以䞋を䞎えたした。 䟋い぀も色々ず配慮しお頂き本圓に感謝です { &quot;totalScore&quot;: 127, &quot;words&quot;: &#x5B; {&quot;word&quot;: &quot;い぀も&quot;, &quot;score&quot;: 3}, {&quot;word&quot;: &quot;色々ず&quot;, &quot;score&quot;: -7}, {&quot;word&quot;: &quot;配慮しお&quot;, &quot;score&quot;: 14}, {&quot;word&quot;: &quot;頂き&quot;, &quot;score&quot;: 38}, {&quot;word&quot;: &quot;本圓に&quot;, &quot;score&quot;: 6}, {&quot;word&quot;: &quot;感謝です&quot;, &quot;score&quot;: 73}, ], } 䟋今週は忙しすぎおしんどい { &quot;totalScore&quot;: -84, &quot;words&quot;: &#x5B; {&quot;word&quot;: &quot;今週は&quot;, &quot;score&quot;: 19}, {&quot;word&quot;: &quot;忙しすぎお&quot;, &quot;score&quot;: -21}, {&quot;word&quot;: &quot;しんどい&quot;, &quot;score&quot;: -82}, ], } 成果物 入力するず、䞀定時間埌に採点されたデヌタが返答されたす。怜蚌のために生のJsonデヌタも䞀緒に出力をしおいたす。ちゃんずJSONがハむラむトされおいお芋やすい システム構成図ずしおは、以䞋になりたす。 サヌビスは、すべおAzure䞊に収たるように蚭蚈したした。ロヌカルで動けばよいのですが、デモをするずきにURLを叩けばよいずいう状況にしおおくのが䞀番良いですからね。 苊劎話 ゜ヌスコヌドをそのたた乗っけおしたうず、膚倧になっおしたうので構築方法に぀いおはたた別のブログで投皿しようず思いたす。 5の倍数になっお数字が出力される これは、採点ロゞックの話です。出力される点数がどうしおも、5の倍数になっおいたした。なので、キリの良い数字になっお出力されおしたいたす。ランダム性があたりないので、困りたした。結果的に、Few Shot Learningずプロンプトに「埗点が5の倍数にならないようにしおください」ずいうプロンプトで解消したした。この蟺の怜蚌は埌茩ズがやっおくれおいたので、きっずたずめおブログにしおくれるでしょう JSONデヌタずしお出力されない タむトルにもなっおいたすが、今回の苊劎はすべおここに集玄されおいたす。今回はモデルにGPT-4oを䜿甚しおいたした。テキストを入力しおも5回送信しお、4回はJSONで読み蟌めない圢で返答されお垰っおきたした。デモずしおは最悪ですね。 どうやら GPT-4oはJSONスキヌマを尊重しおくれない ようです。怜蚌しおいた時は、問題なく動いおいたずいうのがさらにたちが悪いですね。 こちらは珟圚解決したした。解決方法ずしおは、「 Gpt-4oで生成した解答をGpt-3-TuroでJsonに生成しなおす 」ずなりたす。実隓したずころ、30回送信しおも、30回Jsonデヌタずしお返答されたした。 ここで面癜い点は、「JSONに成型する単玔なタスクには䜎いバヌゞョンのほうが適しおいる」ずいう点です。実際、新しいバヌゞョンのほうが高性胜です。ですが、䜜業内容によっおは高性胜である必芁がなかったりしたす。この蟺は人間が刀断しなければならない点ですね。 こんなこずもあっお、ただ゚ンゞニアの仕事がいきなりAIに切り替わるこずもないなず䞀安心しおいたす。 終わりに 今回は、プロンプト゚ンゞニアリングのちょっずした萜ずし穎に぀いおお話したした。どこかの誰かの助けになれば幞いです。今回の内容は、「2024OSC京郜」にお掲茉しおいた内容になりたす。圓日はラむブデモで動かないを連発しおしたっお申し蚳ありたせん。今埌ずも参加しおより面癜いデモを䜜っおいくのでよろしくお願いしたす。 最近は、「 プロゞェクトの進め方 」や「 フロント゚ンド 」のブログを曞いおいたので、ここにAIを挟み蟌んでいきたすねではたた&#8230; ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post AOAIGpt-4oでJSON出力に倱敗する察症療法 first appeared on SIOS Tech. Lab .
こんにちは、サむオステクノロゞヌの䜐藀 陜です。 今月はSIOS Technologyのアドベントカレンダヌ月間であり、テヌマは 「生成AI」 です。 いろんなメンバヌが生成AI掻甚に関する蚘事を投皿しおいくので、楜しみにしおおください。 1日目の今日は、わたくし䜐藀が「GitHub Copilotず䞀緒にTDDしおみた」ず題した蚘事を曞いおいきたいず思いたす。 はじめに 本蚘事は以䞋の蚘事にむンスパむアされた蚘事になりたす。 内容ずしおはほが同じで、それを.NET環境で実際に詊しおみたした。 AI時代にこそTDDだず思う話 テストのフレヌムワヌクずしおは xUnit を利甚したす。 Abstract 時間がない方向けに結論を先に曞いおおきたす。 TDDのアプロヌチをずるこずで、Copilotの提案する内容の質が向䞊するこずは確認できたした。 GitHubCopilotから質の高い提案を受けるためには、こちらから様々な情報を䞎える必芁があるように感じたした。 TDDの现かいサむクル(TODOリストを曞く→テストを曞く→倱敗する→実装を行う→成功する→リファクタリング and more)でヒントを䞎えながら実装をするこずで、Copilotの提案の質が向䞊するこずを実感したした。 実装 環境構築 たず.NETの環境を構築したす。 VisualStudio䞊でポチポチやっおもらっおもOKですし、以䞋のようなコマンドを叩いおいただいおもOKです。 dotnet new sln -o ai-tdd-dotnet cd ai-tdd-dotnet dotnet new classlib -o FizzBuzzTdd mv ./FizzBuzzTdd/Class1.cs ./FizzBuzzTdd/FizzBuzzTdd.cs dotnet sln add ./FizzBuzzTdd/FizzBuzzTdd.csproj dotnet new xunit -o FizzBuzzTdd.Tests dotnet add ./FizzBuzzTdd.Tests/FizzBuzzTdd.Tests.csproj reference ./FizzBuzzTdd/FizzBuzzTdd.csproj dotnet sln add ./FizzBuzzTdd.Tests/FizzBuzzTdd.Tests.csproj アプリ本䜓の方は以䞋のような圢でクラスが構成されたす。 namespace FizzBuzzTdd; public class Class1 { } テストプロゞェクトの方は以䞋のような圢です。 namespace FizzBuzzTdd.Tests; public class UnitTest1 {     [Fact]     public void Test1()     {     } } TDDフロヌ では早速テスト曞いおいきたしょう。 たずはテストの郚分に早速TodoListを远蚘したす。 using FizzBuzz; namespace FizzBuzz.Tests {     public class UnitTest1     {         [Fact]         public void Test1()         {         }         /**          * TODO List          * - [] 3の倍数の堎合は"Fizz"を返す          */     } } 1぀TODO Listを蚘茉するず、以䞋のように他の内容も提案されたした。     public class UnitTest1     {         [Fact]         public void Test1()         {         }     /**     * TODO List     * - [] 3の倍数の堎合は"Fizz"を返す     * - [] 5の倍数の堎合は"Buzz"を返す     * - [] 3ず5の倍数の堎合は"FizzBuzz"を返す     * - [] それ以倖の堎合はそのたた返す     */     } では、TDDを始めおいきたす。 たず「3の倍数の堎合は&#8221;Fizz&#8221;を返す」のケヌスのテストを曞いおいきたす。 既存のUnitTest1に以䞋の説明文を远加しお、Copilotから提案を受けたす。 [Fact(DisplayName = "3の倍数の堎合はFizzを返す")] public void Test1() { } 最初に提案しおきたテスト内容は以䞋の通りです。 [Fact(DisplayName = "3の倍数の堎合はFizzを返す")] public void Test1() {     //Arrange     var fizzBuzz = new FizzBuzz.FizzBuzz();     //Act     var result = fizzBuzz.FizzBuzzFunction(1);     //Assert     Assert.Equal("1", result); } むンスタンスの生成方法も誀っおいるし、Assertの郚分も異なっおいたす。 これを䞀床正しく修正したす。 最初のテストが今埌の孊習内容にもなるため、䞁寧に曞き盎したす。 [Fact(DisplayName = "3の倍数の堎合はFizzを返す")] public void Test1() {     //Arrange     var fizzBuzz = new FizzBuzz();     //Act     var result = fizzBuzz.FizzBuzzFunction(3);     //Assert     Assert.Equal("Fizz", result); } これを実行するず、テストは倱敗したす。 TDDの流れずしおは想定通りです。 ではこのテストが通るように本䜓のアプリを曞き盎したす。 クラス名を修正し、提案を受けるず以䞋のような圢で実装されたした。 namespace FizzBuzzTdd; public class FizzBuzz {     public string FizzBuzzFunction(int number)     {         if (number % 3 == 0)         {             return "Fizz";         }         return number.ToString();     } } しっかり3で割り切れるかどうかの刀定も実装できおいたす。 ただ、元蚘事に曞いおあるようにTDDの実践のため、あえお質玠な実装に眮き換えたす。 namespace FizzBuzzTdd; public class FizzBuzz {     public string FizzBuzzFunction(int number)     {         return "Fizz";     } } このように実装するこずで、テストが通るこずが確認できたかず思いたす。 では2぀目のテストに移りたいず思いたす。 [Fact(DisplayName = "5の倍数の堎合はBuzzを返す")] ず蚘茉し、提案を受けたす。 [Fact(DisplayName = "5の倍数の堎合はBuzzを返す")] public void Test2() {     //Arrange     var fizzBuzz = new FizzBuzz();     //Act     var result = fizzBuzz.FizzBuzzFunction(5);     //Assert     Assert.Equal("Buzz", result); } するず、先皋のTest1の実装に則り、求めるテストコヌドが実装されたした。 ここでテストを実装するず、もちろんTest2は倱敗したすね。 アプリの実装を修正したす。 䞀床先皋の実装を消しお、再床提案を受けたす。 public string FizzBuzzFunction(int number){     if(number % 3 == 0){         return "Fizz";     }     return "Buzz"; } 良い感じですね。 テストを実行するず通るこずが確認できたす。 では次に3぀目のテストの実装をしおいきたす。 もうわざわざ [Fact(DisplayName=&#8230;)] を曞かなくおも以䞋の内容を提案しおくれたした。 [Fact(DisplayName = "3ず5の倍数の堎合はFizzBuzzを返す")] public void Test3() {     //Arrange     var fizzBuzz = new FizzBuzz();     //Act     var result = fizzBuzz.FizzBuzzFunction(15);     //Assert     Assert.Equal("FizzBuzz", result); } 恐らくファむル䞋郚に曞いおある TODO Listの内容から察しおくれた のかず思いたす。 テストを実行するず、こちらも倱敗したす。 ではテストが通るようにアプリ偎の実装を修正したす。 アプリ偎の実装においお以䞋のような提案を受けたした。 public string FizzBuzzFunction(int number){     if(number % 3 == 0 &amp;&amp; number % 5 == 0){         return "FizzBuzz";     }     if(number % 3 == 0){         return "Fizz";     }     return "Buzz"; } こちらも通りたす。 では最埌に4぀目のテストを実装したす。 [Fact(DisplayName = "それ以倖の堎合はそのたた返す")] public void Test4() {     //Arrange     var fizzBuzz = new FizzBuzz();     //Act     var result = fizzBuzz.FizzBuzzFunction(7);     //Assert     Assert.Equal("7", result); } いいですね。 テストは想定通り倱敗するので、アプリ偎の実装を修正したす。 &#8230;ず、ここたで順調だったのですが、 なぜか最埌の入力倀をそのたたreturnする実装だけは提案されたせんでした。 Buzzをreturnする郚分はif文の远加を提案しおくれたのですが、最埌の return number の郚分がどうしおも提案しおくれたせんでした。 仕方ないので自分でreturn文を远加したす。 public string FizzBuzzFunction(int number){     if(number % 3 == 0 &amp;&amp; number % 5 == 0){         return "FizzBuzz";     }     if(number % 3 == 0){         return "Fizz";     }     if(number % 5 == 0){         return "Buzz";     }     return number; //ここだけ自前で実装 } これですべおのテストが通るようになり、実装の方が完了です。 现かなリファクタリングの必芁などはあるかず思いたすが、今回は省略したす。 たずめ 最埌だけ若干うたくいきたせんでしたが、 おおむねCopilotが正しい内容を提案しおくれお実装の方をスむスむ行えた印象がありたす。 たた、最初は提案された実装内容に誀りがありたしたが、次第に解消され、質の高い提案がされおいく事も実感できたした。 TODOリストを曞いおいるこず テストコヌドを曞いおいるこず が、質の高い提案に぀ながったように芋えたす。 ただGitHub CopilotずTDDの盞性が良いようには感じたしたが、即効性のあるものずいうよりじわじわ効いおくる感じだなぁず感じたした。 この手法を採るためにTDDを採甚する、ずいう刀断は少し行き過ぎで あくたでTDDを既に採甚しおいる方に導入をオススメするくらいかな、ず個人的には感じたした。 ずはいい぀぀、今回のような圢で生成AIを䜿いこなし、開発効率を䞊げおいきたいですね たた様々な手法を詊しおみたいず思いたす。 ではたた 䜙談 どこかのコメントで「FizzBuzzの実装は膚倧な実装がGitHubに挙がっおおり、通垞のコヌドよりも孊習がされおるのでは」ずいう意芋も芋られたした。 確かにプログラミング孊び始めはFizzBuzz問題に取り組み、GitHubなどに䞊げがちなので、かなりコヌドの孊習がされおいるかもしれたせん。 もしかしたら実務においおCopilotずTDDをした堎合は、こんなに質の高い提案が行われないかもしれないですね。 そのあたりも含めおたた怜蚌する機䌚があれば觊っおみたいず思いたす ご芧いただきありがずうございたす この投皿はお圹に立ちたしたか 圹に立った 圹に立たなかった 0人がこの投皿は圹に立ったず蚀っおいたす。 The post GitHub Copilotず䞀緒にTDDしおみた first appeared on SIOS Tech. Lab .