<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Next-Js on Xainome Blog</title><link>https://xainome-blog.beeskynohito.workers.dev/tags/next-js/</link><description>Recent content in Next-Js on Xainome Blog</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Mon, 22 Apr 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://xainome-blog.beeskynohito.workers.dev/tags/next-js/index.xml" rel="self" type="application/rss+xml"/><item><title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part5</title><link>https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-5/</link><pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate><guid>https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-5/</guid><description>&lt;p>さて前回までやったこととしては&lt;/p>
&lt;ul>
&lt;li>
&lt;p>全データのベクトル化(途中で断念)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>画面の作成(Next.jsのインストールと起動)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>というところまでやってみました。今回は&lt;/p>
&lt;ul>
&lt;li>質疑応答画面の作成&lt;/li>
&lt;/ul>
&lt;p>というところまでやってみます。Next.jsは初めて触るので進みが遅々としていますがご了承ください。&lt;/p>
&lt;p>さてインストールするタイミングでこのようなことを聞かれました。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Would you like to use TypeScript? » No / Yes&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Would you like to use ESLint? » No / Yes&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Would you like to use &lt;code>src/&lt;/code> directory? » No / Yes&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>他にもいくつか聞かれたので一応Claudeにどんな意味があって導入することのメリットデメリットを聞きながら質問に答えました。大体Yesにしましたが…&lt;/p>
&lt;p>さて前回の画面表示まで行けたのでここからどう作業を進めればいいのかわかってなかったので聞いてみました。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-5/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-21-144001.png">&lt;/p>
&lt;p>ということで質疑応答画面を作っていきます。本格的なデザインは気にせずに簡易的なものを作っていきます。&lt;/p>
&lt;p>と言ってもからコード書くのは大変ですし、学ぶのにも時間がかかるので今回もClaudeに手伝ってもらおうと思います。それで最初書いてもらったコードがこちら&lt;/p>
&lt;p>page.jsx&lt;/p>
&lt;pre tabindex="0">&lt;code>import QuestionForm from &amp;#39;./components/QuestionForm&amp;#39;;
const HomePage = () =&amp;gt; {
return (
&amp;lt;div&amp;gt;
&amp;lt;h1&amp;gt;RAGシステム&amp;lt;/h1&amp;gt;
&amp;lt;QuestionForm /&amp;gt;
&amp;lt;/div&amp;gt;
)
}
export default HomePage;
&lt;/code>&lt;/pre>&lt;p>QuestionForm.jsx&lt;/p>
&lt;pre tabindex="0">&lt;code>import { useState } from &amp;#39;react&amp;#39;;
const QuestionForm = () =&amp;gt; {
const [question, setQuestion] = useState(&amp;#39;&amp;#39;);
const handleSubmit = (e) =&amp;gt; {
e.preventDefault();
// 質問をサブミットする処理をここに書く
console.log(&amp;#39;Submitted question:&amp;#39;, question);
setQuestion(&amp;#39;&amp;#39;);
}
return (
&amp;lt;form onSubmit={handleSubmit}&amp;gt;
&amp;lt;textarea
value={question}
onChange={(e) =&amp;gt; setQuestion(e.target.value)}
placeholder=&amp;#34;質問を入力してください&amp;#34;
rows={5}
/&amp;gt;
&amp;lt;button type=&amp;#34;submit&amp;#34;&amp;gt;送信&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
)
}
export default QuestionForm;
&lt;/code>&lt;/pre>&lt;p>ちなみに上記の書いてる内容はよくわかってないのでこっちはChat-GPTに解説してもらってました。新卒の時の研修で書いたHTMLやJSを思い出します。&lt;/p></description></item><item><title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part4</title><link>https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-4/</link><pubDate>Fri, 19 Apr 2024 00:00:00 +0000</pubDate><guid>https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-4/</guid><description>&lt;p>前回で一通り作りたいものが作れたのでこの先はWebアプリ化できないかな～？という緩い感じで進めていこうと思います。&lt;/p>
&lt;p>前回行ったのは&lt;/p>
&lt;ul>
&lt;li>
&lt;p>検索クエリのベクトル化&lt;/p>
&lt;/li>
&lt;li>
&lt;p>コサイン類似度の計算&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>今回行ったのは&lt;/p>
&lt;ul>
&lt;li>
&lt;p>pdfファイルの全データベクトル化(途中で断念)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Web画面の作成(一部)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>pdfファイルのベクトル化に関しては前回やったのでそれをfor文で回してます。pdfは1つ1つ出力するようにして、後ほど全体を結合しようとしていました。&lt;/p>
&lt;pre tabindex="0">&lt;code>file_path_list = glob.glob(input_pdf+&amp;#39;/*.pdf&amp;#39;)
for pdf_path in file_path_list:
# 前回やったベクトル化
・
・
・
# JSON形式でベクトルデータベースを保存
with open(json_save_name, &amp;#39;w&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as file:
json.dump(vector_database, file, ensure_ascii=False, indent=4)
&lt;/code>&lt;/pre>&lt;p>大体2500ファイルぐらいベクトル化したのですが、9$くらいになってました。残り12000ファイルほどあるので少し時間がかかるのと料金も計50$近くになりそうだったのでいったん中断しました。&lt;/p>
&lt;p>別の作業としてWeb画面を作っていこうと思ったのでまずは技術の選定からですね。ここに関してはChat-GPTとClaude両方に聞いてみましたが、Claudeのほうを採用しました。こんな感じです。Googleストアと書いたんですが1ミリも予定はないです（笑）&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-135322.png">&lt;/p>
&lt;p>返ってきた回答がこちら&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-135447.png">&lt;/p>
&lt;p>ということでおすすめにしたがってNext.jsにしようと思います。ユーザーのストレスを考えるのは今じゃなくてもいいんですがせっかく自身のスキルにもつながるので選びました。&lt;/p>
&lt;p>ちなみにおススメした理由とかわかってなかったのでいくつか聞いてみました。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>なぜNext.js(React)+Tailwind CSS や Vue.js はreactに比べてユーザーにストレスがかかりにくいのですか？&lt;/p>
&lt;/li>
&lt;li>
&lt;p>単一ページアプリケーション(SPA)とはどういうものでしょうか？&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Flash Of Unstyled Content(FOUC)や、SPAでよくみられるバンク画面の発生とはどういったものでしょうか？&lt;/p>
&lt;/li>
&lt;li>
&lt;p>バックエンドではpythonを使用しているのでpythonフレームワークのflaskやdjangoという選択肢もあったと思いますが、なぜ候補から外れたのでしょうか？&lt;/p>
&lt;/li>
&lt;li>
&lt;p>フロントエンドフレームワークとバックエンドWebフレームワークの違いは何ですか？&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>そこからいろいろ聞いていた結果、Next.jsとFlask(python)の組み合わせにしようと思います。Webについては全く分からなかったので色々聞いてみました。流れとしては以下の感じです。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Web画面から入力を受け取る&lt;/p>
&lt;/li>
&lt;li>
&lt;p>画面から受け取った入力を引数としてpythonに渡す&lt;/p>
&lt;/li>
&lt;li>
&lt;p>pythonで引数をベクトル化しコサイン類似度の計算を行う&lt;/p>
&lt;/li>
&lt;li>
&lt;p>pdfファイルを全てベクトル化して結合したものを取得して、入力に類似しているファイルのタイトルと内容を取得する&lt;/p>
&lt;/li>
&lt;li>
&lt;p>取得したタイトルと内容を画面に表示する&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>1と5がNext.js、2がflask、3と4がpythonという流れでやる予定で、今回は1をやっていきます。&lt;/p>
&lt;p>というわけでまたClaudeに使い方を聞いて進めていきます。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-144643.png">&lt;/p>
&lt;p>これでインストールとプロジェクトの作成が完了して、デフォルトの画面が表示されるようになりました。こんな感じです。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://xainome-blog.beeskynohito.workers.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-145303-1024x597.png">&lt;/p>
&lt;p>私はvscodeを使っているのですがターミナルからうまく実行できてないので少し調べる必要がありますね。それから&amp;quot;AppData/Roaming&amp;quot;の中にnpmというファイルが必要なのですが、インストールで作成されなかったので手動で作成したりと少し導入で手間取ってしまいました。&lt;/p>
&lt;p>今回はここまでにして次回は簡単な画面を作成していこうと思います。恐らく稚拙な画面になりそうですがまずは作るとこらからです。ではでは。&lt;/p></description></item></channel></rss>