AI驱动的Web3聊天机器人
在这篇文章中,我们将探讨如何将以太坊区块链数据的强大功能与现代 AI 和 SQL 工具结合起来,创建一个交互式聊天机器人。
一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK
在不断发展的区块链技术世界中,以太坊不仅作为加密货币平台,而且作为强大的开发生态系统,开辟了一个独特的空间。凭借其多功能智能合约和去中心化应用程序,以太坊提供了大量可用于创新应用程序的数据。
想象一下,能够通过对话轻松查询实时以太坊交易数据。无论你是希望跟踪资产的投资者、分析区块链交互的开发人员,还是监控去中心化金融 (DeFi) 趋势的企业,以自然、直观的方式与区块链数据交互的能力都变得越来越有价值。
在这篇文章中,我们将探讨如何将以太坊区块链数据的强大功能与现代 AI 和 SQL 工具结合起来,创建一个交互式聊天机器人。我们将逐步介绍查询以太坊数据、将其存储在 SQLite 数据库中以及设置 AI 驱动的 SQL 代理的步骤,该代理可以回答有关区块链交易的复杂问题——所有这些都通过数据可视化得到增强,以获得更丰富的体验。
在本教程结束时,你将掌握构建自己的交易聊天机器人的基础,该聊天机器人能够让你轻松了解以太坊区块链。无论你是经验丰富的开发人员,还是刚刚涉足区块链和人工智能领域,本指南都将为你提供工具和知识,以创建真正强大的东西。
1、了解以太坊区块链
以太坊不仅仅是一个加密货币平台;它是一个去中心化的计算环境,为从金融服务到游戏等各种应用提供支持。以太坊的核心是其区块链——一个分布式账本,记录使用该平台的原生加密货币以太币 (ETH) 进行的每笔交易。与主要关注数字货币的比特币不同,以太坊旨在成为一个灵活的平台,供开发人员使用智能合约创建去中心化应用程序 (dApp)。
智能合约是自动执行的协议,其中的条款直接写入代码。它们会自动执行和执行合约条款,无需中介机构。这使得以太坊成为开发人员构建需要透明度、安全性和去中心化的应用程序的首选平台。
以太坊最引人注目的方面之一是它生成的大量数据。每笔交易、合约交互和代币转移都记录在区块链上,使其成为开发人员、分析师和企业的宝贵资源。但是,访问和分析这些数据可能很复杂,需要了解区块链技术、API 和数据管理。
在本教程中,我们将揭开使用以太坊数据的过程的神秘面纱。我们将向您展示如何使用 Etherscan API 查询以太坊区块链的交易数据、账户余额和其他关键指标。然后,这些数据将存储在本地 SQLite 数据库中,使其更易于管理和查询。在本节结束时,你将对如何检索和组织以太坊数据有扎实的理解,为构建更高级的应用程序奠定基础。
2、设置环境
在深入查询以太坊数据和构建我们的 AI 驱动的 SQL 代理之前,我们需要设置必要的环境。这涉及安装所需的工具和库、设置 API 密钥以及准备 SQLite 数据库,我们将在其中存储以太坊数据。
2.1 先决条件
要继续本教程,你需要以下内容:
- Python 3.8+:确保你已安装 Python。可以通过在终端中运行
python --version
来检查这一点。 - SQLite:SQLite 是一个轻量级、独立的数据库引擎。它随Python预装,因此无需额外安装。
- 所需的 Python 库:我们将使用几个 Python 库,包括用于 API 调用的请求、用于数据库管理的 sqlite3 和用于创建 SQL 代理的 langchain。
可以使用 pip 安装所需的库:
pip install requests langchain langchain_community
2.2 设置 Etherscan API 密钥
Etherscan 是以太坊的流行区块浏览器,它提供了一个 API 来访问以太坊区块链上的各种数据点。要使用 Etherscan API,你需要注册一个 API 密钥。以下是步骤:
- 注册:前往 Etherscan 并注册一个免费帐户。
- 生成 API 密钥:登录后,导航到 API 密钥部分并生成新的 API 密钥。
获取 API 密钥后,你可以像这样在脚本中设置它:
api_key = 'YOUR_ETHERSCAN_API_KEY'
确保将 YOUR_ETHERSCAN_API_KEY
替换为你从 Etherscan 收到的实际密钥。
3、查询以太坊数据
准备好 API 密钥后,我们现在可以开始查询以太坊数据。我们将从以太坊区块链中获取以下信息:
- 当前以太币价格:以美元计算的最新以太币价格。
- 以太币供应量:以太币的总流通供应量。
- Gas 价格:Gwei 中的当前 Gas 价格。
- 账户余额:特定以太坊地址的以太币余额。
- 交易历史记录:每个以太坊地址最多 10,000 笔最近交易。
查询这些数据的方法如下:
import requests
api_key = 'YOUR_ETHERSCAN_API_KEY'
# Example account addresses
accounts = [
{'name': 'beaver_build', 'address': '0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5'},
{'name': 'stake.com 11', 'address': '0x787B8840100d9BaAdD7463f4a73b5BA73B00C6cA'}
]
def query_api(accounts):
stats = {}
# Current Ether price
ether_price_api = f"https://api.etherscan.io/api?module=stats&action=ethprice&apikey={api_key}"
response_price = requests.get(ether_price_api)
stats["ether_price"] = response_price.json()['result']
# Ether supply
ether_supply_api = f"https://api.etherscan.io/api?module=stats&action=ethsupply&apikey={api_key}"
response_supply = requests.get(ether_supply_api)
stats["ether_supply"] = response_supply.json()['result']
# Gas prices
gas_prices_api = f"https://api.etherscan.io/api?module=gastracker&action=gasoracle&apikey={api_key}"
response_gas = requests.get(gas_prices_api)
stats["gas_prices"] = response_gas.json()['result']
# Account balances and transaction history
accounts_updated = []
for account in accounts:
balance_api = f"https://api.etherscan.io/api?module=account&action=balance&address={account['address']}&tag=latest&apikey={api_key}"
response_balance = requests.get(balance_api)
balance = int(response_balance.json()['result']) / 1e18 # Convert from Wei to Ether
accounts_updated.append({'name': account['name'], 'address': account['address'], 'balance': balance})
return stats, accounts_updated
stats, accounts_updated = query_api(accounts)
此脚本执行以下操作:
- 获取当前 Ether 价格和供应量。
- 检索当前 gas 价格。
- 查询余额以获取以太坊地址列表。
4、在 SQLite 中存储数据
检索到以太坊数据后,我们可以将其存储在 SQLite 数据库中。SQLite 非常适合此目的,因为它轻量且易于设置。以下是创建数据库和存储数据的方法:
import sqlite3
dbname = "ethereum_transactions.db"
def create_sqlite_database(dbname, stats, accounts_updated):
conn = sqlite3.connect(dbname)
cursor = conn.cursor()
# Create tables
cursor.execute("""CREATE TABLE IF NOT EXISTS general_info (
timestamp DATETIME,
ether_price_usd REAL,
ether_supply INTEGER,
gas_price_base REAL,
gas_price_average_priority REAL)""")
cursor.execute("""CREATE TABLE IF NOT EXISTS accounts (
account_name TEXT,
account_address TEXT,
current_balance REAL)""")
# Insert data into tables
cursor.execute(f"""INSERT INTO general_info VALUES (
datetime('now'),
{stats['ether_price']['ethusd']},
{stats['ether_supply']},
{float(stats['gas_prices']['suggestBaseFee']) / 1e9},
{(float(stats['gas_prices']['SafeGasPrice']) +
float(stats['gas_prices']['ProposeGasPrice']) +
float(stats['gas_prices']['FastGasPrice'])) / 3 / 1e9})""")
for account in accounts_updated:
cursor.execute(f"""INSERT INTO accounts VALUES (
'{account['name']}',
'{account['address']}',
{account['balance']})""")
conn.commit()
conn.close()
create_sqlite_database(dbname, stats, accounts_updated)
此代码:
- 连接到 SQLite 数据库(如果不存在则创建它)。
- 创建两个表:一个用于一般以太坊信息(general_info),另一个用于帐户余额(accounts)。
- 将获取的以太坊数据插入这些表中。
将数据存储在 SQLite 数据库中后,查询和操作就会变得更加容易,为下一节中创建交互式 SQL 代理奠定基础。
5、创建 AI 驱动的 SQL 代理
将我们的以太坊数据安全地存储在 SQLite 数据库中后,下一步就是使这些数据具有交互性。我们将通过创建一个 AI 驱动的 SQL 代理来实现这一点,该代理可以查询数据库并回答有关以太坊区块链数据的问题。该代理将由 AWS Bedrock 模型提供支持并使用 langchain 库进行集成。
5.1 SQL 代理简介
SQL 代理是一种弥补自然语言和结构化数据库查询之间差距的工具。它允许用户用简单的英语提出问题,代理将这些查询转换为从数据库中检索相关数据的 SQL 命令。通过利用 AI 模型,代理可以理解你的上下文和查询的细微差别,使与复杂数据集的交互变得更加容易。
在我们的例子中,我们将使用 langchain 库来设置 SQL 代理,该代理将连接到包含以太坊交易数据的 SQLite 数据库。该代理将能够回答诸如“当前以太币供应量是多少?”或“按交易量排名前 3 的账户是什么?”之类的问题。
5.2 设置 SQL 代理
首先,让我们使用 langchain 库创建 SQL 代理。我们将配置它以连接到我们的 SQLite 数据库并使用来自 AWS Bedrock 的 AI 模型来处理查询:
from langchain_community.utilities import SQLDatabase
from langchain.agents import create_sql_agent
from langchain_aws import ChatBedrock
# Connect to the SQLite database
dbname = "ethereum_transactions.db"
db = SQLDatabase.from_uri(f"sqlite:///{dbname}")
# Define the AI model from AWS Bedrock
region_name = 'us-west-2'
model_id = "anthropic.claude-3-opus-20240229-v1:0"
model_kwargs = {
"temperature": 0.0,
}
llm = ChatBedrock(model_id=model_id, region_name=region_name, model_kwargs=model_kwargs)
# Create the SQL agent
sql_agent = create_sql_agent(
llm=llm,
db=db,
verbose=True,
handle_parsing_errors=True,
)
# Example query: What is the current Ether supply?
result = sql_agent.run("What is the current Ether supply?")
print(result)
此代码执行以下操作:
- 连接到 SQLite 数据库:我们使用 SQLDatabase.from_uri() 连接到包含以太坊数据的 SQLite 数据库。
- 配置 AI 模型:ChatBedrock 类用于集成来自 AWS Bedrock 的 AI 模型,该模型将处理和解释自然语言查询。
- 创建 SQL 代理:create_sql_agent() 函数初始化 SQL 代理,将其链接到 AI 模型和数据库。它还处理解析错误以确保顺利运行。
- 示例查询:最后,我们运行查询,询问当前的以太币供应量,代理处理并从数据库中检索该供应量。
5.3 查询示例
现在 SQL 代理已设置,你可以开始询问有关以太坊数据的问题。以下是可以执行的操作的几个示例:
检查当前的 Gas 价格:
result = sql_agent.run("What is the current gas price in Ether?")
print(result)
检索帐户余额:
result = sql_agent.run("What is the current balance of account 0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5? Please convert to US dollars.")
print(result)
查找前 3 个接收帐户:
result = sql_agent.run("What are the top 3 accounts where the account 0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5 has sent the most amount of Ether?")
print(result)
这些示例展示了 SQL 代理如何将自然语言查询转换为 SQL 命令并从中返回有意义的答案以太坊数据集。AI 模型有助于解释查询,使与数据交互变得更加容易,而无需手动编写 SQL。
5.4 处理错误和架构不匹配
使用 AI 驱动的 SQL 代理的优势之一是它能够处理错误并适应架构变化。如果数据库架构与查询不匹配(例如,如果列名已更改),代理通常可以检测到问题并建议更正的查询。此功能在数据结构可能随时间演变的动态环境中特别有用。
通过将 AI 与 SQL 集成,我们创建了一个强大的工具,可简化查询和分析以太坊区块链数据的过程。在下一节中,我们将通过添加数据可视化功能来增强此设置,使数据更易于访问和可操作。
6、可视化区块链数据
虽然使用 SQL 代理查询数据功能强大,但可视化数据可以使洞察更具影响力。数据的可视化表示有助于一目了然地了解模式、趋势和异常值,这在处理区块链交易等复杂数据集时特别有用。在本节中,我们将通过使用 Plotly 库添加数据可视化功能来增强我们的 SQL 代理。
6.1 数据可视化的重要性
数据可视化是数据分析的重要组成部分。它使我们能够:
- 识别趋势:快速查看以太币价格或 gas 费等指标随时间的变化情况。
- 比较数据:轻松比较多个账户的余额或不同时期的交易量。
- 发现异常:检测交易中的异常活动或 gas 价格的突然飙升。
通过将可视化集成到我们的 SQL 代理中,我们可以直接从存储在 SQLite 数据库中的以太坊数据生成图表和图形,使结果更直观、更易于解释。
6.2 将 Plotly 添加到 SQL 代理
为了使我们的 SQL 代理能够生成可视化效果,我们将使用 Plotly,这是一个用于创建交互式图形的流行 Python 库。我们首先定义一个函数,该函数获取查询结果并创建条形图。
import plotly.express as px
import plotly.io as pio
import json
from langchain.agents import initialize_agent
from langchain.tools import Tool, StructuredTool
from langchain.pydantic_v1 import BaseModel, Field
pio.renderers.default = 'iframe' # This setting ensures that the charts render correctly in a Jupyter notebook
# Define a function to plot results using Plotly
def plot_result_plotly(plottitle: str, xlabel: str, ylabel: str, dict_of_values: str):
dict_of_values = json.loads(dict_of_values.strip().replace("'", '"'))
items = list(dict_of_values.keys())
values = list(dict_of_values.values())
fig = px.bar(x=items, y=values, title=plottitle)
fig.update_yaxes(title=ylabel)
fig.update_xaxes(title=xlabel)
fig.show()
return "Success"
# Define the input schema for the plotting function
class PlottingInput(BaseModel):
plottitle: str = Field(description="Plot title")
xlabel: str = Field(description="X-axis label")
ylabel: str = Field(description="Y-axis label")
dict_of_values: str = Field(description="JSON object with keys as x-axis values and corresponding y-axis values")
# Create a tool for the Plotly plotting function
plotting_tool = StructuredTool.from_function(
func=plot_result_plotly,
name="Plotting Results",
description="Create bar plot of the results using Plotly library",
handle_tool_error=True,
args_schema=PlottingInput,
return_direct=True,
)
# Initialize the agent with the plotting tool
sql_plot_agent = initialize_agent(
tools=[
Tool(
name="databaseAgent",
func=sql_agent.run,
description="Agent to query SQLite database",
),
plotting_tool,
],
llm=llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
agent_executor_kwargs={'handle_parsing_errors': True},
handle_parsing_errors=True
)
此代码执行以下操作:
- 设置 Plotly:配置 Plotly 以在 Jupyter 笔记本环境中呈现图表。
- 定义绘图函数:plot_result_plotly() 采用标题、轴标签和数据值来创建条形图。
- 创建绘图工具:使用 StructuredTool 包装绘图函数,使其可由 SQL 代理调用。
- 增强 SQL 代理:将绘图工具集成到 SQL 代理中,以便它可以根据查询结果生成图表。
6.3 示例可视化
现在我们的 SQL 代理可以生成可视化,让我们看一些实际工作示例。
绘制前 3 个接收账户:
sql_plot_agent.run(
"""Based on the SQLite database, please find out the top 3 accounts
where the account 0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5
has sent the most amount of Ether. Please plot the results."""
)
此命令查询数据库中特定以太坊地址的前 3 个接收账户,然后在条形图中可视化结果。图表将在 x 轴上显示地址,在 y 轴上显示收到的以太币总量。
可视化每月以太币交易:
sql_plot_agent.run(
"""Based on the SQLite database, please find out how much Ether
the account 0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5 sent in
August 2024, July 2024, and June 2024. Please plot the results."""
)
此示例查询数据库以获取帐户在每个指定月份发送的以太币总数,然后生成比较每月总数的条形图。
通过将 Plotly 与我们的 SQL 代理集成,我们可以将原始数据转换为信息丰富的可视化效果,从而更易于解释和根据洞察采取行动。无论您是在比较交易量、监控账户余额还是分析 gas 价格,这些可视化工具都能让您的以太坊数据栩栩如生。
在最后一节中,我们将探讨此 AI 驱动的 SQL 代理的潜在用例,并讨论如何扩展此设置以满足您的特定需求。
7、用例和应用程序
现在我们已经设置了一个能够查询和可视化以太坊区块链数据的 AI 驱动的 SQL 代理,让我们探索一些潜在的用例以及如何扩展此设置以满足您的特定需求。这个灵活而强大的工具可以应用于各种场景,从财务分析到教育工具等等。
潜在用例包括:
a) 投资者仪表板:
- 概述:投资者可以使用此设置来监控他们的以太坊账户、跟踪交易历史记录并可视化以太币价格趋势。通过将 SQL 代理与前端仪表板集成,用户可以实时了解他们的投资组合。
- 示例查询:“上个月从我的钱包发送的以太币总量是多少?绘制每周细分。”
b) 面向开发人员的区块链分析:
- 概述:从事去中心化应用程序 (dApp) 的开发人员可以通过分析交易模式、gas 价格波动和智能合约交互来从此工具中受益。这有助于优化合约性能和成本效率。
- 示例查询:“上周交易的 gas 价格高峰时间是什么?在一行中显示此信息图表。”
c) 教育工具:
- 概述:教育工作者和学生可以使用此 SQL 代理通过查询真实数据来了解区块链技术。可视化交易流程和以太币供应变化可以使复杂的概念更容易理解。
- 示例查询:“过去一年以太币供应量如何变化?以条形图显示每月变化。”
d) 合规性和审计:
- 概述:公司和审计师可以利用此设置通过跟踪大额交易、监控账户余额和生成区块链活动报告来确保遵守财务法规。
- 示例查询:“识别过去一个季度超过 100 以太币的任何交易。提供详细列表。”
e) 研究与开发:
- 概述:研究区块链技术的研究人员可以分析大量交易、智能合约部署和代币转移数据集。这有助于识别趋势、潜在漏洞或市场行为。
- 示例查询:“过去 6 个月按交易量排名前 5 位的账户是什么?绘制分布图。”
8、结束语
在这篇博文中,我们介绍了创建一个与以太坊区块链数据交互的强大工具的过程。从查询实时数据并将其存储在 SQLite 数据库中,到设置 AI 驱动的 SQL 代理并可视化结果,您已经构建了一个可以适应各种应用程序的多功能系统。
无论你是投资者、开发者、教育工作者还是研究人员,此设置都为探索和分析区块链数据提供了灵活的基础。可能性是巨大的,只需进行一些调整,你就可以扩展此工具以满足特定需求,甚至构建全新的应用程序。
我们鼓励你尝试代码,探索不同的用例,并思考如何将此设置应用于你自己的项目中。区块链技术正在迅速发展,拥有与这些数据交互和理解这些数据的工具是在这个充满活力的领域保持领先地位的关键。
原文链接:Web3: Building a Transactional Chatbot
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。