PC故障したので開発を中断しています

題名の通りPCが故障しました( ;∀;) 使っていたのはこちらになります。 性能としてはに以下になります。 RAM: 16GB SSD: 512G 11世代 Core i5 GeForce RTX 3050 + Intel UHD Graphics 修理に関してはパソコン修理24に依頼しました。近場の店舗に問診票を提出したので返信が返ってきたら出してこようと思います。 もう一つPCホスピタルという場所もありましたが、値段が少しだけ高かったので見送りました。とはいえ5千円くらいですし、Googleの口コミだと悪い評価もあったので次回故障した場合はこっちに頼もうかと思いますが… 作ったものをGithubにしっかりとコミットしておけばよかったのですが、面倒だったのでやらなかったのが失敗でした。修理から帰ってきたら変更のたびにコミットしようと思います。 社内で作ったものであれば更新するたびにコミットしてますが、現場では修正が完了したらコミットなので見直した方がいいのかもしれないですね。 一応次回はFlaskを使ってpythonとNext.jsの受け渡しの部分を行おうと思っています。 また、前回Next.jsを選定した理由を書きましたが、コストの面について考えていなかったのでもしかしたらReactに変えるかもしれません。予定は未定です。 少し落ち込んでますが、この修理が完了するまではVRで遊んだり本を読んだりして日々を過ごそうかと思います。ではでは。

2024年4月24日

RAGを開発してみたい!ので簡単なものでもいいので作ってみよう!part5

さて前回までやったこととしては 全データのベクトル化(途中で断念) 画面の作成(Next.jsのインストールと起動) というところまでやってみました。今回は 質疑応答画面の作成 というところまでやってみます。Next.jsは初めて触るので進みが遅々としていますがご了承ください。 さてインストールするタイミングでこのようなことを聞かれました。 Would you like to use TypeScript? » No / Yes Would you like to use ESLint? » No / Yes Would you like to use src/ directory? » No / Yes 他にもいくつか聞かれたので一応Claudeにどんな意味があって導入することのメリットデメリットを聞きながら質問に答えました。大体Yesにしましたが… さて前回の画面表示まで行けたのでここからどう作業を進めればいいのかわかってなかったので聞いてみました。 ということで質疑応答画面を作っていきます。本格的なデザインは気にせずに簡易的なものを作っていきます。 と言ってもからコード書くのは大変ですし、学ぶのにも時間がかかるので今回もClaudeに手伝ってもらおうと思います。それで最初書いてもらったコードがこちら page.jsx import QuestionForm from './components/QuestionForm'; const HomePage = () => { return ( <div> <h1>RAGシステム</h1> <QuestionForm /> </div> ) } export default HomePage; QuestionForm.jsx import { useState } from 'react'; const QuestionForm = () => { const [question, setQuestion] = useState(''); const handleSubmit = (e) => { e.preventDefault(); // 質問をサブミットする処理をここに書く console.log('Submitted question:', question); setQuestion(''); } return ( <form onSubmit={handleSubmit}> <textarea value={question} onChange={(e) => setQuestion(e.target.value)} placeholder="質問を入力してください" rows={5} /> <button type="submit">送信</button> </form> ) } export default QuestionForm; ちなみに上記の書いてる内容はよくわかってないのでこっちはChat-GPTに解説してもらってました。新卒の時の研修で書いたHTMLやJSを思い出します。 ...

2024年4月22日

RAGを開発してみたい!ので簡単なものでもいいので作ってみよう!part4

前回で一通り作りたいものが作れたのでこの先はWebアプリ化できないかな~?という緩い感じで進めていこうと思います。 前回行ったのは 検索クエリのベクトル化 コサイン類似度の計算 今回行ったのは pdfファイルの全データベクトル化(途中で断念) Web画面の作成(一部) pdfファイルのベクトル化に関しては前回やったのでそれをfor文で回してます。pdfは1つ1つ出力するようにして、後ほど全体を結合しようとしていました。 file_path_list = glob.glob(input_pdf+'/*.pdf') for pdf_path in file_path_list: # 前回やったベクトル化 ・ ・ ・ # JSON形式でベクトルデータベースを保存 with open(json_save_name, 'w', encoding='utf-8') as file: json.dump(vector_database, file, ensure_ascii=False, indent=4) 大体2500ファイルぐらいベクトル化したのですが、9$くらいになってました。残り12000ファイルほどあるので少し時間がかかるのと料金も計50$近くになりそうだったのでいったん中断しました。 別の作業としてWeb画面を作っていこうと思ったのでまずは技術の選定からですね。ここに関してはChat-GPTとClaude両方に聞いてみましたが、Claudeのほうを採用しました。こんな感じです。Googleストアと書いたんですが1ミリも予定はないです(笑) 返ってきた回答がこちら ということでおすすめにしたがってNext.jsにしようと思います。ユーザーのストレスを考えるのは今じゃなくてもいいんですがせっかく自身のスキルにもつながるので選びました。 ちなみにおススメした理由とかわかってなかったのでいくつか聞いてみました。 なぜNext.js(React)+Tailwind CSS や Vue.js はreactに比べてユーザーにストレスがかかりにくいのですか? 単一ページアプリケーション(SPA)とはどういうものでしょうか? Flash Of Unstyled Content(FOUC)や、SPAでよくみられるバンク画面の発生とはどういったものでしょうか? バックエンドではpythonを使用しているのでpythonフレームワークのflaskやdjangoという選択肢もあったと思いますが、なぜ候補から外れたのでしょうか? フロントエンドフレームワークとバックエンドWebフレームワークの違いは何ですか? そこからいろいろ聞いていた結果、Next.jsとFlask(python)の組み合わせにしようと思います。Webについては全く分からなかったので色々聞いてみました。流れとしては以下の感じです。 Web画面から入力を受け取る 画面から受け取った入力を引数としてpythonに渡す pythonで引数をベクトル化しコサイン類似度の計算を行う pdfファイルを全てベクトル化して結合したものを取得して、入力に類似しているファイルのタイトルと内容を取得する 取得したタイトルと内容を画面に表示する 1と5がNext.js、2がflask、3と4がpythonという流れでやる予定で、今回は1をやっていきます。 というわけでまたClaudeに使い方を聞いて進めていきます。 これでインストールとプロジェクトの作成が完了して、デフォルトの画面が表示されるようになりました。こんな感じです。 私はvscodeを使っているのですがターミナルからうまく実行できてないので少し調べる必要がありますね。それから"AppData/Roaming"の中にnpmというファイルが必要なのですが、インストールで作成されなかったので手動で作成したりと少し導入で手間取ってしまいました。 今回はここまでにして次回は簡単な画面を作成していこうと思います。恐らく稚拙な画面になりそうですがまずは作るとこらからです。ではでは。

2024年4月19日

RAGを開発してみたい!ので簡単なものでもいいので作ってみよう!part3

このpartで目標としていた基本形は作れたことになります。簡単な質問で"タイトル"と"内容"が返ってくるものになります。 前回やったのは 特殊文字の削除 大文字小文字統一 ベクトル変換 今回行ったのは 検索クエリのベクトル化 コサイン類似度の計算 になります。ベクトル化に関しては前回も行ったので同じものになります。 # これが検索用の文字列 QUERY = '保険金が欲しい' # 検索用の文字列をベクトル化 query = openai.embeddings.create( model='text-embedding-3-large', input=QUERY ) # ベクトル取得 query = query.data[0].embedding ちなみにモデルの部分に関しては’text-embedding-3-large’の他に’text-embedding-3-small’もありますのでお好きな方を使ってください。精度はlargeのほうがいいですが料金は下がると思います。 次はコサイン類似度の計算になります。こちらは昔OpenAIでも提供されていたみたいですが、前のバージョンで提供されていたみたいなので他のもので代用します。簡単に自作できますがめんどくさい方はsklearnでも提供されているのでそちらを使ってください。 import numpy as np def cosine_similarity(v1, v2): # ベクトルのドット積 dot_product = np.dot(v1, v2) # ベクトルのノルム norm_v1 = np.linalg.norm(v1) norm_v2 = np.linalg.norm(v2) # コサイン類似度 similarity = dot_product / (norm_v1 * norm_v2) return similarity # 総当りで類似度を計算 results = map( lambda i: { 'title': i['title'], 'body': i['body'], # ここでクエリと各文章のコサイン類似度を計算 'similarity': cosine_similarity(i['embedding'], query) }, vector_database ) # コサイン類似度で降順(大きい順)にソート results = sorted(results, key=lambda i: i['similarity'], reverse=True) これで関連するファイルと内容が取得できます。‘result[0]‘であれば最も関連するもの、‘result[-1]‘であれば関連しないものあるいは反対のものになります。反対かどうかはコサイン類似度の値が負の値になってるかで確認できます。 ...

2024年4月14日

RAGを開発してみたい!ので簡単なものでもいいので作ってみよう!part2

このpartで基本が8割がた作れました。内容としては簡単な質問をすると"タイトル"と"内容"が返ってくる程度です。まだまだ理想には遠いですね。 前回やったのは PDFファイル読み込み ページ番号取得と削除 色んな空白を削除 今回行ったのは 特殊文字の削除 大文字小文字統一 ベクトル変換 この辺も全てChat-GPT任せでした。特殊文字に関してはURLとメールアドレス、特殊文字の削除になります。まあ私が扱ってるものの中にURLやメールアドレスはあまりなさそうですが、一般的には必要だと思います。 text = re.sub(r'http[s]?://\S+', '', text) text = re.sub(r'\S*@\S*\s?', '', text) text = re.sub(r'[!#\$%&\'()*+,\-./:;<=>?@\[\\\]^_`{|}~]', '', text) 次は大文字小文字の統一ですね。これが少し特殊ですが例えば “123abcアイウエオ①②③¹²³"という文字があった時に"123abcアイウエオ123123"となるように変換しています。これもあまり使われてないと思いますが、一応変換しています。 normalized_text = ''.join([unicodedata.normalize('NFKC', char) if not unicodedata.east_asian_width(char) in ('F', 'W', 'A') else char for char in text]) それからベクトル変換ですね。OpenAIの埋め込みベクトルに変換していきます。課金が必要なので他のやり方がないか考えたいところですが、簡単に実装するために使用します。いつかはTF-IDFかWord2Vecを使ってみたいです。 openai.api_key = os.environ['OPENAI_API_KEY'] vector_database.append({ 'title': filename, 'body': text, 'embedding': vector }) 課金といっても10000字くらい埋め込みベクトルに使っても0.01$もかかりませんので数円くらいならお試しで触ってみてください。 一つだけ注意点を話すと8192トークンまでしか入力として受け取れないので、もし文字数が多くなる場合は分割して、それぞれの平均を取るといいかと思います。私の場合はとりあえず7000文字くらいで分割しています。 for i in range(0, len(text), max_tokens): # max_tokens=7000 segment = text[i:i+max_tokens] res = openai.embeddings.create( model='text-embedding-3-large', input=segment ) vectors.append(res.data[0].embedding) average_vector = np.mean(vectors, axis=0).tolist() そういえばいつからかはわかりませんが埋め込みベクトルの数値を取り出す方法が変わってたみたいで、‘res[data][0][embedding]’ から ‘res.data[0].embedding’に変わっています。前の方法が良ければバージョンを下げていただければ大丈夫です。 ...

2024年4月12日

RAGを開発してみたい!ので簡単なものでもいいので作ってみよう!part1

大規模言語モデルが出てきてChat-GPTやGemini、Claudeが出てきましたが、“ハルシネーション"は中々解決できない問題ですね。人間でも勘違いや嘘を堂々と言うことはあるのでどっこいどっこいですが、なるべくなら減らしていきたいですね。 そこで出てくるのが"RAG"になります。RAG(Retrieval-Augmented Generation)は、情報検索を組み込んだ生成モデルで、特に自然言語処理タスクでの応用が注目されています。RAGは、大量のテキストデータから関連情報を検索し、その情報を基に関連するテキストを生成します。 というわけで開発手順をChat-GPTとClaudeに聞いてみました。 大体似たような回答になりました。 データセットの準備と前処理 検索エンジンの構築 学習済みモデルの構築 RAGモデルの構築(検索エンジンと学習済みモデルを統合) モデルのトレーニング モデルの評価と調整 という流れになりました。 データセットの準備のほうはできています。私は昔作ったこちらを再利用しようと思いますが、論文やら書籍をダウンロードしたほうが楽だと思います。 というわけでデータセットの準備が終わったので今度は前処理をしていこうと思います。私のデータはPDFになってるので文字を抽出して、不要な文字を削除するところまでやります。 ということでgithubには登録しましたが一部コードをピックアップして # PDFPage.create_pages()を使用してページのリストを取得し、その長さを数える page_count = len(list(PDFPage.create_pages(document))) # スペース、タブ、改行を削除 text = text.replace(' ', '').replace('\t', '').replace('\n', '') # 正規表現を使って他の空白文字を削除 text = re.sub(r'\s+', '', text) 簡単ではありますがページ番号の削除と空白削除を行いましたので、とりあえず次のステップに進もうと思います。何をしたらいいかChat-GPTとClaudeに聞いてみました。 Claude曰く形態素解析や正規化は行わなくてもいいみたいなので、一旦インデックスの作成をやっていこうと思います。ただ色々試行錯誤してやった方が精度が上がりそうであればやろうと思います。 ところでClaudeに聞いたときこのような解答が返ってきたことがありました。野球って何でしょうか?(笑) ということで引き続き開発を進めていこうと思います。この先llamaindeを使うのか他のAPIを使うのか、ベクトルデータベースはどうするのか調べながら考えてみようと思います。ではでは

2024年4月7日

やっていたKaggleのコンペが終わったので少し振り返る

私が参加していたコンペ(こちら)が終わったので少し振り返ってみようと思います。 一応私の経歴を軽く話すとデータサイエンティスト的な仕事をしつつも予測や分類自体はしたことなく、データセットの作り方や加工の作業がメインでpythonに関してはある程度分かっているという状況です。 そのうえでG検定やE資格を取得済みなので、機械学習や深層学習の知識はある程度ある形でKaggleを始めて挑んでみました。 定石としてタイタニックを触るべきですが、タイタニックのランキングを見てもつまらないので今開催されているSwagやKnowledgeと呼ばれるタイプのコンペに参加してみることをおススメします。 こちらの本でも言及されているのですがどうもタイタニックのデータは初心者向けではないみたいです。初心者を抜けた人向けなイメージです。 それはさておき今回のコンペでは一旦自身で加工してみてモデルを作って提出をするという流れをやってみました。 そこまでは前回のブログでも書いてました。その後ですが他の人のコードをを見て、Chat-GPTに解説してもらって分からない点を質問するということをひたすら繰り返してました。 いくつかピックアップすると ワンホットエンコーディングした時、出現回数が最も少ないカラムを削除していた。なぜ削除するのか? テストデータセットの全行数に対してユニークな値の割合が5%未満のカラムを取得するのはなぜですか?どのような意味がありますか? 特徴量間のピアソン相関を計算するのはなぜか? Optunaの研究(study)を最適化とはどういう意味か? という感じでたくさんの質問を投げてみました。その後帰ってきた返答に関してわからなかった部分もさらに深堀して聞くということを繰り返していました。 そこで理解した点としては ユニーク値が少ない値に関してはワンホットエンコーディングを行うのが有効←その前にやることがある 特徴量を減らすには全体行の5%未満の値でもいいが、クロスバリデーションで特徴量の有無を見てモデルの評価を行ったほうがよい ヒートマップは線形関係に関しては有効だが非線形関係には向いてない ワンホットエンコーディングした際、訓練データまたはテストデータ片方にしかないデータが存在することがあるので、1つにまとめるアプローチがある Optunaを使ってハイパーパラメータの最適化を行える 私の中ではヒートマップで各特徴量の相関を見たほうがいいと思っていたのですが、線形関係であれば見るべきであって、非線形関係であれば意味は少ないというのは新しい発見でした。よく考えればわかることではありますが(笑) それからクロスバリデーションで特徴量の有無によってモデルの評価と比較をすることができることは知りませんでした。クロスバリデーションはただデータセットを分割して検証をするだけで、特徴量の有無まで比較できるとは思ってませんでした。 ここで私のコンペは終了しました。上記の気づきをコードに落とし込むことができませんでした。上の解説や質問と返答の理解に時間を費やしてました。まあ土日はゲームをしてたので結局やらずに終わっただけですが… コンペが終わった後のスコアとディスカッションも見てたのですが、public1位の人がprivateでは200位台になってたりしてそんなこともあるのかと思いながら見てました。 ちなみに私は8個ほど順位を落としてました。そこまで熱心にデータの加工やパラメータの調整をしてないので気にしてないですが さてこのコンペが終わったのでまた次のコンペにも挑戦しようかと思います。まだSwagかKnowledgeに挑戦してみます。また現場で画像系のAIを作るみたいなので画像コンペにも参加してみようと思います。果たして役に立つのか不明ですが また今回の解説だったり質問の返答などは正しいとは限らないのでもう少し精査しようと思います。少しづつでも確実に自身の知恵としていきたいですね。ではでは

2024年4月1日

最近の生成AIを3つほど試してみたよ!

OpenAIから"Sora"のお披露目があり、夏に"GPT-5"がでるという発表がありましたね。 最近の生成AIはすごいなあと思いながら過ごしてますが、たまたま見つけた動画生成AI2つと音楽生成AIを見つけたので試してみました。全てGoogleのアカウントアあれば無料で試せますので興味があれば試してみてください! まずはPixVerseですね。テキストから動画を生成できます。時間は4秒だけですが一応できます。少し触ってみましたが思ったような動画を作るのは大変そうです。 このときは"Giant bee stings bear"というプロンプトを入れてみました。想定とは違いますが欲しい物体は出てきましたね。 次の動画生成AIはHaiperです。こちらでも同様のプロンプトをいれてみました。熊が出てこず蜂が前面に出てきて、人によっては嫌悪感を抱くかと思いますのでリンクだけ貼っておきます。興味があれば見てください。こちら 蜂が蜂を食べてるみたいな動画でそれも不気味なんですよね。こちらは2秒だけですがPixVerseよりも精度や解像度はよさそうです。いいプロンプトを見つけてみたいものです。 最後は音楽生成AIのSunoです。入れてみたプロンプトは"A giant bee stings a bear in anger and rejoices when it is repelled.“になります。感情を入れてみました。 できた音楽は2つになります。これとこれです。生成されたサムネはよくわかりませんが喜びを表した音楽ができました。また、歌詞も出ており英語で歌もついています。2つの歌詞は同じですが音楽が異なるのですごいなと感じましたね。ちなみに歌詞は下記 [Verse] In the forest, giant bee is on the prowl (oh yeah) Buzzin' 'round, lookin' for some mischief now (oh-oh) Spots a bear, thinks it's time to have some fun (oh yeah) Stings it hard, the battle has just begun (woo) [Verse 2] But the bear retaliates, swipes with all its might (oh no) Giant bee is repelled, takes flight into the night (oh-oh) Feelin' the sting, buzzing with adrenaline (oh yeah) But still it's jumpin' back, ready to sting again (woo) [Chorus] Buzzin' bee, buzzin' bee, flying wild and free (oh yeah) Stingin' bear, stingin' bear, a rivalry we see (oh-oh) Buzzin' bee, buzzin' bee, never gonna run (woo) Keep on buzzin', keep on stinging for fun (oh yeah) こんな感じで色んな生成AIを触ってみました。他にも日本から出た画像生成AIのAkumaでしたり、Sakana AIという低コストで精度が高いモデルが作られたりしています。 ...

2024年3月28日

生成AIのさらなる進化と今後の仕事について

最近Inputが出来てないな~と思ったので色々調べてみたところこの資料を見つけました。 ざっくり内容を話すと生成AIが労働へ及ぼす影響や知識の獲得、またその後の働き方について書かれています。せっかくなのでChat-GPTとClaudeにも要約してもらいました。 こちらではもう少し細かく要約されたものがありますので興味があれば見てください。 現在の生成AIでもいろんな職業に影響を与えていますが、この資料では将来的に膨大な知識が求められる職業にも影響があるという話です。AIを含むエンジニア系全般はもちろん科学者や技術者も対象です。 今のプログラマーだったりデータサイエンティストも頼ったほうがよいものができやすいと思います。私もちょくちょくコードの書き方を聞いたりしてます。 そんな生成AIが所謂 “業務知識” を持つようになったら労働を代替してくれるという話ですね。 とはいえ全てを任せるわけじゃなく最後の確認は必要だと思いますが。 ただ、最後の確認であればPLレベルの人がいれば十分で、ただのプログラマーやデータサイエンティストは不要になるのは間違いなさそうです。 他に必要になるのは人間同士の調整をする役目の人ですかね?営業とかでしょうか この話を聞くと今のままではいずれ職がなくなるんだなと考えられますね。数年位であれば大丈夫でしょうが、10年20年先もまだ働く気がするのでそうなると先を考えて行動しないといけないですね。 ブルーカラーの職業も最近はロボットが出てきているので代替されそうな気もしますが、人間の体のつくりは割と凄くて8時間動き続けても故障をしないものです。 ただ、ロボットなどの機械は部品が摩擦などで擦れてくるので長期的には向かないらしいです。そう考えたらまだ大丈夫な気はしますね。 一応金属も傷つけられたとしても時間をかけて回復するらしいのですが、動植物ほど早くなさそうです。そう考えるとブルーカラーがいいですかね?農業であれば食べ物も困らなさそうです。酪農もよさそうですがコストが高そうです。不動産とかもいいんですかね?気にはなってるんですが… そんな感じで将来のことを考えさせられる資料でした。私は将来的に人間は全員ニートになってほしいと思ってるんですが生きてるうちに来ないですかね?ではでは

2024年3月26日

Kaggleのスコアを少しずつ上げていってる話

前回から4日ほど空いてしまったのですが、Kaggleでどうやってスコアを上げるか四苦八苦してました。 そもそも前のスコアが低すぎたので少し改善するだけで上がるかなと思ってたのですが、なぜか上がらず少し結果を見てたら自分のコードミスだったというオチです(笑) 前回の予測コードがこちら で修正したコードがこちら for文を使って目的変数が変わるたびモデルの学習を行った後、予測を行っています。ちなみに私は訓練データを8:2に分割して実行しています。 前の時は全ての目的変数の学習が終わったとモデル予測を行っていました。本来であれば目的変数1つに対して学習して予測を行うのですが、全て学習した後予測してたので最後の目的変数の学習をしたモデルになってたので、想定していた結果にはならなかったみたいです。 というわけで修正した後のスコアがこちら すごい!だいぶ上がった!というかこれが普通のスコアっぽい(笑) よくなったので今度はもう少しデータと向き合いつつ、より良い加工方法とモデルの作り方を見てみようと思います。またDiscussionを見つつ、他の人のNotebookを見てみました。他人のコードをChat-GPTに解説してもらいつつ、不明な点を聞いてみようと思います。 余談ですが何もしないときとワンホットエンコーディングを行った時の結果を見てみます。AUCが上がったものもあれば下がったものもありますね。大幅に改善されたわけではないので、元のデータに対して加工したほうがよさそうです。外れ値とか入ってるかもしれないですね。 というわけでKaggleいろいろ試してるという話でした。ではでは

2024年3月22日