Reference:Datawhale wow agent day05
本地安裝 Ollama#
Reference:Datawhale wow rag class02
我們採取第四種方法:在本地安裝 Ollama,在本地安裝好模型,然後在 Llama-index 中使用 Ollama 的服務。
- 訪問https://ollama.com,下載對應版本。
- 我想要將模型移到 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 。
- 檢驗是否成功。打開命令行窗口,輸入 ollama,如果出現 Usage: Available Commands: 之類的信息,說明安裝成功。
- 安裝 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")
# prepare data
sql_database = SQLDatabase(engine, include_tables=["section_stats"])
query_engine = NLSQLTableQueryEngine(
sql_database=sql_database,
tables=["section_stats"],
llm=Settings.llm
)
代碼詳解:
- create_engine 是 SQLAlchemy 提供的一個函數,用於創建一個數據庫引擎。
- SQLDatabase 是一個類,用於封裝數據庫連接。engine 是我們在前一步創建的數據庫引擎。include_tables=["section_stats"] 指定了我們感興趣的表,即 section_stats 表。
- NLSQLTableQueryEngine 是一個類,用於將自然語言查詢轉換為 SQL 查詢。sql_database=sql_database 將我們之前創建的 SQLDatabase 對象傳遞給查詢引擎。tables=["section_stats"] 指定了要查詢的表。llm=Settings.llm 指定了使用的語言模型(LLM),用於將自然語言轉換為 SQL 查詢。
這段代碼的目的是設置一個可以通過自然語言查詢與 SQLite 數據庫交互的系統。通過這種方式,用戶可以使用自然語言來查詢數據庫中的數據,而不需要直接編寫 SQL 語句。
創建工具#
# 創建工具函數
def multiply(a: float, b: float) -> float:
"""將兩個數字相乘並返回乘積。"""
return a * b
multiply_tool = FunctionTool.from_defaults(fn=multiply)
def add(a: float, b: float) -> float:
"""將兩個數字相加並返回它們的和。"""
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("請從數據庫表中獲取`專利部`和`商標部`的人數,並將這兩個部門的人數相加!")
Output:
Running step 98f2e8d3-b1e4-4d1d-899d-494cbfb7d92d. Step input: 請從數據庫表中獲取
專利部
和商標部
的人數,並將這兩個部門的人數相加!
Thought: 我需要使用 section_staff 工具來查詢部門人數並計算兩個部門的總人數。
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: 我需要將兩個部門的人數相加。
Action: add
Action Input: {'a': 22, 'b': 25}
Observation: 47
Running step 467a2f45-3cc8-455f-8136-c5f5cb85a34d. Step input: None
Thought: I can answer without using any more tools.
Answer:專利部
和商標部
的總人數是 47 人。
專利部
和商標部
的總人數是 47 人。