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: The SQL query result indicates that there are 25 entries related to the ' 商标部 ' (Trademark Department). This might mean there are 25 specific tasks, documents, or activities associated with this department.
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 人。