Skip to content

Commit

Permalink
Merge pull request #1385 from future-architect/feature
Browse files Browse the repository at this point in the history
Feature
  • Loading branch information
ma91n authored Sep 5, 2024
2 parents 8817d76 + c30e780 commit ed7f488
Show file tree
Hide file tree
Showing 11 changed files with 155 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ lede: "生成AIが人気です。生成AIに対しては自然言語で指示を

途中で渡るデータ形式は決まっており、それに対するルールセットを書いていけばマッチするものを探して適用してくれるため、巨大なswitch文で解釈していく必要はありません。

一方で、パーサーコンビネータも自分でいざやってみようとすると情報が少なく結構大変です。パーサーコンビネータのAPIを見ると、テキストにマッチする関数、改行にマッチする関数、前方一致、グループ化など、正規表現チックなテキストマッチのツールセットがあります(takenocoだと、github.com/shellyln/takenoco/stringのパッケージが提供するAPI群)。これを使いこなそうとすると、細かい文法ルールに従った構文ルールを全部ゼロから実装する必要があります。Markdownでちょっと便利に設計ドキュメント書いて情報抽出したい、という程度のモチベーションなのに、Markdownパーサーをゼロから実装する手間がかかってしまうのは大変です。結果として大量のルールセットを実装する必要が出てきてしまいます。
一方で、パーサーコンビネータも自分でいざやってみようとすると情報が少なく結構大変です。パーサーコンビネータのAPIを見ると、テキストにマッチする関数、改行にマッチする関数、前方一致、グループ化など、正規表現チックなテキストマッチのツールセットがあります(takenocoだと、GitHub.com/shellyln/takenoco/stringのパッケージが提供するAPI群)。これを使いこなそうとすると、細かい文法ルールに従った構文ルールを全部ゼロから実装する必要があります。Markdownでちょっと便利に設計ドキュメント書いて情報抽出したい、という程度のモチベーションなのに、Markdownパーサーをゼロから実装する手間がかかってしまうのは大変です。結果として大量のルールセットを実装する必要が出てきてしまいます。

<img src="/images/20240819b/markdown-ページ2.drawio.png" alt="markdown-ページ2.drawio.png" width="661" height="441" loading="lazy">

Expand Down Expand Up @@ -71,7 +71,7 @@ source, err := io.ReadAll(f)
doc := md.Parser().Parse(text.NewReader(source))
```

takenocoは、AstSliceという一次元のトークン列に対して変換ロジックを適用していくことになります。AstSliceの各要素にはいくつかの属性があります。takenocoのパース処理は「この要素があるよ」という要素を書けば、それにマッチします。ただマッチするだけでは単にツリーの構造チェックでしかないので、マッチした結果を適切なClassとValueを持つAst要素に置き換えていく、というのが基本になります。
takenocoは、AstSliceという1次元のトークン列に対して変換ロジックを適用していくことになります。AstSliceの各要素にはいくつかの属性があります。takenocoのパース処理は「この要素があるよ」という要素を書けば、それにマッチします。ただマッチするだけでは単にツリーの構造チェックでしかないので、マッチした結果を適切なClassとValueを持つAst要素に置き換えていく、というのが基本になります。

* `Value any`: なんでも突っ込める。ここではgoldmarkのASTを入れている
* `Type`: ノードの種類(ただしここでは標準のstring系APIを使ってないので全部Anyにしている)
Expand Down Expand Up @@ -288,7 +288,7 @@ func documentTransform(_ ParserContext, asts AstSlice) (AstSlice, error) {
var documentParser = document()
```

今まで作成した要素を組み合わせたものが次のコードです。構文木の要素にルールを適用し、Transに渡した関数を呼び出しつつ、結果の構造体に結果を格納することができました
今まで作成した要素を組み合わせたものが次のコードです。構文木の要素にルールを適用し、Transに渡した関数を呼び出しつつ、結果の構造体に結果を格納できました

```go
// goldmarkのASTをフラットに変換
Expand Down Expand Up @@ -593,6 +593,6 @@ func documentTransform(_ ParserContext, asts AstSlice) (AstSlice, error) {
* テンプレートをもとにしたVSCodeの動的エラーチェック
* 将来的にはANTLRのルール定義からパーサーコンビネータのコードを生成

これぐらいの構文解析であれば、正規表現で書いても簡単だよ?と思われる方も多いと思います。しかし、コードブロックの中の#記号は表題として扱わないなどの例外処理を入れていくとすぐに複雑なコードになってしまいます。安全側に倒していくと、きちんとしたパーサーが必要になって、今回のようなロジックが必要になります。
これぐらいの構文解析であれば、正規表現で書いても簡単だよ? と思われる方も多いと思います。しかし、コードブロックの中の#記号は表題として扱わないなどの例外処理を入れていくとすぐに複雑なコードになってしまいます。安全側に倒していくと、きちんとしたパーサーが必要になって、今回のようなロジックが必要になります。

もちろん、文法とは別に、書き方のガイドラインを厳密に作ってそれに従わないのはエラーとするという方法もありますが、そのようなツール都合のルールは利用者にとってストレスです。文法上正しいテキストは余計な制約なく利用したいと思うのが人情です。
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ lede: "LLMが流行って久しいですが、MS、AWS、Googleクラウドベ
---
## 1. はじめに

LLMが流行って久しいですが、MS、AWS、Googleクラウドベンダ各社が自社のマネージドを利用したサンプルアプリを公開し始めているので、中の実装を見つつリファレンスとしての考え方を確認するための記事です。
LLMが流行って久しいですが、MS、AWS、Googleクラウドベンダー各社が自社のマネージドを利用したサンプルアプリを公開し始めているので、中の実装を見つつリファレンスとしての考え方を確認するための記事です。

次のサンプルコードを見ていきます。

Expand All @@ -31,7 +31,7 @@ LLMが流行って久しいですが、MS、AWS、Googleクラウドベンダ各

## 3. 構成

トップにMakefileが存在するため `make help` で「何ができて」「動くのか」予想もできます。
トップにMakefileが存在するため `make help` で「何ができて」「動くのか」予想もできます。

```bash make help結果
help 💬 This help message :)
Expand All @@ -51,6 +51,7 @@ destroy 🧨 Destroy everything in Azure

- パッケージ構成
全て掲載すると雑音になるので、要素別にトップレベルのみに絞っています

```sh
.
├── code
Expand Down Expand Up @@ -82,10 +83,10 @@ destroy 🧨 Destroy everything in Azure

|#|コード(or パス)|役割|
| ---- | ---- | ---- |
||code/backend/batch/get_conversation_response.py|画面からChatの質問を受けて、Azure OpenAIを呼び出しているFunction(get_conversation_response)|
||code/backend/batch/batch_push_results.py|ベクトルデータを作っているFunction(batch_push_results)|
||code/backend/pages|管理画面|
||code/backend/batch/utilities|共通処理|
|(1)|code/backend/batch/get_conversation_response.py|画面からChatの質問を受けて、Azure OpenAIを呼び出しているFunction(get_conversation_response)|
|(2)|code/backend/batch/batch_push_results.py|ベクトルデータを作っているFunction(batch_push_results)|
|(3)|code/backend/pages|管理画面|
|(4)|code/backend/batch/utilities|共通処理|

## 4. 詳細

Expand Down Expand Up @@ -121,7 +122,7 @@ Tool Callingの実装も入っているので、ハンズオンとしては学
|layout|recognizer|
|read|recognizer|
|web|langchain|
|docx|python-docx|
|docx|Python-docx|

#### 4.2.2. 分割(管理画面の`chunking_strategy`の設定)

Expand Down Expand Up @@ -158,4 +159,4 @@ searchServiceにindexを作ります。あまり特筆すべきところはな

## 5. 所感

ハンズオンレベルの私とはしては、初期でここまで動くソースを自由に使えるのは普通に嬉しいです。クラウドベンダもそれだけ自社のサービスを使って欲しいんだなと感じることができました
ハンズオンレベルの私とはしては、初期でここまで動くソースを自由に使えるのは普通に嬉しいです。クラウドベンダーもそれだけ自社のサービスを使って欲しいんだなと感じることができました
Original file line number Diff line number Diff line change
Expand Up @@ -26,24 +26,25 @@ lede: "人工知能学会全国大会2024で、物流関連の研究発表をし

# 登壇へのモチベーション

私は、2023年3月まで、[立教大学大学院人工知能科学研究科](https://ai.rikkyo.ac.jp/)に社会人院生として在籍し、AIを活用した物流最適化の研究を行ってきましたが、かねてから、人工知能学会全国大会への研究成果の投稿を一つの目標としてきました
私は、2023年3月まで、[立教大学大学院人工知能科学研究科](https://ai.rikkyo.ac.jp/)に社会人院生として在籍し、AIを活用した物流最適化の研究を行ってきましたが、かねてから、人工知能学会全国大会への研究成果の投稿を1つの目標としてきました

前職でロシアに駐在していた際、[ロシアの自動車物流カンファレンス](https://youtu.be/LS6ViMu5avM?si=PoOQ-WRz14pNTPdE&t=2513)に唯一の(単にめずらしい)日本人として登壇したことがあります。その際に身をもって経験したことは、講演会で登壇すると、聴講者の方から生のフィードバックをたくさん頂けるので、聴講する側よりも何百倍も何千倍も豊かな情報が得られるということでした。

研究とは新規性と有意性を追い求める「社会活動」ですので、とにかく成果を社会にアウトプットし(アウトプットしない研究は意味がない)、他の研究者の方から意見やクリティカルな批判を頂きたい!という希望が私の強いモチベーションでした。
研究とは新規性と有意性を追い求める「社会活動」ですので、とにかく成果を社会にアウトプットし(アウトプットしない研究は意味がない)、他の研究者の方から意見やクリティカルな批判を頂きたい! という希望が私の強いモチベーションでした。

<img src="/images/20240826a/DSC_0166.JPG" alt="" width="1200" height="675" loading="lazy">

# 当日の模様

私が52歳だからなのでしょう、会場の司会の方から「それでは、引網**先生**からの発表です」と紹介を受けまして、「いや、あのぉ、学生としての研究発表なんです」と伝えたところ、会場内になんとも言えない失笑が溢れまして、リラックスした雰囲気の中でプレゼンテーションを開始させて頂きました。

[私の研究](https://www.jstage.jst.go.jp/article/pjsai/JSAI2024/0/JSAI2024_4K3GS1002/_article/-char/ja/)は、倉庫現場を対象として、倉庫ロボットの作業時間の最小化と、作業員の作業時間の最小化で構成される「多目的非線形最適化問題」を量子アニーリングの基本モデルであるイジング模型を用いて求解し、倉庫センター長にとっての課題である、人にとってもロボットにとっても、最適な商品配置計画を明らかにしたものです。[過去のブログ](https://future-architect.github.io/articles/20240122a/)もご覧ください。

聴講してくださった方から、「他のアルゴリズムやSolverと比べて、求解に要する時間はどれだけ短縮されたのか?」「数理最適化と比べて、精度はどれほど良いのか?」「倉庫ロボットの台数が増加した場合にも汎用的に使えるのか?」といった鋭いご質問を頂きました。私の回答はたじたじでしたが、「質問は相手への最大の敬意」と言いますので、何よりご関心を寄せて頂いたことは本当にありがたかったです。ありがとうございました!
聴講してくださった方から、「他のアルゴリズムやSolverと比べて、求解に要する時間はどれだけ短縮されたのか?」「数理最適化と比べて、精度はどれほど良いのか?」「倉庫ロボットの台数が増加した場合にも汎用的に使えるのか?」といった鋭いご質問を頂きました。私の回答はたじたじでしたが、「質問は相手への最大の敬意」と言いますので、何よりご関心を寄せて頂いたことは本当にありがたかったです。ありがとうございました!

# 登壇してみて

実は、発表当日(5月31日)は、台風1号の影響により天気が悪く、「オンラインでの発表にしちゃおうかな。。。」という考えが頭をよぎったのですが、エイっと新幹線に飛び乗って、現地で発表してきて本当に良かったです。登壇することで、論文に纏めたり、プレゼンテーション資料を作成したり、質疑応答を準備したりと、自分の頭を整理することもできました。
実は、発表当日(5月31日)は、台風1号の影響により天気が悪く、「オンラインでの発表にしちゃおうかな」という考えが頭をよぎったのですが、エイっと新幹線に飛び乗って、現地で発表してきて本当に良かったです。登壇することで、論文に纏めたり、プレゼンテーション資料を作成したり、質疑応答を準備したりと、自分の頭を整理することもできました。

研究もしかり、仕事もしかり、いたずらに時間をかけて、完璧なモノを作り込んでからアウトプットするより、不完全なプロトタイプであっても、なるべく早期にアウトプットすることで、マーケットからのフィードバックをいち早く得て、短いサイクルでどんどん修正を繰り返していく、というスタイルが重要かなと思っています。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ lede: "2024年8月17日に発売された、[Software Design 2024年9月号]の

Go言語初心者から熟練者まで楽しんでいただける内容になっていると思います。

Go言語を利用する上でエラーハンドリングは必須の知識になるので、ぜひご一読ください。Goに馴染みのない方でもGo特有のエラー処理の方法を知ることで、普段触れている言語の理解を深めることができると思います。他言語と比較した、Go言語のエラーの特徴もみどころの一つです
Go言語を利用する上でエラーハンドリングは必須の知識になるので、ぜひご一読ください。Goに馴染みのない方でもGo特有のエラー処理の方法を知ることで、普段触れている言語の理解を深めることができると思います。他言語と比較した、Go言語のエラーの特徴もみどころの1つです

【第2特集】Goのエラーハンドリングと向き合う
第1章 Goのエラー処理を理解する/mattnさん
Expand All @@ -49,7 +49,7 @@ Go言語を利用する上でエラーハンドリングは必須の知識にな

[実用 Go言語](https://www.oreilly.co.jp/books/9784873119694/)」の著作である渋川に、技術評論社からお声かけいただいたことがきっかけになります。渋川がフューチャー社内で執筆希望者を募集しており、私は普段業務でGo言語を利用しているので、いい機会だと思い執筆に挑戦させてもらいました。

Software Designという権威ある雑誌への寄稿ということで、不安はありましたが、執筆未経験であっても社内有数のGo言語の有識者である渋川、真野からレビューをもらえるという安心感もあり執筆することになりました。挑戦してみたいが少し不安があると真野に相談したところ「渋川さんにレビューしてもらえるんだから、不安に思うことってある?せっかくの機会なのにやらない理由ってないよね」と言われその通りだと思った事を鮮明に覚えています。フューチャーでは若手であっても手を挙げれば、難しい事でも任せてもらえる機会が多いと思います。
Software Designという権威ある雑誌への寄稿ということで、不安はありましたが、執筆未経験であっても社内有数のGo言語の有識者である渋川、真野からレビューをもらえるという安心感もあり執筆することになりました。挑戦してみたいが少し不安があると真野に相談したところ「渋川さんにレビューしてもらえるんだから、不安に思うことってある? せっかくの機会なのにやらない理由ってないよね」と言われその通りだと思った事を鮮明に覚えています。フューチャーでは若手であっても手を挙げれば、難しい事でも任せてもらえる機会が多いと思います。

## 学んだこと

Expand Down
Loading

0 comments on commit ed7f488

Please sign in to comment.