CH5 - SunXiaoXiang/learn_wowagent GitHub Wiki
创建一个数据库
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()
添加数据
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()
Thought: 首先我需要使用section_staff工具来获取“专利部”和“商标部”的人数。 Action: section_staff Action Input: {'input': '专利部'} Observation: 根据查询结果,部门为“专利部”的统计数据共有22条。 Thought: 我还需要获取“商标部”的人数,我将再次使用section_staff工具。 Action: section_staff Action Input: {'input': '商标部'} Observation: 根据查询结果,部门为"商标部"的统计数据共有25条。 Thought: 我现在有了两个部门的人数:“专利部”有22人,“商标部”有25人。下一步我需要将这两个数字相加。 Action: add Action Input: {'a': 22, 'b': 25} Observation: 47 Thought: 我可以回答这个问题了,两个部门的人数之和是47人。 Answer: 专利部和商标部的总人数为47人。
import os
from dotenv import load_dotenv
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
import sqlite3
from llama_index.llms.zhipuai import ZhipuAI
from llama_index.embeddings.zhipuai import ZhipuAIEmbedding
# 加载环境变量
load_dotenv()
# 从环境变量中读取 api_key
api_key = os.getenv('ZHIPU_API_KEY')
# 配置 API 参数
base_url = "https://open.bigmodel.cn/api/paas/v4/"
chat_model = "glm-4-flash"
emb_model = "embedding-2"
# 配置对话模型
llm = ZhipuAI(
api_key=api_key,
model=chat_model,
)
# 测试对话模型
print("测试对话模型:")
response = llm.complete("你是谁?")
print(response)
# 配置嵌入模型
embedding = ZhipuAIEmbedding(
api_key=api_key,
model=emb_model,
)
# 测试嵌入模型
print("\n测试嵌入模型:")
emb = embedding.get_text_embedding("你好呀呀")
print("嵌入向量长度:", len(emb))
print("嵌入向量类型:", type(emb))
# 创建数据库
sqlite_path = 'llmdb.db'
con = sqlite3.connect(sqlite_path)
# 创建表
sql = """
CREATE TABLE IF NOT EXISTS `section_stats` (
`部门` varchar(100) DEFAULT NULL,
`人数` INTEGER DEFAULT NULL
);
"""
c = con.cursor()
c.execute(sql)
# 插入数据
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()
# 配置默认大模型
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
)
# 创建工具函数
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 给出指令
print("\n测试 ReActAgent:")
response = agent.chat("请从数据库表中获取`专利部`和`商标部`的人数,并将这两个部门的人数相加!")
print(response)