Ollama + Langchainの環境を設定する

# 1. はじめに
前回の記事では、余ったPCパーツを活用してLinux環境でOllamaを導入し、日本語版 Gemma 2 2Bを動作させるところまでを説明しました。

https://qiita.com/chemukku/items/4046085660001f0ff587

今回は、そのOllama環境を活用するため、Langchainと組み合わせた開発環境の構築手順について解説します。

# 2. 環境構築
## 2.1 前提条件

Ubuntu 24.04.1 LTS
Python 3.12.3
Ollama（前回の記事で導入済み）

## 2.2 Python環境の作成

Langchainと関連パッケージをインストールします：
```bash:install langchain
pip install langchain
pip install langchain_ollama
pip install langchain-core
```

# 3. LangChainでOllamaを使用する
ここまで設定すれば準備完了です次のようなpythonコードを準備して前回と同様の質問をしてみましょう。
```python:ollama_test.py
from langchain_ollama.llms import OllamaLLM
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import time
from datetime import datetime

def read_questions(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        return [line.strip() for line in file if line.strip()]

def format_output(question, answer, elapsed_time):
    return f"""質問：{question}
回答：{answer}
所要時間：{elapsed_time:.2f}秒

"""

def main():
    # LLMの設定
    llm = OllamaLLM(
        model="hf.co/alfredplpl/gemma-2-2b-jpn-it-gguf",
        temperature=0.7
    )
    
    prompt = ChatPromptTemplate.from_messages([
        ("human", "{question}")
    ])
    
    chain = prompt | llm | StrOutputParser()
    
    # 質問の読み込み
    questions = read_questions('question.txt')
    
    # 出力ファイルの準備
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    output_filename = f'output_{timestamp}.txt'
    
    with open(output_filename, 'w', encoding='utf-8') as output_file:
        for question in questions:
            # 時間計測開始
            start_time = time.time()
            
            # 回答の生成
            result = chain.invoke({"question": question})
            
            # 経過時間の計算
            elapsed_time = time.time() - start_time
            
            # 結果の整形と書き込み
            formatted_output = format_output(question, result, elapsed_time)
            output_file.write(formatted_output)
            
            # 進捗表示
            print(f"Processed: {question}")
    
    print(f"\nAll questions have been processed. Results saved to {output_filename}")

if __name__ == "__main__":
    main()
```

質問は以下のような形で準備します。

```text:question.txt
豚肉と玉ねぎがあります子供が喜ぶ野菜が進むようなメニューのレシピを教えてください
ミニ四駆を趣味にしてみようと考えていますどのように楽しむのが良いでしょうか？
```

アウトプットは以下の通りです

```text:output.text
質問：豚肉と玉ねぎがあります子供が喜ぶ野菜が進むようなメニューのレシピを教えてください
回答：## 子供が喜ぶ！豚肉の玉ねぎ炒め

**材料（2人分）**

* 豚肉：150g
* 玉ねぎ：1個
* 醤油：大さじ1
* みりん：小さじ1
* 酒：大さじ1/2
* オリーブオイル：小さじ1
*  塩：少々
*  胡椒：少々


**作り方**

1. **豚肉を切る:** 豚肉は一口大に切る。
2. **玉ねぎ切る:** 玉ねぎは薄切りにする。
3. **フライパンに油を熱し、豚肉を炒める:**  豚肉を炒める前に塩と胡椒を振る。 
4. **玉ねぎを加えて炒め合わせる:**  豚肉が色付いたら、玉ねぎを加えて炒める。
5. **調味料を加え、煮詰めながら炒める:** 醤油、みりん、酒を加え、弱火で煮詰めて、甘みとコクを出す。
6. **完成:**  お好みで、パセリや香菜を飾る。

**ポイント**

* 玉ねぎの食感は好みで、薄切りにすることで食べやすくなります。 
* 豚肉の量や味付けは、お子様のご年齢や好みに合わせて調整してください。


 





所要時間：14.44秒

質問：ミニ四駆を趣味にしてみようと考えていますどのように楽しむのが良いでしょうか？
回答：ミニ四駆を趣味にするのは素晴らしいですね！ 

**楽しむためのポイント**

* **まずは、基礎知識を学ぶ:**  ミニ四駆の基本的な仕組み、部品の種類、レースのルールなど、まずは基礎から学びましょう。
* **キットを選ぶ:**  初心者向けから上級者向けのキットまで、様々な種類のキットがあります。自分に合ったものを選びましょう。
* **レースに参加する:**  地元のミニ四駆クラブやイベントに参加して、実際にレースに参加してみましょう。
* **パーツを自作:**  オリジナルパーツを作成することで、自分だけの特別なミニ四駆を作り上げることができます。
* **コミュニティに参加:**  オンラインForumsやミニ四駆関連イベントで、他のミニ四駆愛好家と交流しましょう。
* **技術の向上を目指す:**  レースでの成績だけでなく、ミニ四駆の技術を向上させることも大切です。


**楽しむための具体的な方法例**

1. **基本的なレースを楽しむ:**  
    * 新しいキットを使って、簡単なコースでレースを楽しんでみましょう。
    * レースのルールや戦略を学びながら、自分好みの運転スタイルを見つけましょう。
2. **カスタマイズを楽しむ:**  
    *  オリジナルパーツを作成して、ミニ四駆の見た目を変えたり、性能を向上させたりしましょう。
    *  ミニ四駆の外観や性能を自由にカスタマイズすることで、個性的なミニ四駆を作ることができます。
3. **技術を向上させる:**  
    *  レースの記録や動画を見ることで、自分の運転方法を見直すことができます。
    *  レースの分析やデータ収集を通じて、自身のスキルを向上させ、より良い結果を目指しましょう。 



**ミニ四駆を楽しむためのウェブサイトと情報源**

* **ミニ四駆日本代表:** https://www.minicrawler.or.jp/
* **ミニ四駆公式ウェブサイト:** https://mini-4wd.com/
* **ミニ四駆フォーラム:** https://bbs.minifourwd.com/


 
ミニ四駆は、技術や戦略だけでなく、仲間との交流も楽しめる趣味です。ぜひ色々な楽しみ方を試して、自分だけの楽しいミニ四駆ライフを楽しんでください！  





所要時間：21.55秒

```