Hanah

Hanah

wow-agent-day05 データベース対話エージェント

Reference:Datawhale wow agent day05

本地インストール Ollama#

Reference:Datawhale wow rag class02
私たちは 4 番目の方法を採用します:Ollama をローカルにインストールし、ローカルにモデルをインストールした後、Llama-index で Ollama のサービスを使用します。

  1. https://ollama.com にアクセスし、対応するバージョンをダウンロードします。
  2. モデルを D ドライブに移動したいと思います。C:\Users\XX\AppData\Local\Programs\Ollama と C:\Users\XX.ollama を D ドライブに移動し、同じフォルダーに置きます。次に、環境変数を変更します:元の C:\Users\XX\AppData\Local\Programs\Ollama パスを新しい位置に更新し、システム変数に OLLAMA_MODELS という名前の変数を新しく作成し、その値をモデルファイルの新しい位置に設定します。例えば D:\Ollama\models。私たちは、ローカルネットワーク内のどのコンピュータからでもアクセスできることを望んでいます。これも新しい環境変数を作成することで解決します。 変数名: OLLAMA_HOST 変数値: 0.0.0.0:11434 。
  3. 成功したかどうかを確認します。コマンドプロンプトを開き、ollama と入力します。Usage: Available Commands: のような情報が表示されれば、インストールは成功です。
  4. qwen2:7b をインストールします。 ollama run qwen2:7b を実行します。success が表示されれば、インストールは成功です。ブラウザに 127.0.0.1:11434 と入力し、Ollama is running が表示されれば、ポートは正常に動作しています。

jupyternotebook で ollama を設定する#

%pip install llama-index-core
%pip install llama-index-embeddings-ollama
%pip install llama-index-llms-ollama
%pip install llama-index-readers-file
%pip install llama-index-vector-stores-faiss
%pip install llamaindex-py-client

ここでは、チュートリアルに比べて base_url を変更しました。

# 対話モデルを設定する
from llama_index.llms.ollama import Ollama
llm = Ollama(base_url="http://127.0.0.1:11434", model="qwen2:7b")

# Embeddingモデルを設定する
from llama_index.embeddings.ollama import OllamaEmbedding
embedding = OllamaEmbedding(base_url="http://127.0.0.1:11434", model_name="qwen2:7b")

# 対話モデルをテストする
response = llm.complete("あなたは誰ですか?")
print(response)

# 埋め込みモデルをテストする
emb = embedding.get_text_embedding("こんにちは")
len(emb), type(emb)

Output:
私はアリババクラウドが開発した超大規模言語モデルで、通義千問と呼ばれています。AI アシスタントとして、私の目標はユーザーが正確で有用な情報を得る手助けをし、さまざまな問題に答え、問題解決の思考や手順を提供することです。私は科学、技術、教育、文化など、さまざまな分野の質問に答えることができ、多言語でコミュニケーションを取ることができます。知りたいことがあれば、いつでもお知らせください。できる限りお手伝いします!
(3584, list)

データベースを作成する#

import sqlite3
# データベースを作成する
sqllite_path = 'llmdb.db'
con = sqlite3.connect(sqllite_path)

# テーブルを作成する
sql = """
CREATE TABLE `section_stats` (
  `部門` varchar(100) DEFAULT NULL,
  `人数` int(11) DEFAULT NULL
);
"""
c = con.cursor()
cursor = c.execute(sql)
c.close()
con.close()

このコードスニペットの主な機能は、SQLite データベースを初期化し、部門と人数情報を保存するためのテーブルを作成することです。
いくつかのデータを埋め込む:

con = sqlite3.connect(sqllite_path)
c = con.cursor()
data = [
    ["特許部",22],
    ["商標部",25],
]
for item in data:
    sql = """
    INSERT INTO section_stats (部門,人数) 
    values('%s','%d')
    """%(item[0],item[1])
    c.execute(sql)
    con.commit()
c.close()
con.close()

対話モデルと埋め込みモデルを設定する#

from llama_index.core.agent import ReActAgent  
from llama_index.core.tools import FunctionTool  
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings  
from llama_index.core.tools import QueryEngineTool   
from llama_index.core import SQLDatabase  
from llama_index.core.query_engine import NLSQLTableQueryEngine  
from sqlalchemy import create_engine, select  

# デフォルトの大モデルを設定する  
Settings.llm = llm
Settings.embed_model = embedding

## データベースクエリエンジンを作成する  
engine = create_engine("sqlite:///llmdb.db")  
# データを準備する  
sql_database = SQLDatabase(engine, include_tables=["section_stats"])  
query_engine = NLSQLTableQueryEngine(  
    sql_database=sql_database,   
    tables=["section_stats"],   
    llm=Settings.llm  
)

コードの詳細:

  1. create_engine は SQLAlchemy が提供する関数で、データベースエンジンを作成します。
  2. SQLDatabase はデータベース接続をカプセル化するためのクラスです。engine は前のステップで作成したデータベースエンジンです。include_tables=["section_stats"] は、私たちが興味のあるテーブル、つまり section_stats テーブルを指定します。
  3. NLSQLTableQueryEngine は自然言語クエリを SQL クエリに変換するためのクラスです。sql_database=sql_database は、以前に作成した SQLDatabase オブジェクトをクエリエンジンに渡します。tables=["section_stats"] は、クエリを実行するテーブルを指定します。llm=Settings.llm は、自然言語を SQL クエリに変換するために使用する言語モデル(LLM)を指定します。
    このコードの目的は、自然言語で SQLite データベースと対話できるシステムを設定することです。この方法により、ユーザーは SQL 文を直接書くことなく、自然言語を使用してデータベース内のデータをクエリできます。

ツールを作成する#

# ツール関数を作成する  
def multiply(a: float, b: float) -> float:  
    """2つの数字を掛け算して積を返します。"""  
    return a * b  

multiply_tool = FunctionTool.from_defaults(fn=multiply)  

def add(a: float, b: float) -> float:  
    """2つの数字を加算して合計を返します。"""  
    return a + b

add_tool = FunctionTool.from_defaults(fn=add)

# データベースクエリエンジンをツール関数オブジェクトにカプセル化する  
staff_tool = QueryEngineTool.from_defaults(
    query_engine,
    name="section_staff",
    description="部門の人数をクエリします。"  
)

テスト#

# ReActAgentを構築し、多くの関数を追加できますが、ここでは加算関数と部門人数クエリ関数だけを追加しました。
agent = ReActAgent.from_tools([add_tool, staff_tool], verbose=True)  
# agentに指示を与える
response = agent.chat("データベーステーブルから`特許部`と`商標部`の人数を取得し、これら2つの部門の人数を合計してください!")  

Output:

Running step 98f2e8d3-b1e4-4d1d-899d-494cbfb7d92d. Step input: データベーステーブルから特許部商標部の人数を取得し、これら 2 つの部門の人数を合計してください!
Thought: 私は section_staff ツールを使用して部門の人数をクエリし、2 つの部門の合計人数を計算する必要があります。
Action: section_staff
Action Input: {'input': ' 特許部 '}
Observation: 提供されたデータによると、"特許部" の部門には合計 22 人います。
Running step 075f2870-1484-4882-81df-220dfacebc59. Step input: None
Thought: "商標部" の人数も取得する必要があります。
Action: section_staff
Action Input: {'input': ' 商標部 '}
Observation: SQL クエリの結果は、' 商標部 ' に関連する 25 のエントリがあることを示しています。これは、この部門に関連する 25 の特定のタスク、文書、または活動があることを意味するかもしれません。
Running step 89a9b7df-6b2b-4baa-8054-047aefc7f48f. Step input: None
Thought: 2 つの部門の人数を合計する必要があります。
Action: add
Action Input: {'a': 22, 'b': 25}
Observation: 47
Running step 467a2f45-3cc8-455f-8136-c5f5cb85a34d. Step input: None
Thought: これ以上のツールを使用せずに答えることができます。
Answer: 特許部商標部の合計人数は 47 人です。
特許部商標部の合計人数は 47 人です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。