Photoruction工事中!

Photoructionの開発ブログです!

Vimの繰り返し操作まとめ

こんにちは。CREの田島です。

少し前からAI活用エディターのCursorが話題ですよね。

ただし、本記事は生まれたてエディターCursorについてではなく、リリース32周年を迎えたVimについての記事になっていますので注意です。

「AIを活用した」なんて甘美な響きではありませんが、Vimにも魅力的な個性が多いですよね。

キーバインドがその代表かと思いますが、「繰り返し操作のやりやすさ」もそのひとつかなと思ったので、Vimの繰り返し操作についてまとめました。

直前の変更を繰り返す

.(ドット)を使います。

例えば、ddで一行削除した後に、.を押すと一行削除が繰り返されます。

直前のExコマンドを繰り返す

@:を使います。

例えば、:vsでウィンドウを分割した後に、@:とするとさらにウィンドウを分割します。(この場合、:vsをもう一度入力する方が楽かもですが、例として)

履歴からExコマンドを繰り返す

q:を使います。

Exコマンドの履歴と一緒にコマンドラインウィンドウを表示します。

履歴を編集してExコマンドを実行することも可能です。

履歴から検索を繰り返す

q/,q?を使います。

検索履歴と一緒にコマンドラインウィンドウを表示します。

履歴を編集して検索をすることも可能です。

(検索には正規表現を使用できますが、クセがあります)

直前の置換を繰り返す

:&&を使います。(:&&の場合、現在行のみに作用します。)

以下のテキストを編集するとします。

Photoructionは建設業の生産性向上を目的としたクラウドサービスです。
テクノロジーとオペレーションの力で10倍を超える業務効率化を実現します。
大手ゼネコンをはじめ、100,000を超える建設プロジェクトで導入されている国内最大規模のサービスです。

私たちが考えるのは常に建設業で働く皆様のことです。
主力サービスである建設生産支援クラウドPhotoructionは、
リリースして3年半ほどで100,000を超える建設プロジェクトで使われるようになりました。

3行目の100,000を200,000へ置換した後、7行目も同様に置換したい場合は、:&&とすればOKです。

↓入力キーの例

3G
V:s/100,000/200,000/g
7G
:&&

ひとまとまりの操作を繰り返す

1~10の連番生成を例にします。

レジスタaに記録し、それを繰り返します。

↓入力キーの例

i1<Esc>
qa
yyp<C-a>
q
8@a

(単純な連番生成ならマクロ使わない方が楽です)

↓入力キーの例

yy9P
VG
g<C-a>

直前に実行したマクロを繰り返す

@@を使います。

直前に記録したマクロを実行したい場合は、Qです。

まとめ

これらの繰り返し操作がコーディングの中で使われることは稀だと思います。

ただ、エディターとしてではなく、テキスト整形ツールとして見たとき、これらの操作が輝ける瞬間があるかもしれません。

株式会社フォトラクションでは一緒に働く仲間を募集しています

AI開発の特徴とチーム雰囲気のご紹介!

こんにちは!

株式会社フォトラクション デジタルOpsグループでプロダクトマネージャーをしている若井です。

私の所属するデジタルOpsグループは、AI技術であるかどうかに関わらず、様々な技術を駆使して、建設BPOメニューにおけるオペレーターの作業自動化・効率化のためのシステム開発や研究開発などを担っています。

今回は、AI技術を用いた開発について、これまで経験してきた観点から、どんな特徴があるのか、チームの雰囲気を交えて紹介します。

AI開発の特徴

1.不確実性

  • モデル精度の不確実性

    AIプロジェクトは、開発するAIモデルの精度が読めず、それによってどのように学習するか、他の工夫を施して着地させに行くかなどと、次の工程の選択肢が状況に応じて変わります。

    また、100%完璧なAIを作ることは技術的に困難であり、最終的なAIモデルの精度によって、利用方法に対して柔軟に最終的な仕様を変える必要があります。

  • 開発工数の不確実性

    上記によって工程が変わるということは、進捗も大きく変動するため、予め定めるスケールジュール通り進めることはとても難易度が高く、常に開発スケジュール調整しつつ今やるべきことそうでないことの見極めがとても重要になります。

2.必然ゆるアジャ (ゆるいアジャイルの略)

  • 週1~2回の定例

    開発したAIモデルの精度は、定例の中でチームで共有し、エンジニアをはじめチーム全体で、精度改善のための仮説や意見を出し合い、次の学習や前処理、後処理などへの施策を決定したりします。

    AIモデルの学習時間は長く、開発期間はもちろん、コストやGPUなど使えるリソースにも限りがあり、その中で何を試し実行するか、試す価値の高い(優先度の高い、費用対効果の高そうな)施策から試行していく必要があります。

    そのため必然的にゆるアジャになります。(※去年のアドカレで田中さんが提唱したゆるラム(=ゆるいスクラム)なるもの)

  • 開発精度によって変わる施策

    まず前提として、開発前に目的とする機能に応じて期待する精度の水準は異なります。例えば、概算見積に利用するAIであれば8,9割程度の精度で良いかもしれませんが、正式見積の場合は完璧である必要があるなど、同じ90%の成果でも用途に応じて許容できる範囲は異なります。また、一度やってみないとどの程度の精度がでるのかどうかは未知に近いため、想定と異なった場合の切り替えや事前にあらゆる予想をしておきプロジェクトの方向性をコントロールすることはAI系のプロジェクトマネジメントにおいてとても重視すべき点だと感じています。

    また、開発したモデル精度に応じて、追加学習するのか、別のアプローチで補填しにいくのか判断する施策も異なってきます。

3.必要なスキルセット

  • ハードスキル

    • AI・コンピュータービジョンなどの技術知識

      AIエンジニアといってもDeepLearingや機械学習についての理解があればいいというわけではなく、目的を果たすにはどのような技術を選定するか(AIを使わなくても十分かどうか)という視点が必要です。

      AI(教師あり)であればどのようなモデルを採用し、どのようにチューニングして学習させていくか(データ処理や損失関数、最適化関数など)を判断していく能力が必要です。

    • ドメイン知識

      特に弊社のような建設に特化したAIやその他自動化のための機能開発を行うチームでは、当たり前のことですがドメインの知識は必要不可欠です。

      例えば、医療や金融、製造業などにおけるAIまたは機械学習エンジニアには高精度かつ汎用性の高い効果的な機能開発にはドメインの知識は非常に重要です。

      その点において、弊社のAIを開発するチーム(デジタルOpsグループ)は建設業出身者または大学で建築を専攻していメンバーが大半で、図面の解読や建設プロセス全体の理解などに通常AIエンジニアに比べて長けているのが特徴的です。

  • ソフトスキル

    • 問題解決力
      • 常に課題や問題を見つける姿勢で物事を見て、その課題を一つ一つ解決していくためにPDCAサイクルを進めていくことは、DeepLearnigなどの場合技術的限度はあるにしても、例えば不得意データを集中的に学習データとして利用するなどで高精度で汎用的な機能の実現に向かいます。
    • 柔軟性
      • 開発進捗と状況に応じた施策の決定が必要です。
      • 特定の技術などの手段にとらわれずにあらゆる手法の中から最適な手法を導き出すことはとても重要で、それらを事前に調査する能力も必要です。

デジタルOpsチーム紹介

AI開発において、上記のような力が求められますが、幸いにも私は恵まれた環境でPMをしており、対処や方向性についてリードしてくれる心強いメンバーに囲まれています。

  • リーダー:要件定義も開発も方向性を支えてくれ、最終的に泣きついたら絶対大丈夫な解決策をもらえて心強いです。
  • PM:普段の仕事はBPOメニューの要件定義、プロジェクトの進捗管理をしています。
  • エンジニア:技術面はもちろん、PMの視点(建設の理解や運用後を考慮した仕様)も意識して、解決策やアイデアを出してくれて心強いです。
  • QA:AIワークの品質を保つためデータ作成やテストケース、テスト自体に注力してくれて、いつも助けられてます。

こんな感じで色んな人に支えられながら、密接にコミュニケーションを交わしながら、開発していく雰囲気です。(というより、一方的に恵んでもらっているPMの構図でしたwww)

実際は、AIを使わない開発も多い

AIを使わなくても、画像処理技術で十分な精度が出る場合や、そもそもとして精度が伴わないシステムを作るときはAIを使わないプロジェクトも多々あります。

AIが適切かどうかは、許容される精度や、学習できるデータ量、開発工数、コストなど、あらゆる判断材料から決めます。

大事なのはAI(DeepLearnigや機械学習など)という技術は、建設業をスマートにする上であくまで手段に過ぎないということです。

なんでもかんでもAIを使おうとすることは、芝刈り機があるのにわざわざチェンソーを使って芝を刈っているようなものですね。


以上、デジタルOpsの開発雰囲気とAI開発の特徴について、お伝えできましたでしょうか?


まとめ

AI開発の特徴

デジタルOpsチーム雰囲気

  • 心理的安全性が高く、互いに尊重
  • OpsとデジタルOpsで部署を超えたコミュニケーション
  • PMは恵まれている
株式会社フォトラクションでは一緒に働く仲間を募集しています

デジタルOpsチームへインタビューしてみた。

皆さんこんにちは、CREチームのとよかずです!

今回は、前回の続きとなるインタビュー形式での記事となっております👏

インタビューに協力いただいたのは…

デジタルOpsチームです!!!

普段、デジ推とは関わる事がないので、実際どういう業務をしているのか僕自身あまり知りませんでした💦

しかし、インタビューをしていく中で、チームカラーだったり、チームリーダーの菊池さんの素顔だったり、メンバーとの関係性だったり、他部署にいては決して見られないであろう部分をたくさん見させてもらいました🥺

チームの方々の人柄もわかる内容となっておりますので、ぜひ見ていってください✨

前回のインタビューが気になる方はこちら↓↓↓

kojichu.photoruction.com

✨デジタルOpsへのインタビュー✨

とよかず:それではさっそく始めていきたいと思います!まず始めに、御三方の簡単な自己紹介をお願いします🙇‍♀️

菊池:デジタルOpsグループのチームリーダーの菊池です。

大学では建築を専攻していました。在学中に独学で機械学習・DeepLearningを学び、その後インターンとしてフォトラクション(当時concore's)にジョインしました。大学卒業後にそのまま社員として入社し、建築におけるAIの研究と開発を行うこのグループを一から築き、グループリーダーとして活動しています。

志賀:デジタルOpsグループのAIエンジニア志賀です。

大学卒業後に大手IT企業に入社し、約1年半ほどSalesforceの導入支援業務に務めていました。その最中に、AIにとても興味を持つようになり、前職を退職し、AI開発について学べるスクールに通いました。そこから、4年ほど前にフォトラクションに入社し、いまでは建築を専門とするAIの設計から開発を一通り担当しています。

若井:同じくデジタルOpsグループのPdM若井です。

大学で建築を先行しており、前職では約3年ほど建築積算を行なっていました。AIにとても興味があり、AIについて学べるスクールに通い論文実装などを経験しました。そこから、前職退職し約︎4年ほど前にフォトラクションへ入社し、今は建築とAIのプロダクトにおけるPdMを主として企画、要件定義を担当しています。

Q.デジタルOpsチームでの業務について教えて下さい!

菊池:主な業務としては、建設業界のBPOサービスを提供しています。大まかにいうと、お客様から依頼された業務についてオペレーションを通して作業実行していきますが、これを担当するのがオペレーターです。そして、デジタルOpsチームでは、機械学習やDeepLearningなどの技術も駆使してそのオペレーターの業務を自動化可能にするシステムの構築を担っています。機械学習ディープラーニングに限らず画像処理やその他プログラミング技術などを含み、様々な手段で業務の自動化を進めるためのプロダクトを開発しているのが、我々の主な業務になります。

Q.そもそもなぜ、業務効率化をする必要があるのでしょう?

菊池:日本全体の社会問題として少子高齢化という問題があり、この問題が建設業界でも深刻化しています。そこに加え、”3K”といわれるイメージもあり、人が集まりにくく、人材の確保が難しい業界となっています。建設業界の現状の課題に対して、我々はBPO事業を通じてアウトソーシングの形でサービスを提供します。お客様のお仕事を代行させていただくことにより、その時間を他の業務に充ててもらうことで、一人当たりの生産性を高めてもらえるように努めています。

ただ、我々がお客様のお仕事を担わせていただく上で、人海戦術的にリソースを割くわけにもいかず、より効率的に少ない人数で、多くの生産性を出すことが事業として求められます。そこで、AIなどのプログラミング技術を活用して業務の自動化をはかるAI BPOが必要となっています。

とよかず:少子高齢化の問題は、建設業界では喫緊の課題の一つであり、それを解消するための先駆けとしてまずはAIを導入して、生産性向上を目指していこうってことなんですね〜

わかりやすい説明ありがとうございます🙇‍♀️

次に、チームについての質問に移りたいと思います!

TSイベントの時の菊池さん

Q.メンバーから見た普段の菊池さんは、どんな人ですか??

志賀:自分は菊池さんと同年代になるのですが、同年代にはなかなかいないタイプだなと思っています。親しみやすいだけでなく、組織の中でのBPO事業のあり方を常に考えていて、優秀!の一言に尽きます。

例えば、我々エンジニアが組織に貢献しようとするとできることとしては、BPO事業の作業効率を如何にして上げるかを考える事になります。作業効率だけに留まらず、事業全体を通して重要な売り上げを増やす戦略やオペレーション全体の作業効率を上げる戦略の両方などを包括的に管理できる人材の一人ではないかなと私は考えています。

若井:志賀さんの言う通り、菊池さんは役割を超えて色々なことをやっていますね。デジタルopsやオペレーションなど、役職を超えてあらゆる範囲を管轄しています。メニュー企画チームの部分をカバーしたり、配筋検査メニューの売り上げを上げるための施策を考えたり、様々な人を支えてるので、私からしたらチームリーダー以上の存在に思えます。

志賀:それは確かにありますね!

まだBPO事業が始まったばかりの頃は、開発側とオペレーションのコミュニケーションが上手くいってない部分があったのですが、そういった点も菊池さんがお互いのチームのシナジーを生み出せるように動いていたのが印象的でした。

とよかず:菊池さんの人柄から、仕事の姿勢まで幅広く教えてくれてありがとうございます!

社内でも、菊池さんは何をやっている人なのか分かりづらい部分があったので(色々やりすぎて)そういった意味で、だいぶ解像度が上がってきました!

菊池:実際、BPO事業って一つの事業部みたいな感じになっているので、SaaSチームとは別にデジタルOps専任のテスターの方もいたりします。TS部として一つの括りになっていますが、別のサービスを提供してるようなものなので、普段関わりがないとどんな事をやっているのか分かりづらい部分はあると思いますね〜

とよかず:僕は普段、他の部署の方と絡む機会が多いのですが、中々AIチームの方達と絡む機会はなかったので、組織内でのAIチームの位置付けを知ることができよりクリアになりました!

逆に、お伺いしたいのが…

Q.菊池さんから見たメンバーの印象はどうですか?

菊池:デジタルOpsのメンバーは、チーム愛がすごく高く、和気あいあいとしています。ちゃんと業務の中でコミュニケーションも取り合えるし、たまに誰かと誰かがぶつかちゃったりもしてますが(翌日何事もなかったように仲直りしてる笑)、何より同じ方向を見れているなと感じます。自分としては非常にやりやすいです(笑)

みんな協力的ですし、自分の仕事さえ良ければいいやみたいな考え方を持ってる人が一人もいなくて、誰かが苦しんでたり、辛そうにしていたら助けたり、一緒に解決するにはどうすればいいかを考えられたり、フォロワーシップの精神をみんなが持っている印象です。

とよかず:いいですね〜

僕は今回質問をしてるだけですけど、お互い信頼してる感じを間近で見れるのもこのポジションならではなので、この企画様様って感じです(笑)

菊池:普段こういう事をチーム内で話さないんですけど、言わずもがなで信頼しあっている感じはあると思います!

志賀:コロナになる前は、出社だったのでそういった部分も大きいかもですね。

菊池:確かにそれはあるね〜

オフラインだからこそ、そういった関係を作れた部分はあるかなと思います。今の人たちは、オンライン上でやり取りしないといけないと思うので、オンライン前提でチーム構成組み立てるのは結構大変そう…

とよかず:テレワークだと、どうしてもマンパワー的な部分は必要になってきますよね。リーダーのみならず、メンバー側も協力しないとチームを作っていくって難しい部分あると思います。

志賀:あと、うちは結構飲み会も多いかもですね!

とよかず:(最高です🥹)

Q.組織に対して、デジタルOpsとしてはこれからどう貢献していきたいですか?

菊池:今後のデジタルOpsチームの組織的な立ち位置とか、どういう構成にしていくべきかなどBPO事業はまだ始まったばかりというのもあり、よめない部分もありますが、少し脱線した話をすると…

例えば、ChatGPTのようなチャットツールはUI部分こそシンプルな作りでありながら、その背後にある技術力によって、非常に高度な機能を提供できるようになっています。これをphotoructionに置き換えると、極端な話しボタン一つで建物が立つようになることがサービスとして目指すべき場所になるのかなと考えています。今のレベルだとできないことが、1年後、2年後と進むにつれて、もっとレベルは高くなり、さらに学習ができ、より高度な事を行えるようになる。これを建設業界に用いることで、提供するサービスをよりシンプルにし、『建設の世界を限りなくスマート』にするというビジョンをより具体化できると思います。

つまり、デジタルOpsでは今までの技術力を活かして、今よりも高度で汎用的に課題を解決できるようにすることが組織と建設業そのものに対しての貢献であり、目指すべき方向だと考えています。

とよかず:まだフォトラクションのことを全て知ってるわけじゃないですが、色々お話を聞いてちょっと未来のフォトラクションを見た気がします。とても勉強になりました、ありがとうございます!

おわりに

今回は、デジタルOpsのインタビューをさせてもらいましたが、チームリーダーとメンバー間の信頼の深さを知ることができ、様々な質問をする中で、とても素晴らしいチームコミュニケーションを見せていただきました!笑

インタビュー形式だと、普段の雰囲気がモロにでると思うので、そういうチーム形成ができている事が本当にすごい事だなと感じましたし、一人一人のメンバーがチームを作っていこうとしてるからこそのチームカラーだったと思います!

ぜひまたインタビューさせてください!ありがとうございました✨

株式会社フォトラクションでは一緒に働く仲間を募集しています

Laravel Collection: 業務でよく使うメソッドを解説

はじめに

Webエンジニアの春冨です。

フォトラクションに今年の7月に転職してから初めてLaravelを使って開発をしてます。

Laravelには便利な機能がいっぱいあって覚えるのが大変ですが、その中でもCollectionクラス(Illuminate\Support\Collection)がとても便利だったので紹介しようと思います。

LaravelのCollectionとは

LaravelのCollectionは、PHPで利用可能な配列操作をより書きやすく使いやすくするためのラッパーです。

また、Collectionはメソッドチェーンを使用して複数の操作を一連の流れで簡潔に記述できるため、コードの可動性が向上することも期待できます。

では実際に業務などでよく使用するメソッドをいくつか見ていきましょう。

ちなみにCollectionで使用できる全メソッドはLaravelの公式ドキュメントに載っているので、そちらも参考にしてください。

map

mapメソッドとは、コレクション内の各要素に対して指定されたコールバック関数を適用し、その結果から新しいコレクションを作成して返します。

例)

以下の例ではコレクションの各要素の値を使用して新しくインスタンスを生成しています。

このように各要素の値を使用して新しいものを作成したり、値を変換したりするのによく使用します。

$collection = collect([
    ['name' => 'yamada', 'age' => 20],
    ['name' => 'tanaka', 'age' => 25]
]);

$users = $collection->map(function ($user) {
    return new User($user['name'], $user['age']);
});

// 結果
[
  UserA {#6360
    +name: "yamada",
    +age: 20,
  },
  UserA {#6391
    +name: "tanaka",
    +age: 25,
  },
]
  

注意点としてはmapメソッドは元のコレクションを変更するのではなく、新しいコレクションを返すので結果は変数に入れるなどする必要があります。

filter

filterメソッドとは、コレクション内の各要素に対して指定されたコールバック関数を適用し、その結果がTrueのものを返します。

例)

以下の例ではageが20より大きいものだけを返すようにしてます。

このようにある条件を満たしたものだけを取得するときに使用します。

バリデーションチェックをして結果がTrueのものだけが欲しいみたいなシーンで使用したりします。

$collection = collect([
    ['name' => 'yamada', 'age' => 20],
    ['name' => 'tanaka', 'age' => 25]
]);

$result = $collection->filter(function ($item) {
    return $item['age'] > 20;
});

// 結果
[
  1 => [
    "name" => "tanaka",
    "age" => 25,
  ],
]
  

every

everyメソッドとは、コレクションの全要素に対して指定されたコールバック関数を適用し、その結果が全てTrueになるかを判定します。全てTrueになった場合はTrue、1つでもFalseがある場合はFalseを返します。

例)

以下の例ではコレクションの全ての要素のageが30より小さいかを判定しています。全て30より小さいので結果はTrueになります。

コレクション内の要素がある条件に対して全てTrueである必要があるため、例えば全ての要素がバリデーションチェックに通る必要があるシーンなどに使用します。

$collection = collect([
    ['name' => 'yamada', 'age' => 20],
    ['name' => 'tanaka', 'age' => 25],
    ['name' => 'satou', 'age' => 28]
]);

$result = $collection->every(function ($item) {
    return $item['age'] < 30;
});

// 結果
true

pluck

pluckメソッドとは、指定したキーの値をコレクションから取得します。

例)

以下の例ではコレクションからnameの値のみを取得してます。

第2引数を指定することで値をkey => valueの形で取得することもできます。ただし、注意点として第1引数がvalue、第2引数がkeyになります。

DBからデータを取得してきたときにある特定のカラムの値だけが欲しい時に使用することが多いです。

$collection = collect([
    ['name' => 'yamada', 'age' => 20],
    ['name' => 'tanaka', 'age' => 25],
    ['name' => 'satou', 'age' => 28]
]);

$result = $collection->pluck('name');

// 結果
[
  "yamada",
  "tanaka",
  "satou",
],
  

$result = $collection->pluck('age', 'name');

// 結果
[
  "yamada" => 20,
  "tanaka" => 25,
  "satou" => 28,
]
  

groupBy

groupByメソッドとは、指定したキーによりコレクションの各要素をグループにまとめます。

また、キーにコールバック関数を渡してその結果でグルーピングすることも可能です。

例)

以下の例ではキーにageを指定することで、ageが同じ値のものでグルーピングしてます。

groupByはグルーピングして終わりではなく、ある特定の値でグルーピングをした後に、その値に対して何か操作を実行するといった使い方が多いです。

$collection = collect([
    ['name' => 'yamada', 'age' => 20],
    ['name' => 'tanaka', 'age' => 20],
    ['name' => 'satou', 'age' => 28]
]);

$result = $collection->groupBy('age');

// 結果
[
  20 => [
    [
      "name" => "yamada",
      "age" => 20,
    ],
    [
      "name" => "tanaka",
      "age" => 20,
    ],
  ],
  28 => [
    [
      "name" => "satou",
      "age" => 28,
    ],
  ],
]
  

sortBy

sortByメソッドとは、指定したキーでコレクションをソートします。注意点としてはソート済みのコレクションは元の配列のキーを保持します。なのでキーをリセットするにはvaluesメソッドを呼ぶ必要があります。

また、第2引数に、ソートフラグを渡すことでソートの動作を調整できます。

例)

以下のようにキーを指定することでそのキーを使ってソートすることができます。ソートは昇順になるので降順でソートをしたい場合はsortByDesc()を使用します。

$collection = collect([
    ['name' => 'yamada', 'age' => 25],
    ['name' => 'tanaka', 'age' => 20],
    ['name' => 'satou', 'age' => 28]
]);

$result = $collection->sortBy('age')->values();

// 結果
[
  1 => [
    "name" => "tanaka",
    "age" => 25,
  ],
]

unique

uniqueメソッドは、コレクションの重複を取り除いた結果を返します。ネストした配列やオブジェクトを使用する場合は一意であることを決めるキーを指定する必要があります。

例)

以下の例のように一意にしたいキーを指定することで、その値が重複しているものを取り除いたコレクションを返します。

ある処理を実行するときに、同じ値に対して実行する必要がないときはuniqueでデータを絞ったりします。

$collection = collect([
    ['name' => 'yamada', 'age' => 25],
    ['name' => 'tanaka', 'age' => 20],
    ['name' => 'satou', 'age' => 25]
]);

$result = $collection->unique('age');

// 結果
[
  [
    "name" => "yamada",
    "age" => 25,
  ],
  [
    "name" => "tanaka",
    "age" => 20,
  ],
],

最後に

LaravelのCollectionについていくつか紹介しましたが、Collectionのメソッドはまだまだたくさんあります。

配列を使って複雑な操作をする場合は、もしかすると使えそうなメソッドが見つかるかもしれないので是非公式ドキュメントも読んでみてください!

株式会社フォトラクションでは一緒に働く仲間を募集しています

ChatGPTのカスタム指示を使ってみた

はじめに

こんにちは、AIエンジニアの志賀です。

このたびはChatGPTのカスタム指示に関する技術ブログをご覧いただきありがとうございます。

このブログでは、巷で流行しているChatGPTの、カスタム指示という機能を実際に使ってみた感想をお伝えできればと思います。

カスタム指示について

ChatGPTのUIを利用する際に、カスタム指示を使うことで対話や回答のカスタマイズが可能になります。

次のような手順でカスタム指示を行うことができます。

ChatGPTのUI内でカスタム指示を設定する手順は、直感的で簡単です。

自身のグーグルアカウントマークをクリックすると、カスタム指示というボタンが表示されます。

このボタンを選択すると、カスタム指示をChatGPTに入力する欄が表示されるので、カスタム指示を入力していきます。

カスタム指示を使ってみた

まずは、カスタム指示を設定しない状況で、ChatGPTに質問してみます。

私:

「経済」について具体例を使って説明してください。

ChatGPT:

経済は、資源や財貨の生産、分配、消費などに関わる人々や企業、政府などの活動全般を指します。具体例を挙げると、例えば貿易が経済において重要な要素です。国々がお互いの財貨やサービスを交換することで、それぞれの国の経済が発展したり、必要なものを得たりすることができます。例えば、日本が自動車をアメリカに輸出し、代わりにアメリカからは農産物を輸入することで、お互いの需要や供給を満たしあうことができます。

また、金融政策も経済に大きな影響を与えます。政府や中央銀行金利や貨幣の供給量などを調整することで、経済の成長を促進したり、インフレーションを抑制したりすることができます。例えば、金利を引き下げることで貸し出しを促進し、消費や投資を刺激することができます。

このように、経済は貿易や金融政策などの様々な要素によって影響を受けます。

次に、以下のようにカスタム指示を行ってみました。

ChatGPTにあなたについて何を知らせれば、より良い応答を提供できると思いますか?

⇒私は小学生です。

ChatGPTにどのように応答してほしいですか?

⇒小学生なので、小学生にも理解できるように説明してください。

設定後、再度ChatGPTに質問します。

私:

「経済」について具体例を使って説明してください。

ChatGPT:

経済にはいくつもの側面がありますが、例えばインフレーションという概念を考えてみましょう。インフレーションは、一般的に物価の上昇を指し、経済全体の物価水準が持続的に上昇する状態です。

例えば、住宅市場でのインフレーションを考えてみましょう。需給の変化や建設材料のコスト増加などにより、住宅価格が上昇します。これにより、同じ賃金を受け取る人々が住宅を購入することが難しくなります。住宅価格の上昇により、多くの場合、家を購入するために借り入れる必要が生じます。これが借入金利も上昇させ、さらに負担を増やす可能性があります。

また、インフレーションが継続的に高い水準で推移すると、消費者の購買力が減少する可能性があります。物価が上昇すると、同じ額のお金で購入できるものが減少するため、消費者は同じ生活水準を維持するためにより多くのお金を必要とします。

政府や中央銀行は、インフレーションを管理するために金融政策を調整します。金利の変更や貨幣供給の調整などを行い、インフレーションを抑制することを目指します。

この例では、インフレーションが経済に及ぼす影響を示しています。物価の上昇が消費者や市場にどのような影響を与えるかを理解することは、経済活動や政策について深く考える上で重要です。

残念ながら、小学生であるという設定があまり考慮されていません。

そこで、次のように質問します。

私:

カスタム指示が適用されていますか?私は小学生ですよ?

ChatGPT:

申し訳ありません、深い経済の話題はちょっと難しいですよね。もっと分かりやすい例を使って説明しましょう。例えば、お小遣いの使い方で経済を考えることができます。

たとえば、お小遣いを使ってお菓子を買う場合、お菓子の値段が上がると、同じお金では今まで買えた量よりも少ないお菓子しか買えなくなりますよね?これがインフレーションです。お菓子の値段が上がることで、同じお金では買える量が減ってしまうんです。

でもね、お小遣いをうまく管理して、お菓子だけでなく本やおもちゃも買えるようにするためには、お金を使うタイミングやどんなものを買うかを考えることが大切です。経済は、お金を上手に使って物事を計画することなんだよ。

チャットで指示することで、やっと小学生であることを考慮した回答になりました。

流石に、これで適用されたと思い、再度質問してみました。

私:

「経済」について具体例を使って説明してください。

ChatGPT:

もちろんです。例えば、農業の経済的な側面を考えてみましょう。農業は、経済において非常に重要な役割を果たしています。

農業では、作物の生産とそれらの作物を市場に提供することが主な活動です。例えば、米作りを考えてみましょう。農家が米を栽培し、それを市場に出荷して売ることで、消費者が米を購入できます。

経済的な観点では、農業には供給と需要の要素が関与します。例えば、米の需要が高まると、米の価格も上昇することがあります。これは需要が供給を上回ったために起こることが多いです。

一方、天候や農業技術の進歩などの要因により、作物の供給量が増減することもあります。例えば、天候が不順で作物の収穫量が減少すると、供給が減少し、価格が上昇する可能性があります。

さらに、農業は雇用の面でも重要です。多くの人々が農業に関わり、農作業を行うことで生計を立てています。農業が順調に行われることで、雇用が維持され、地域経済全体に影響を与えます。

このように、農業は経済において供給と需要、価格の変動、雇用の面など様々な要素を含む重要な分野です。

またも、小学生であることが考慮された回答になりませんでした。

カスタム指示を使ってみた感想

私が使用しているのが、ChatGPT3.5である事もあるかと思いますが、率直に言って、現段階では、実用的であるとは感じませんでした。

今後、ChatGPTがより進化して、カスタム指示がきちんと適用されるようになれば嬉しいですね。

終わりに

いかがでしたでしょうか。

もしかすると、カスタム指示の出し方によっては、ChatGPT3.5でも、有効に活用できるのかもしれません。

非常に簡単に試すことができるので、是非みなさんも試してみてください。

株式会社フォトラクションでは一緒に働く仲間を募集しています

Slackのスレッドに予約投稿する方法(ノーコード)

こんにちは。QAエンジニアの山本です。 この記事では、Slackのスレッドに予約投稿する方法を共有します。

概要

Slackのスレッドに予約投稿したいメッセージを、スプレッドシートに記載しておくと、Zapierが自動で予約投稿するシステムを作成します(^^)/

事前に準備して頂きたいもの

  • Googleアカウント
  • Slackアカウント
  • Zapierアカウント
  • SlackのワークスペースにZapierがインストールされていること

スプレッドシート・Zapierの作成手順

スプレッドシート

最初に、スプレッドシートを作成します。 完成イメージは、下記です。

スプレッドシートの完成イメージ
スプレッドシートの完成イメージ

作成手順

  1. 新規ファイルを作成します
  2. 完成イメージを参考に、1行目の項目名を入力します
  3. A列の予約IDの入力をします
  4. A~E列を枠線で囲みます
  5. G列に下記関数を入力します(見本は2行目の値です)
    =REGEXREPLACE(REGEXREPLACE($B2,".*archives/",""),"/.*","")
  6. H列に下記関数を入力します(見本は2行目の値です)
    =REGEXMATCH(REGEXREPLACE($B2,".*archives/",""),"/")
  7. I列に下記関数を入力します(見本は2行目の値です)
    =REGEXMATCH($B2,"thread_ts")
  8. J列に下記関数を入力します(見本は2行目の値です)
    =IF(AND($H2,$I2=FALSE),REGEXREPLACE($B2,".*archives/.*/p",""),"")
  9. K列に下記関数を入力します(見本は2行目の値です)
    =LEFT($J2,10)
  10. L列に下記関数を入力します(見本は2行目の値です)
    =RIGHT($J2,6)
  11. M列に下記関数を入力します(見本は2行目の値です)
    =IFS($I2,REGEXREPLACE(REGEXREPLACE($B2,".*thread_ts=",""),"&.*",""),$H2,CONCATENATE($K2,".",$L2),TRUE,"")
  12. O2のセルに下記関数を入力します
    =TEXT(NOW(),"YYYY-MM-DD")
  13. P2のセルに下記関数を入力します
    =TEXT(NOW(),"HH")
  14. Q2のセルに下記関数を入力します
    =COUNTIFS(D2:D100,O2,E2:E100,P2)
  15. R2のセルに下記関数を入力します
    =IFERROR(QUERY(A2:M100, "select C,G,M where D = date '"&O2&"' and E = "&P2&""),"")

スプレッドシートは、上記で完成です!

Zapier

次に、Zapierを作成します。 完成イメージは、下記です。

Zapierの完成イメージ
Zapierの完成イメージ

作成手順

最初にCreate a Zap画面で、下記のような文章を入力し、「Generate」をクリックします

Create a Zap画面
Create a Zap画面

英文の例:Once every hour, send values from Spreadsheet to the Slack thread

生成したアプリを開きます。

1. Zapの手順1に「Schedule by Zapier」を追加する

  1. App&eventで「Schedule by Zapier」を選択する
  2. Eventで「Every hour」を選択する
  3. Trigger>Trigger on weekendsで「no」を選択する
  4. Testを実行する

2. Zapの手順2に「Get Many Spreadsheet Rows 」を追加する

  1. App&eventで「Google Sheets」を選択する
  2. Eventで「Get Many Spreadsheet Rows 」を選択する
  3. Accountで自分のGoogleアカウントを選択する
  4. Action>Driveで上記のスプレッドシートが格納されているDriveを選択する
  5. Action>Spreadsheetで、上記のスプレッドシートを選択する ※スプレッドシートを検索する時は、スプレッドシートIDで検索する https://docs.google.com/spreadsheets/d/(スプレッドシートID)/edit#gid=0
  6. Action>Worksheetで、上記のスプレッドシートのシート名を選択する
  7. Action>Columnsに「Q:Q」を入力する
  8. Action>Row Countに「1」を入力する
  9. Action>First Rowに「2」を入力する
  10. Testを実行する

3. Zapの手順3に「Filter by Zapier」を追加する

  1. Appで「Filter by Zapier」を選択する
  2. Filter setup & testingで下記を選択する
    Filter by Zapier画面
    Filter by Zapier画面

4. Zapの手順4に「Get Many Spreadsheet Rows 」を追加する

  1. App&eventで「Google Sheets」を選択する
  2. Eventで「Get Many Spreadsheet Rows 」を選択する
  3. Accountで自分のGoogleアカウントを選択する
  4. Action>Driveで上記のスプレッドシートが格納されているDriveを選択する
  5. Action>Spreadsheetで、上記のスプレッドシートを選択する
  6. Action>Worksheetで、上記のスプレッドシートのシート名を選択する
  7. Action>Columnsに「R:T」を入力する
  8. Action>Row Countで下記画像の値を選択する
    Action&gt;Row Countの値
    Action>Row Countの値
  9. Action>First Rowに「2」を入力する
  10. Testを実行する

5. Zapの手順5に「Looping by Zapier」を追加する

  1. App&eventで「Looping by Zapier」を選択する
  2. Eventで「Create Loop From Line Items」を選択する
  3. Action > Line itemsで下記画像の値を選択する
    Action &gt; Line itemsの値
    Action > Line itemsの値
  4. Testを実行する

6. Zapの手順6に「Send Channel Message」を追加する

  1. App&eventで「Slack」を選択する
  2. Eventで「Send Channel Message」を選択する
  3. Accountで自分のSlackアカウントを選択する
  4. Action>Channel・Message Textに下記を選択する
    Action&gt;Channel・Message Textの値
    Action>Channel・Message Textの値
  5. Threadで下記画像の値を選択する
    Threadの値
    Threadの値
  6. Testを実行する
    ※送信予定のメッセージが2個以上ある時でも、Testでは1個のメッセージしか送信されない

7. Timezoneを日本の時間に変更する

  1. サイドメニューのDetailsアイコンをクリックする
  2. Timezoneを「GMT+09:00 Asia/Tokyo」に変更する

8. 「Publish」をクリックする

完成!!

株式会社フォトラクションでは一緒に働く仲間を募集しています

CREチームへインタビューしてみた。

みなさんこんにちは、CREチームのとよかずです!

運営担当である僕がアドカレ1本目の記事を執筆していくことになりました(緊張)

どんな記事にしようかあれこれ悩んでいたのですが、自分が所属してるチームのことを改めて知ってもらう機会を設けてもいいのかなと思い、今回はCREチームへのインタビューを記事にしてみました!👏

✨CREチームへのインタビュー✨

とよかず:それでは早速始めていきたいと思います!自分が所属するチームに対して、インタビューするのはなんだか不思議な気分ですが、最後までお付き合いください(笑) まず始めに、各メンバー自己紹介をお願いします🙇‍♀️

田中(以下、よしき):CREグループのチームリーダーを務めます田中です。

未経験エンジニアとしてフォトラクションに入社しており、1年半ほど改修や案件をこなしたりしたのち、去年の11月からCREのチームリーダーを務めています。現在、フォトラクションに勤めて3年目になります。

豊田(以下、とよひろ):CREグループの豊田です。

新卒で住友林業に入社し、3年間の営業経験を積みました。タジくんと同じく、当時同業界への課題感を感じていました。以前は全く異なる分野でエンジニアとして活動していましたが、建設業界における社会への貢献と課題解決への志から、フォトラクションに転身しました。

田島(以下、タジ):CREグループの田島です。

元々、サブコンで施工管理者として働いており、同業界への課題感を感じたこと、またエンジニアの職種に興味を持ったことからフォトラクションへ入社しました。とよかずさんと同じく未経験からエンジニアとしてCREチームに入りまして、ちょうど半年たったくらいになります。

※とよかず入社エントリーはこちら↓↓↓

kojichu.photoruction.com

Q.CREチームでの業務について教えて下さい!

よしき:主な業務としては、お客様からの問い合わせ内容(仕様の確認・調査依頼など)に対して、『どんな事象が起きているのか』『どういう操作をしたら再現がするのか』『なぜそのような不具合が起きているのか』などの1次切り分けをするのが私たちの業務になります。

また、弊社では運用レポートというものをお客様に提出していますが、こういったデータの抽出や修正なども対応しております。なので、カスタマーサポート(以下、CS)とSaaSチーム(開発チーム)との架け橋的な存在がCREになります。

CREチームリーダー よしきさん

Q.そもそもなぜ、CREというチームが必要なのでしょう?

よしき:お客様からの問い合わせへの対応が主な業務になるとお話ししましたが、問い合わせって不確実性の塊だなと思っていてそこにCREチームのような一定のエンジニアリング知識を持った人たちが、介入することによって、不確実なものを確実なものにしていくということが必要になってきます。そうすることで、CS側からの不具合の問い合わせをスムーズにSaaSチームにお渡しすることもできますし、そもそもCREチームで解決できる内容であれば、ユーザー様へのレスポンスも早くなるため結果としてユーザー様の知りたい情報を素早く提供でき、顧客満足度向上に影響を与える事ができると考えています。そのためユーザー様に少しでも長くフォトラクションというプロダクトを使用いただくためにも、CREというチームが必要だと考えています。

とよかず:ユーザー様からしたら、とにかく早くレスポンスが欲しいですもんね。仮にCREというチームが存在しないことを考えるとユーザー様への影響しかり、社内関係各所でも色んなところで、悲鳴の声が上がりそうです…

ちなみに、CREポジションで働く皆様に質問があるのですが…

Q.ずばりCREの業務について、意識してることを聞かせてください!

よしき:意識してることとしては、バランスよくタスクを振るような心がけをしています。現在CREに所属してるみなさんは、いずれSaaSチームに送り出す事が開発組織で決まっているので、そのためにも調査タスクだけでなく改修タスクもこなしていってもらうことで、プロダクトの理解を深めつつ、技術力向上を目指していってほしいので、そういった意味合いから、偏りがないように気をつけてはいます。

また、エンジニアとしての成長という観点からCREチームでは2週に1回、勉強会という時間も設けています。各々がわからない部分やもっと深掘りしたい部分などを共有し、それについて議論したり、お互いの技術力を向上させていこうという目的のもと、教材となる本をチームで読み進めたりしながら、技術の理解を深めたりしています。

僕のは、どちらかというとリーダー視点の話しですね(笑)

←とよひろさん よしきさん→

とよひろ:CREでは「こういうバグがありました、不具合があります」という問い合わせが来てそれに対応するフローですが、その問い合わせから「ユーザーが本当に求めていることは何か」、「機能としてはこうなった方がいいんじゃないか?」などユーザー目線に立って、考えるように意識はしています。また、ユーザーに近いからこそSaaSチームにも見えない部分を見ることがCREの業務の一つかなと思っています。

タジ:UIパーツの呼称がそれぞれのユーザー様で異なるので、その点を汲み取る事を意識してます。例えば、UIパーツにオン/オフするボタンをエンジニアだとトグルボタンと言ったりしますが、人によっては「スイッチ」といったりするので、呼称の違いを確認し、事実がなにであるかを確認していくことを意識しています。

もう一つ、ユーザーの操作動線の確認も意識してるポイントになります。自分たちはコードベースで動線を考えるため、「前提としてこうだよね」って考え方があり、そこがユーザー様の動線と異なる事があるので、その点も意識してたりします。

とよかず:CREって、プロダクト探偵っぽいですよね〜

問題があって、仮説を立てて検証して、原因を特定していくって、まさに探偵っぽいなと思ってます(笑)

ちなみに僕が意識してることとしては、CSとSaaSとの間に僕らのチームがいるので、CS側に伝わる話し方とエンジニアに伝わる話し方を分けるようにしていて、認識の齟齬が出ないように余分な情報を取り除くことでクリアなコミュニケーションを意識してたりします。

タジ:確かに、通訳っぽい面もありますね

よしき:探偵兼通訳ですね…(ボソッ)

とよかず:職種増えましたね(笑)

業務については、お話しいただけたので、今度はチームについて伺いたいのですが…

Q.チーム作りにおいて意識してる取り組みなどありますか?

考えるよしきさん

よしき:CREには現在、業務委託の方を含め7名在籍しているのですが、各々別々の調査タスクをやっているため、そこで分かったことや詰まっていることなどを朝のデイリーの時間で共有してもら

うことで、一人で抱え込まないチームづくりを意識してはいます。またその時間で、他の人が触った機能についてのシェアをするなどして、情報共有を活発にするような取り組みを行っています。

とよかず:確かに、デイリーがあることによって、自分が触っていないタスクについても、頭の片隅には置いてあって、自分がその機能触る時に初見じゃない感はありますね〜

タジくんはその点、意識してることなどありますか?

タジ:質問内容とは少し違うのですが、デイリーについて話しをすると、CREメンバーが増えたことで、デイリーの時間が延びてしまっている問題はありますね。

一同:(確かに!!!)

よしき:個人がこなしてるタスクについては共有をして、それ以外の個人で共有したい事項については、また別の時間で共有する方がいいかもね〜

ということで、早速これをデイリーで取り入れていこうと思います!

とよかず:(まさに、最速挙動💨)

こういった疑問に感じたことや思っていることをその場で発信して、それをすぐに実行→改善できるのがCREチームの良さかもですね。お互いに敬意尊尚という価値観を持っているからこそ、職位関係なく自分の思っていることを伝えられる気がします。

Q.チーム内でのコラボレーションや情報共有の取り組みはありますか?

よしき:時たま発生するイレギュラータスクで、チームの絆というか、コミュニケーションが促進されている感じはありますね〜

それ以外にも最近は、一人がタスクを抱え込まないようなやり方も試していて、2人1組でタスクにあたってもらうようなことも試していたりします。調査といえど、それぞれのやり方や着眼点があったりするので、そういったところはお互いに刺激しあって、学んでいってもらいたい点になります。

とよかず:実際、自分以外の人のやり方って知る機会があまりないので、2人1組の取り組みはありがたいです。

Q.今後のCREチームとしての展望や目標について教えてください。

よしき:度々いってることになるのですが、チームの目標として「安定化」と「成長」というのを掲げており、安定化については「三方良し」を実現できればいいなと思っています。CREにおける三方良しとは、CRE・SaaS・CSかなと思ってまして、CS側については社内での体制変化もあり、注力してた部分はあるのですが、SaaSチームとの連携がうまくいかない部分があったので、その点を今後は注力しながら、お互いにスムーズに仕事を進めて行ければいいなと思います。

また成長については、チームとしての成長を目指しつつもメンバークラスの方々の成長を第一に考えています。CREチームでプロダクトへの理解を深めつつ、改修タスクなども行い、その中でエンジニアとしての成長を目指してもらい、最終的にはSaaSチームの一員となって第一線で活躍してもらいたいと考えています。そのためにも、一定の水準までスキルを伸ばせる仕組みを作っていくことが、今後の課題かなと思います。

最後は競馬の話で盛り上がっていました〜(笑)

おわりに

今回は自分のチームに対して、インタビューしましたが、改めて他のメンバーが意識してることを聞くことができ、自分の中での新しい気づきが増えました!その気づきを今後の業務の中でも積極的に意識していこうと思います!

これからもCREチームでは、ユーザー様に寄り添っていけるプロダクトを作れるようにチーム一丸となって業務に取り組んでいきたいと思いますので、応援のほどよろしくお願いします🙇‍♀️

株式会社フォトラクションでは一緒に働く仲間を募集しています