Excelマクロで仕事効率化(初心者向け)(1)

# はじめに
私は、某企業の情報システム部門に所属する社員です。
この会社では、ITやシステム延いてはマーケットのことを理解していない経営者が「DXへ進め!急げ!」などと社員に檄を飛ばしている状況で、本当に危機的状況だと感じています。
一方で、私も齢50を超える中年で、そろそろ定年退職後のことも本気で考えねばと思っています。
そんな中、今私はプログラミングに没頭しており、特に「生成AI」や「ChatGPT」のプログラミングに講じています。


# この記事を書くきっかけ

私の勤務先では、ほぼ100%の社員がプログラミングを書くことができません。
それ自体はそれほど大きな問題ではないのですが、社員が皆プログラムを書けないことで、「ラストONEマイル」(※)に苦労しており、多くの方々が毎日「Excel」や「Word」と格闘する羽目になっています。
社員の多くが、数十回もデータのコピー&ペーストを繰り返したり、Excelに大量のセル計算式を貼付けてファイルが重くなったり、合計値を出すセルの計算式で1セルだけ範囲から漏れていて、後でやり直しになったり(リワーク)という状況を多く見てきました。「DX」や「AI」が叫ばれている昨今ですが、現状はそれからは程遠く、ほとんどが泥臭い単純作業です。
 一つ具体的な例を挙げると、社内の月次締め処理を行う時、社員が夜遅くまで事務所に残って、データの目検チェックやデータ貼付けで大変苦しそうでした。先日はその手作業の誤りが元で、お客様に対して過大請求や過小請求をしてしまい、迷惑をかけていました。その社員は夜遅くまで責任感を持って一所懸命頑張ったのに、全く報われていないなぁと思いました。そうこうする内に、その社員のモチベーションは劇的に下がり、退職してしまいました。そりゃそうですよね、私でも同じ状況ならばそうなっちゃいます。
 
 この様な状況に至ったのは、会社で働く私たち自身の責任もあると感じています。今までにいろいろな単純作業が自動化されてきました。例えば、現在ではプレゼンテーションをOHP(知ってますか?)を使ってやる方はいないでしょう。ほとんどがPowerPointを使うかと思います。また、FAXもほとんどなくなってきており、電子メールで簡単に対応できるようになってきています。そのような恩恵を受けた私たちは、より高度で難易度の高い作業に時間を割かなければならなくなります。どんどん私たちがやるべき作業は高度な作業しかなくなるためです。私の勤務先では、社員のほとんどが「自動化をしたい!」「効率よい作業をしたい!」と言ってそれを高額なアプリケーション開発などで実現するのですが、裏を返すと効率化で得た余剰時間は、今以上価値ある高度な作業にシフトする必要があるのです。日本で働いている社員はそのことをほとんど理解していません。日本人は他国と比較して、高校や大学の卒業後に勉強やスキルアップをするために時間を割く人の割合が著しく低いという調査結果もあるようです。高校や大学に入ってしまえばあとは大丈夫、と安心してしまっているのかもしれません。私たちは自分が楽しく心豊かに生き続けるために、本気で次のステップのために学び続けなければならないと思います。
 
 日々の作業の効率化を図れる持つべき技能の1つが「プログラミング」だと思っています。かくいう私も以前は単純作業に追われて、次のステップに向けた勉強など全くできなかった時期もありました。ただ、現在では「プログラミング」により単純作業のほとんどを自動化することができるようになり、自身の記事を投稿したり、副業をしたりして、仕事を楽しみながら生きられるようになりました。
 
 「プログラミングを学べばええやん!」と簡単に思うかもしれませんが、最初は非常に多くのエネルギーを要します。私は大学生の時までプログラミングをしたことがなかったのですが、最初はプログラミングに関する単語や意味を理解できず苦労しましたし、理解できたとしても「立体的に」言っていることを理解できなかったため、応用が利かない状況に苦しんでいました。
 そんな苦しい期間が長く続くのであれば、誰だってプログラミングの習得はやめますよね・・・
 
 このような状況を加味して、「プログラミングを知らない初心者」「仕事で単純作業が多くて困っている人」「少しでも人生が楽になりたい人」が少しでも人生が楽しく・明るくなってほしいということで、連載記事を書くことにしました。
 

※ ここで言う「ラストONEマイル」は、システムと利用者の最後の区間のことを意味します。


# おわりに

次回は、「一括で請求書PDFの作成」をやってみたいと思います。
「電帳法」の法改正などで、複数の請求先に一括でPDFファイルを送ることになった方もたくさんいるかと思います。そのような方に、プログラムのサンプルを使ってもらい、少しでも作業が楽になってもらえたらと思っております。

ChatGPT/LangChainによるチャットシステム構築[実践]入門のプログラムを試す

 

# はじめに

 現在私は「LangChain」のプログラムに沼っており(若い人が使う言葉ですね)、今回は「ChatGPT/LangChainによるチャットシステム構築[実践]入門」を読んで、いろいろプログラミングをして楽しむことにしました。
 今まで私は「製造業の生産管理システム」や「プログラム言語の構文解析システム」など、いろいろなプログラミングをしてきたのですが、生成AI分野のように完全な正解が無く、常にアップデートしていくスタンスのものは初めてで、とても興味深いです。

 この書籍通りにプログラミングを進めてみたのですが、何度も失敗を繰り返し、何度も心が折れそうになりました。。。これから生成AI分野を目指す方々がこの書籍を読んで楽しくプログラミングができる一助になればと思い、記事の投稿をしました。

 

 

# 多くの地獄(壁)
 この書籍は2023年10月に発行されたもので、比較的新しいのですが、「LangChain」やその他のサービス仕様がバージョンアップしたため、そのままではまともにプログラムを動かすことができないことを知りました。
  書籍の発行後、「正誤表」でバージョンを固定されていることを確認したのですが、それでだけではやはり動きませんでした。
  今回は、特に難儀した2つの地獄(壁)について、どう解決したかを記載していきたいと思います。
  

# Slack地獄
 書籍の「なぜSlackアプリを作るのか」(P156)から始まる部分を参考に、ローカルPCでプログラムを実行させたのですが、SSLに関するエラーが発生しました。

```
Slack API server: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify
```

最初はSlackの設定の問題なのかなぁと思い、いろいろ試してみたのですが、全然ダメでした。

### 環境変数を疑う
 最初は環境変数の設定誤りを疑いました。キー名称の誤りではないだろうか、そもそもキーが間違っているのではないだろうか・・・ いろいろ試してみたのですが、全然ダメでした。
 この章を飛ばして次の章からプログラミングをしようと思ったのですが、その後の章ではSlackを用いていろいろやっていくようで、ここで躓いたらthe endになりそうです。ですので、これを何とかクリアしようと思いました。 中学生の時の数学のテストで、最初で間違っていたら、そのあとはすべてアウト・・・あの時の感情がよみがえってきました💦

 ```bash:.env
# 以下のキーはすべてでたらめです。悪しからず・・・
SLACK_SIGNING_SECRET=abevrey5436nb5tvtb6vttyb6bvt5tv55
SLACK_BOT_TOKEN=xoxb-87654468554645-5457645466654-6uhtrfytui7uy5erghyuteer
SLACK_APP_TOKEN=xapp-1-A0re454534MM-0898754456779-98iyhfgfjugjhhgghji7utyghtyh7uyhthutyhtyh6
 ```
 
### プロキシサーバを疑う
 次にプロキシサーバを疑いました。
 
 https://qiita.com/ground0state/items/c4d7caa274b6e3d99e27

 上記のような記事があったので、どないかせないかんと思い、試そうとしたのですが、私の頭の問題なのですがよく理解することができず、あきらめました。
  ただ、プロキシサーバは自動検出となっていたので、プロキシサーバ自体を外したりしたのですが、効果はありませんでした。

### プログラムを疑う
 次にプログラムを疑いました。ただ、疑おうにもどこを疑っていいのかがわかりません。
  記事をいろいろ探す中で、SSLのチェック自体を外す方法がある事がわかりました。

https://note.com/kinpatu_com/n/n6e9a40be13b9

```python:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
```
 設定して`app.py`を実行したのですが、あれれ・・・やっぱり同じエラーが出ました。だめだこりゃ。

### 証明書を疑う
 記事をいろいろ検索してみると、証明書の問題があるのではないかと思い始めました。その記事がこちらです。最後の部分で、環境変数に`SSL_CERT_FILE`を追加すればよいという記事があったので試してみました。
  `certifi`でpemファイルの位置を確認して、環境変数に追加をしました。

https://qiita.com/hayahaya2/items/d952455ff5fb20808262

 ```bash:.env
SSL_CERT_FILE='C:\users\・・・・・\cacert.pem'
 ```
 さあ`app.py`を実行です! ありゃ同じエラーだ。ああ、WindowsPCだからエスケープをつけなくちゃ。

 ```bash:.env
SSL_CERT_FILE='C:\\users\\・・・・・\\cacert.pem'
 ```
あれれ💦 それじゃ、カレントディレクトリにpemファイルを持ってきて、パスを考慮しなくても良いようにして実行。

```bash:.env
SSL_CERT_FILE='cacert.pem'
 ```
 
 あら、またエラーが出た。もうあきらめた方が良いのでしょうか・・・
 エラーが出てから丸1日経ってしまいました。😨

### ローカルPCを疑う
 書籍では、ローカルPCではなく「Cloud9」を使ってやっています。唯一の違いはそこかなぁと思い、「Cloud9」で試してみることにしました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/756c1320-9915-d268-10ae-df153f3a9771.png)

こんな感じです。これで再び実行です。
あらら・・また同じエラーが出てしまいました。

もう一度、pemファイルを「Cloud9」において、環境変数'SSL_CERT_FILE'にpemファイルを設定して実行しました。
やった!成功の証「Bolt app is running!」が表示されました。

```bash:
⚡️Bolt app is running!
```
これを待ってました。

# Pinecone地獄
 次に直面した地獄は「Pinecone」です。「Pinecone」は、ベクトルデータベースのSaaSであり、書籍の中でこれを利用します。
 ベクトルデータベースには、ローカルPCで構築できるものもあり、以前`Chroma` `Qdrant` `FAISS`を紹介させていただいたのですが、「Cloud9」の轍を踏むわけにはいかないので、今回はおとなしく書籍の手順に従うこととしました。

 https://qiita.com/ogi_kimura/items/d1d263ece0e23c7d7576

まず書籍に記載のある通りに実施してみたのですが、エラーが多発して全く動きませんでした。
いろいろサイトを調べてみると、`requirements.txt'に関する正誤表があり、バージョンを指定していることがわかりました。

https://github.com/yoshidashingo/langchain-book/blob/main/errata.md

これを踏まえて、改めて「Cloud9」で実行してみました。

```bash:
pip install -r requirements.txt
```

これで実行したのですが、ダメでした。ある程度覚悟はしていましたが・・・
ただ、エラーの数は減りました。

```bash:
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='controller.aaa-starter.pinecone.io', port=443): Max retries exceeded with url: /databases (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f05fb5b8bb0>: Failed to resolve 'controller.aaa-starter.pinecone.io' ([Errno -2] Name or service not known)"))
```

### 環境編須を疑う
環境変数を見ると`gcp`という文言があります。

```bash:.env
PINECONE_ENV=gcp-starter
```

一方、「Pinecone」ではフリーの場合だけかもしれませんが、「AWS」だけしか選べません。
設定後の「Pinecone」の画面はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/9dfdeaef-0a3b-1699-ec93-367d5681351c.png)

ここに問題があるのではないかと思いました。

じゃぁ`PINECONE_ENV`を`aws-starter`にすりゃいいんじゃない?と思い色々試しましたがダメでした。
ここで、書籍の212ページ目の「Pineconeへのテキストの重複登録」を改めてみてみました。

```python:recreate_index.py
import os

import pinecone
from dotenv import load_dotenv

load_dotenv()

pinecone.init(
    api_key=os.environ["PINECONE_API_KEY"],
    environment=os.environ["PINECONE_ENV"],
)

index_name = os.environ["PINECONE_INDEX"]

if index_name in pinecone.list_indexes():
    pinecone.delete_index(index_name)

pinecone.create_index(name=index_name, metric="cosine", dimension=1536)
```

LangChainのバージョンが上がりすぎてエラーになった時に検索したサイトのなかでも、このプログラムを実行すればよいということも書かれていたので、これを実行してリポジトリを作成することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/28088c2b-1fcc-7cd8-39cd-7ad64a50ad90.png)
おお、今度は`gcp`上にリポジトリができたようです。

では、改めて実行`app.py`を実行します。
今度はうまくいきました。地獄にはまってから解決まで半日かかりました・・・

# おわりに
 今回は特に苦労した2つの地獄について紹介しました。
 ただ、地獄はこれだけではなく、プチ地獄はたくさんありました。
 自分の技術力不足が起因するところも沢山ありましたので、そこは割愛します。
 
 この記事が、少しでも皆様のお役に立てればと思っております。

LangChainを用いて大量ファイルをロードするVectorDBを作ってみた(1)


# 私の経歴
現在、私は某ユーザ企業の情報システム部門に所属しています。いわゆる「情シス」です。

以前はソフトウェア会社に勤務をしてプログラミングやプロジェクト・リーダーなどをやっていましたが、ソフトウェア開発界隈では「バリュー」(ここでは難易度やお客様が喜んでくれる度合でしょうか)ではなく「人月」(ここではプログラムステップ数若しくは工数)での評価をしていることに漠然と不安を感ていました。
それは、私がそれほどプログラミングをできるわけでもなく、また歳もとってきており、ソフトウェア開発で働き続けることに未来があるのかなぁ、と思っていたからです。

そんなことを考えて、うっすら転職活動をしていた時に、とても素晴らしい経営理念を掲げているユーザ企業を見つけました。
「経営理念が素晴らしい会社は絶対優良な会社だ!」と思い、私はこの会社の「情シス」に転職することにしました。それが私が現在所属している会社です。

「情シス」という部署は初めてだったのですが、プログラミングや設計のスキルよりも、人とうまく折衝できること、「ノウハウ」ならぬ「ノウフー(know who)」(会社の中でこのことは誰が知っているかを分かっていること)が、非常に重要であることを理解しました。
私は人と話をすることがあまり得意ではなかったのですが、会社のいろいろな方々と打合せやお話をすることで、「私に向いている仕事かもしれない」と思ってきました。

ユーザ企業の中では、プログラミング、システム、ITのことを全く知らない方々が多く、少しマクロを組んだりすれば効率が劇的に上がる作業でも、手作業のために大変苦労していることも目の当たりにしてきました。
私は、日本の多くのユーザ企業では、ちょっとしたプログラム・マクロができるようになるだけで、本当にたくさんの方々が楽になると確信しています。
どのようにすれば、会社の皆さんが楽しく仕事の効率を上げることができるのか、現在いろいろ考えています。「RPA」や「ノーコード」などを導入している企業もあるようですが、習得するのにそれなりにハードルが高く、直ぐに浸透させるのは難しそうです。今後の私の課題として捉えています。

また一方で、会社の皆さんのメンタル的な課題も発生しています。例えば部署内の人間関係で悩んだり、仕事の効率が上がらないために上司や同僚から叱られたり。
私は、心理学のメソッドの1つである「NLP」(Neuro-Linguistic-Programming(神経言語プログラミング))を取り入れて、会社の皆さんが楽しく・安心して働けるように今画策しています。これについては追々お話しします。

こんなことを考えながら、日々お仕事をさせていただいています。


# LangChainをやってみようと思ったきっかけ

「LangChain」をやってみようと思ったのはつい最近(2023年12月頃)なのですが、そのきっかけは数年前に兄弟が立ち上げた会社の「Webプラットフォーム」のプログラミングのお手伝いをすることが始まりとなります。
当時(といっても6か月前)私はPythonのプログラミングは初めてで、生成AI(今回はChatGPT)のAPI利用方法も全く知りませんでした。
ただ、過去にプログラミングの経験があったので、何とかなるかなぁ~と思って引き受けました。


# このブログを書くことになった動機


私が考えた構想は、フォルダの中の非定型ファイル群を一気に読込み、その情報を利用して生成AIに問いかけをするという仕組みでした。すなわちタイトルにある「大量ファイルをロードするVectorDB」の実現です。
早速やってみようと思い、「Udemy」や「YouTube」を色々見てみましたが、「LangChain」を全く知らないことと、Pythonプログラミングもままならない状況でしたので、どこから手を付けてよいのか分からない状況でした。
そんな中、LangChainに関するとってもわかりやすい書籍を見つけました。それが「LangChat完全入門」です。
先ずはサンプルをそのままコーディングしてトライ&エラーを繰り返し、解説を読みながら少しずつ理解してきました。

ある程度コーディングをしていくと、「大量ファイルをロードするVectorDB」が作れるのでは?というようになりました。
また、いろいろなWebサイトをみても、1つのPDFファイルやtextファイルを基にVectorDBへ情報を蓄積させるものはありましたが、大量ファイルを蓄積させるものは、探すことができませんでした。
そこで、私の苦労の連続と共に「大量ファイルをロードするVectorDB」の作り方を執筆してはどうだろうと思ったのが今回のきっかけです。


### 本ブログについて



 

本ブログは、『LangChat完全入門』(田村悠 著)という書籍のサンプルプログラムを参考に、LangChainで大量ファイルを読込み、VectorDBに情報を蓄積させ、その情報を元に生成AIから回答をもらうプログラムを作成するまでのストーリーを何回かに分けて書いていこうと思います。
勿論、ここに記載している内容はノンフィクションです。

次回から、どのようにして「大量ファイルをロードするVectorDB」を作っていったのかを説明していきます。