OllamaとFirecrawlをColabで動かす

# はじめに
URLを入力したらそこから情報を自動で抽出してくれるツールとか作れたら便利そうだと思い、色々調べています。それにあたり、この記事ではOllamaとFirecrawlについて説明します。Colabで簡単に動かしてみたので、この記事で紹介します。また、Ollamaを呼び出すためにLiteLLMを使っており、以下で説明していきます。

# Ollamaについて
以下の記事を参考にさせていただきました。

https://zenn.dev/hellorusk/books/e56548029b391f

Ollamaはローカル環境でLLMを使用でき、プライバシーに関する懸念がなくなります。
また、Llama 3,Gemma など、様々なオープンソースモデルをOllamaの公式ライブラリでサポートしており、簡単に利用できます。さらに、Ollamaの公式ライブラリに登録していないものでも、Hugging Faceに置かれていれば簡単に利用できます。

# LiteLLMについて
以下の記事を参考にさせていただきました。

https://zenn.dev/loglass/articles/bfb92ed1e7d012

LLMに関するライブラリとしては、例えばLangChainが有名ですが、LiteLLMはLangChainほど様々な機能は搭載していないものの、LLMの呼び出しの部分に特化しているようなイメージです。
Litellmを使えば、OpenAI APIのフォーマットで、様々なプロパイダーのLLM APIを呼び出せるようになります。

# Firecrawlについて
以下の記事を参考にさせていただきました。

https://zenn.dev/kosukeuchida/articles/0e679531594d77#7.-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85

Firecrawlは、Webサイトのデータを効率的にクローリングし、必要な情報を抽出するためのツールです。
指定されたURLから始まり、Webサイト全体をクローリングした上で、データをLLM向けのMarkdownや構造化データに変換する機能を持っています。
また、FirecrawlはPython SDKを使用して簡単にFirecrawl APIと連携することができます。

# Colabで試してみた
この記事ではColabでOllamaを動かす、FirecrawlでWebサイトの情報を抽出させる、Ollamaでそれを要約させるところまで試してみます。
まずはColabでOllamaを使えるようにします。以下記事を参考にさせていただきました。

https://zenn.dev/sunwood_ai_labs/articles/ollama-on-google-colab-with-litellm

以下を実行し、Ollamaのインストールとcudaドライバーのインストールをします。
```python
!curl https://ollama.ai/install.sh | sh

!echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
!sudo apt-get update && sudo apt-get install -y cuda-drivers
```
次に、Ollamaサーバーの起動とモデルをダウンロードします。
今回はLlama-3-ELYZA-JP-8Bをダウンロードしています。
Llama-3-ELYZA-JP-8Bは、ELYZA社が開発した日本語に特化した大規模言語モデルです。Meta社の「Llama 3」シリーズをベースに、日本語での追加学習を行っています。
```python
!nohup ollama serve &

!ollama pull hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF
```
ではLiteLLMで呼び出して実際に動かしてみます。
```python
!pip install litellm
```
ライブラリをインストールし、
```python
from litellm import completion

response = completion(
    model="ollama/hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF", 
    messages=[{ "content": "transformerについて解説して","role": "user"}], 
    api_base="http://localhost:11434"
)
print(response)
```
上のコードを実行するだけで簡単に動かすことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903963/94d17791-4491-ffa3-ecf3-10b0cd5098d8.png)
次にFirecrawlを試します。
```python
!pip install firecrawl-py
```
ライブラリをインストールし、
```python
from firecrawl import FirecrawlApp

app = FirecrawlApp(api_key="API-KEY")

content = app.scrape_url("https://openai.com/ja-JP/about/")
```
このコードを実行するだけで、指定したURLをスクレイピングできます。サイト全体のクローリングも可能です。
contentの中身を確認してみると、以下のようになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903963/d5bf7fb7-73a6-7b7c-cb1b-90b850a951de.png)
雑にそのままLlama-3-ELYZA-JP-8Bに要約させてみます。
```python
response = completion(
    model="ollama/hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF", 
    messages=[{ "content":  f'''以下はある企業のHPの内容です。ここから企業情報を要約して\n{ content['markdown'] }''',"role": "user"}], 
    api_base="http://localhost:11434"
)
print(response['choices'][0]['message'].content)
```
```
[OpenAIについて学ぶ](/ja-JP/index/openai-lp/) [当社の体制について読む](/ja-JP/our-structure/)

#### 私たちの取り組み

私たちは、AI技術を社会に還元し、人類全体の利益を追求するために日々努力しています。AIが世界中の人々の生活を向上させるために、私たちは以下のような取り組みを行っています。

## 1. AI for Social Impact

私たちは、AIを活用して社会的課題を解決することを目指しています。例えば、AIを使用した医療診断や、AIが自動車の安全運転をサポートするなどです。

## 2. AI Research

私たちは、人工知能の限界を超えるために、継続的に研究を行っています。これには、強いAIの開発や、AIと人間の協調的な相互作用の実現などが含まれます。

## 3. Education and Community Building

私たちは、AI技術の普及と教育に力を入れています。私たちの目標は、世界中でAIを理解し、活用することができる人材を育成することです。私たちは、学生や研究者向けのリソースや、コミュニティーを提供しています。

## 4. Corporate Partnerships

私たちは、企業と協力して、AI技術を社会に還元する取り組みを行っています。これには、AIを活用した新しい製品やサービスの開発、AIを使用したプロセス改善、などが含まれます。

## 5. Transparency and Accountability

私たちは、透明性と説明責任を重視し、AI技術の社会的影響を常に検証しています。私たちの目標は、AI技術が公正かつ安全に使用され、人類全体の利益になることです。

[OpenAIについて学ぶ](/ja-JP/index/openai-lp/) [当社の体制について読む](/ja-JP/our-structure/)

### OpenAIの採用情報

私たちは、人工知能の未来を切り拓くために、多才な人材を求めています。以下は、私たちの採用機会です。

## 1. Software Engineer

私たちは、ソフトウェアエンジニアを募集しています。私たちのAI技術の開発や改良に参加し、革新的な製品やサービスを創造することができます。

## 2. Research Scientist

私たちは、研究科学者を募集しています。私たちのAI技術の限界を超えるために、新しいアイデアや手法を探求し、人工知能の進歩に貢献することができます。

## 3. Data Analyst

私たちは、データ分析家を募集しています。私たちのAIモデルが最適化されるように、大規模なデータセットを解析し、有益な情報を抽出することができます。

## 4. Content Reviewer

私たちは、コンテンツレビューアーを募集しています。私たちのAI技術が、公正かつ安全に使用されるように、高品質のコンテンツを監視し、不適切なコンテンツを特定することができます。

[求人情報を見る](/careers/) [OpenAIについて学ぶ](/ja-JP/index/openai-lp/) [当社の体制について読む](/ja-JP/our-structure/)
```
こんな感じになりました。

# 終わりに
この記事ではOllamaとFirecrawlをColabで軽く動かしてみました。
Firecrawlは試しにスクレイピングをしてみただけですが、マークダウン形式で情報を取得することができ、そのままLLMに投げて要約とか、クローリングして色々な情報を抽出した後にLLMに欲しい情報だけ取ってきてもらうとか、Ollamaと組み合わせて色々試せそうです。
このあたり引き続き調べていこうと思います。