构建LangChain应用程序的示例代码:15、与Cassandra数据库集成操作指南

设置环境

Python 模块

安装以下 Python 模块:

pip install ipykernel python-dotenv cassio pandas langchain_openai langchain langchain-community langchainhub langchain_experimental openai-multi-tool-use-parallel-patch

加载 .env 文件

连接使用 cassio 并通过 auto=True 参数,notebook 使用 OpenAI。您应该相应地创建一个 .env 文件。

对于 Cassandra,设置:

CASSANDRA_CONTACT_POINTS
CASSANDRA_USERNAME
CASSANDRA_PASSWORD
CASSANDRA_KEYSPACE

对于 Astra,设置:

ASTRA_DB_APPLICATION_TOKEN
ASTRA_DB_DATABASE_ID
ASTRA_DB_KEYSPACE

例如:

# 连接到 Astra:
ASTRA_DB_DATABASE_ID=a1b2c3d4-...
ASTRA_DB_APPLICATION_TOKEN=AstraCS:...
ASTRA_DB_KEYSPACE=notebooks

同时设置
OPENAI_API_KEY=sk-.....

(您也可以修改下面的代码,直接使用 cassio 连接。)

from dotenv import load_dotenv
load_dotenv(override=True)

连接到 Cassandra

import os
import cassio
cassio.init(auto=True)
session = cassio.config.resolve_session()
if not session:
    raise Exception(
        "检查环境配置或手动配置 cassio 连接参数"
    )

keyspace = os.environ.get(
    "ASTRA_DB_KEYSPACE", os.environ.get("CASSANDRA_KEYSPACE", None)
)
if not keyspace:
    raise ValueError("必须设置 KEYSPACE 环境变量")

session.set_keyspace(keyspace)

设置数据库

这只需要做一次!

下载数据

使用的数据集来自 Kaggle,环境传感器遥测数据。下一个单元格将自动下载并解压缩数据到 Pandas 数据框中。下面的单元格是手动下载的说明。

本节的最终结果是您应该有一个 Pandas 数据框变量 df。

自动下载
from io import BytesIO
from zipfile import ZipFile
import pandas as pd
import requests

datasetURL = "https://storage.googleapis.com/kaggle-data-sets/788816/1355729/bundle/archive.zip?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=gcp-kaggle-com%40kaggle-161607.iam.gserviceaccount.com%2F20240404%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20240404T115828Z&X-Goog-Expires=259200&X-Goog-SignedHeaders=host&X-Goog-Signature=2849f003b100eb9dcda8dd8535990f51244292f67e4f5fad36f14aa67f2d4297672d8fe6ff5a39f03a29cda051e33e95d36daab5892b8874dcd5a60228df0361fa26bae491dd4371f02dd20306b583a44ba85a4474376188b1f84765147d3b4f05c57345e5de883c2c29653cce1f3755cd8e645c5e952f4fb1c8a735b22f0c811f97f7bce8d0235d0d3731ca8ab4629ff381f3bae9e35fc1b181c1e69a9c7913a5e42d9d52d53e5f716467205af9c8a3cc6746fc5352e8fbc47cd7d18543626bd67996d18c2045c1e475fc136df83df352fa747f1a3bb73e6ba3985840792ec1de407c15836640ec96db111b173bf16115037d53fdfbfd8ac44145d7f9a546aa"

response = requests.get(datasetURL)
if response.status_code == 200:
    zip_file = ZipFile(BytesIO(response.content))
    csv_file_name = zip_file.namelist()[0]
else:
    print("下载文件失败")

with zip_file.open(csv_file_name) as csv_file:
    df = pd.read_csv(csv_file)
手动下载

您可以下载 .zip 文件并解包其中的 .csv 文件。在下一行注释,并适当调整此 .csv 文件的路径。

df = pd.read_csv("/path/to/iot_telemetry_data.csv")

加载数据到 Cassandra

本节假设存在一个数据框 df,下面的单元格将验证其结构。上面的下载部分创建了此对象。

assert df is not None, "必须设置数据框 'df'"
expected_columns = [
    "ts",
    "device",
    "co",
    "humidity",
    "light",
    "lpg",
    "motion",
    "smoke",
    "temp",
]
assert all(
    [column in df.columns for column in expected_columns]
), "数据框没有预期的列"

# 创建并加载表:
```python
from datetime import UTC, datetime
from cassandra.query import BatchStatement

# 创建 sensors 表
table_query = """
CREATE TABLE IF NOT EXISTS iot_sensors (
    device text,
    conditions text,
    room text,
    PRIMARY KEY (device)
) WITH COMMENT = 'Environmental IoT room sensor metadata.';
"""
session.execute(table_query)

pstmt = session.prepare(
    """
INSERT INTO iot_sensors (device, conditions, room)
VALUES (?, ?, ?)
"""
)

devices = [
    ("00:0f:00:70:91:0a", "稳定条件,较凉爽且更潮湿", "房间 1"),
    ("1c:bf:ce:15:ec:4d", "温度和湿度变化很大", "房间 2"),
    ("b8:27:eb:bf:9d:51", "稳定条件,较温暖且更干燥", "房间 3"),
]

for device, conditions, room in devices:
    session.execute(pstmt, (device, conditions, room))

print("传感器插入成功。")

# 创建数据表
table_query = """
CREATE TABLE IF NOT EXISTS iot_data (
    day text,
    device text,
    ts timestamp,
    co double,
    humidity double,
    light boolean,
    lpg double,
    motion boolean,
    smoke double,
    temp double,
    PRIMARY KEY ((day, device), ts)
) WITH COMMENT = '来自环境物联网房间传感器的数据。列包括设备标识符,数据收集的时间戳 (ts),一氧化碳水平 (co),相对湿度,光线存在,LPG 浓度,运动检测,烟雾浓度和温度 (temp)。数据按天和设备分区。';
"""
session.execute(table_query)

pstmt = session.prepare(
    """
INSERT INTO iot_data (day, device, ts, co, humidity, light, lpg, motion, smoke, temp)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
)

def insert_data_batch(name, group):
    batch = BatchStatement()
    day, device = name
    print(f"正在为天:{day}, 设备:{device} 插入批量")

# 将列转换为适当的类型
df["light"] = df["light"] == "true"
df["motion"] = df["motion"] == "true"
df["ts"] = df["ts"].astype(float)
df["day"] = df["ts"].apply(
    lambda x: datetime.fromtimestamp(x, UTC).strftime("%Y-%m-%d")
)

grouped_df = df.groupby(["day", "device"])

for name, group in grouped_df:
    insert_data_batch(name, group)

print("数据加载完成")
print(session.keyspace)

加载工具

演示的 Python 导入语句:

from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_community.agent_toolkits.cassandra_database.toolkit import (
    CassandraDatabaseToolkit,
)
from langchain_community.tools.cassandra_database.prompt import QUERY_PATH_PROMPT
from langchain_community.tools.cassandra_database.tool import (
    GetSchemaCassandraDatabaseTool,
    GetTableDataCassandraDatabaseTool,
    QueryCassandraDatabaseTool,
)
from langchain_community.utilities.cassandra_database import CassandraDatabase
from langchain_openai import ChatOpenAI

CassandraDatabase 对象是从 cassio 加载的,尽管它也接受 Session 类型的参数作为替代。
# 创建 CassandraDatabase 实例
db = CassandraDatabase(include_tables=["iot_sensors", "iot_data"])

# 创建 Cassandra 数据库工具
query_tool = QueryCassandraDatabaseTool(db=db)
schema_tool = GetSchemaCassandraDatabaseTool(db=db)
select_data_tool = GetTableDataCassandraDatabaseTool(db=db)

工具可以直接调用:

# 测试工具
print("执行 CQL 查询:")
query = "SELECT * FROM iot_sensors LIMIT 5;"
result = query_tool.run({"query": query})
print(result)

print("\n获取 keyspace 的架构:")
schema = schema_tool.run({"keyspace": keyspace})
print(schema)

print("\n从表中获取数据:")
table = "iot_data"
predicate = "day = '2020-07-14' and device = 'b8:27:eb:bf:9d:51'"
data = select_data_tool.run(
    {"keyspace": keyspace, "table": table, "predicate": predicate, "limit": 5}
)
print(data)

代理配置

from langchain.agents import Tool
from langchain_experimental.utilities import PythonREPL

python_repl = PythonREPL()

repl_tool = Tool(
    name="python_repl",
    description="Python shell。使用此工具执行 Python 命令。输入应该是有效的 Python 命令。如果你想看到某个值的输出,你应该使用 print(...) 打印出来。",
    func=python_repl.run,
)
from langchain import hub

llm = ChatOpenAI(temperature=0, model="gpt-4-1106-preview")
toolkit = CassandraDatabaseToolkit(db=db)
context = toolkit.get_context()

tools = toolkit.get_tools()

tools = [schema_tool, select_data_tool, repl_tool]

input = (
    QUERY_PATH_PROMPT
    + f"""
这里是你的任务:在 {keyspace} keyspace 中,找出 2020 年 7 月 14 日,每个设备的温度超过 23 度的总次数。
创建一个包括房间名称的摘要报告。如果有帮助,可以使用 Pandas。
"""
)

prompt = hub.pull("hwchase17/openai-tools-agent")

messages = [

    HumanMessagePromptTemplate.from_template(input),

    AIMessage(content=QUERY_PATH_PROMPT),

    MessagesPlaceholder(variable_name="agent_scratchpad"),

    prompt = ChatPromptTemplate.from_messages(messages)

print(prompt)

选择将驱动代理的 LLM

只有某些模型支持此操作

llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0)

构建 OpenAI 工具代理

agent = create_openai_tools_agent(llm, tools, prompt)

print("可用工具:")
for tool in tools:
    print("\t" + tool.name + " - " + tool.description + " - " + str(tool))
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

response = agent_executor.invoke({"input": input})

print(response["output"])

总结

本文介绍了如何设置环境,安装必要的 Python 模块,加载 .env 文件,并连接到 Cassandra 数据库。接着,从 Kaggle 下载环境传感器遥测数据集,并将其加载到 Cassandra 中。之后,介绍了如何加载和测试 Cassandra 数据库工具,并配置代理以执行查询任务。最后,展示了如何使用 AgentExecutor 执行代理并获取响应输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hugo_Hoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值