paint-brush
如何使用 GenLayer 构建 AI 预测智能合约经过@fakela
513 讀數
513 讀數

如何使用 GenLayer 构建 AI 预测智能合约

经过 Favour Kelvin11m2024/06/25
Read on Terminal Reader

太長; 讀書

在本教程中,我将带您了解使用 GenLayer 构建 AI 预测智能合约的过程。我们将介绍:什么是 AI 驱动的智能合约以及智能合约的概念。构建可以访问 Web 并使用 LLM 理解和处理自然语言指令的智能合约。使用 GenLayer 模拟器测试、部署和执行合约。
featured image - 如何使用 GenLayer 构建 AI 预测智能合约
Favour Kelvin HackerNoon profile picture
0-item
1-item

人工智能智能合约使用人工智能访问实时网络数据并解释自然语言指令,从而增强传统智能合约。

📌 快速链接

👩‍💻我们会做什么...

在本教程中,我们将介绍:

  • 什么是人工智能智能合约以及智能合约的概念。
  • 构建预测智能合约的步骤
  • 使用GenLayer模拟器测试、部署和执行合约。


注意:本教程假设并需要您具备一些 Python 知识。

💡 为什么要采用人工智能驱动的智能合约?

毫无疑问,智能合约改变了游戏规则。它们本质上是自动执行的,协议条款直接写入代码中。当满足预定条件时,它们会部署在区块链上,并确保交易安全、透明地处理,而无需第三方。


然而,智能合约只能遵循特定的指令,无法处理意外情况或编程中没有的复杂要求。它们不会根据随时间推移发生的事情进行学习或适应。此外,它们无法独立访问外部数据。它们需要 Oracle 等第三方服务将外部数据提供给智能合约,从而使它们能够对现实世界的事件做出反应。


🤔 什么是智能合约?

GenLayer 试图通过创建智能合约来解决智能合约的这些局限性,它保留了传统智能合约的所有功能,但还可以:


  • 使用 GPT-4 和 LLaMA 等 LLM 模型来理解和处理自然语言指令。

  • 无需第三方工具即可访问和使用来自互联网的实时数据。



GenLayer 使用乐观民主共识方法来验证智能合约的交易和操作。该共识方法的一个关键部分是等价原则。等价原则是乐观民主框架中使用的特定规则或标准集,用于确保在处理非确定性输出(例如由 LLM 或实时网络数据生成的输出)时的准确性和一致性。在我们接下来的内容中,我将进一步解释等价原则以及它在我们执行智能合约时的工作原理。


在本博客中,我们将研究如何构建一个足球预测智能合约,该合约可以从网络获取实时数据并使用 LLM 处理数据以预测比赛结果。听起来很有趣,对吧?


让我们开始吧:)。

⚒️ 设置 GenLayer 模拟器

在开始构建合约之前,我们需要设置运行合约的环境。GenLayer 的模拟器是一个交互式沙箱,我们可以使用它来构建和测试智能合约。让我们来设置它。

先决条件

  • 确保您已安装并运行最新版本的 Docker。
  • 确保 Node.js 和 npm 都更新到最新版本,以避免兼容性问题。

安装

转到您的终端并复制粘贴以下内容以在您的计算机上安装 GenLayer:

 npm install -g genlayer


安装后,运行 init 命令开始设置开发环境的过程:

 genlayer init


当您运行此命令时,它会使用 5 个验证器初始化设置并提示您选择您喜欢的 LLM 提供商。


有三个选项可供选择:

  • OpenAI:运行验证器的最快、最可靠的选择)

  • Ollama:免费开源选项,但性能可能比其他选项慢

  • Heurist:开源 AI 模型的推理提供商


选择完成后,系统会自动下载并配置 GenLayer 模拟器环境所需的 Docker 容器。设置完成后,您可以通过http://localhost:8080/访问 GenLayer 模拟器。


现在,让我们开始制定合同!

⚽ 建立足球预测合约

该模拟器有一个代码编辑器,可以编写代码。


智能合约是用Python编写的,非常适合处理网络交互和自然语言处理所需的数据和字符串操作。


对于此预测合同,我们将从BBC 体育网站检索我们的网络数据,然后使用 LLM 处理检索到的数据以确定哪支球队是获胜球队。让我们看看执行此操作的分步过程


如果您想跳过演练,请检查GitHub上的代码并转到下面的“部署合约”部分。

1.导入所需的库和模块

首先,我们将导入智能合约要使用的库和模块:


 import json from genvm.base.equivalence_principle import EquivalencePrinciple from genvm.base.icontract import IContract


  • json :该模块用于解析和处理JSON数据,JSON是数据交换的常用格式。
  • EquivalencePrinciple :这可确保不同验证器之间的结果一致且准确。通过比较多个验证器的结果,它在维护非确定性输出的完整性方面发挥着至关重要的作用。
  • IContract :在 GenLayer 上创建智能合约的基类,提供必要的属性和行为。它确保合约在 GenLayer(GenVM)环境中顺利集成。

2.定义智能合约类

现在,我们需要定义我们的智能合约类,在本例中它是预测市场。我们的智能合约类继承自IContract 。继承IContract是必要的,以确保合约在 GenLayer 框架内正确执行:


 class PredictionMarket(IContract):

3.添加构造函数参数

接下来,我们将初始化合约的状态并设置必要的参数。这一步至关重要,因为它定义了合约在执行过程中将使用的初始条件和属性:

 class PredictionMarket(IContract): def __init__(self, game_date: str, team1: str, team2: str): self.has_resolved = False self.game_date = game_date self.resolution_url = 'https://www.bbc.com/sport/football/scores-fixtures/' + game_date self.team1 = team1 self.team2 = team2


在这个构造函数中,我们定义以下参数:

  • game_date :游戏日期,格式为“YYYY-MM-DD”。
  • team1 :参加比赛的第一支队伍的名称。
  • team2 :参加比赛的第二支队伍的名称。
  • has_resolved :表示游戏结果是否已经解决,避免重复处理。
  • resolution_url :可从中检索比赛结果的 BBC Sport 网站的 URL。


这些参数定义了我们合约的初始状态,使其能够处理游戏结果。

4. 决定游戏结果

现在,让我们添加一个方法来确定游戏的结果。此方法确保我们仅在游戏结果尚未解决时才处理游戏结果:

 async def resolve(self) -> None: if self.has_resolved: return "Already resolved" final_result = {}


此方法首先通过检查self.has_resolved来检查结果是否已确定。这可以防止冗余处理并确保效率。如果游戏尚未解决,我们将初始化final_result来存储结果。此字典将保存游戏的最终验证结果。

5. 写出等效原理

编写智能合约时,等效原则非常重要。当您访问 Web 或调用 LLM 时,可能会出现不一致的情况。正如我们之前所说,等效原则是用于验证非确定性操作(Web 或 LLM 调用)的最终输出的特定规则或标准集。该原则使用多个验证器,其中一个验证器充当领导者来提出结果,其他验证器根据定义的标准或规则验证该结果。


因此,在我们的合同中,我们需要定义等价原则,以防止从网络输出或使用 LLM 处理时出现不一致:

 async with EquivalencePrinciple( result=final_result, principle="The score and the winner have to be exactly the same", comparative=True, ) as eq:


对于我们的预测合约,等效原则规定“得分和获胜者必须完全相同”。验证者将使用此原则将他们的结果与领导者的结果进行比较。如果结果根据等效原则匹配,则接受最终结果。comparative comparative=True标志表示领导者和验证者都执行相同的任务并比较他们的结果以确保一致性。


在这个等价原理内,我们将获取有关游戏的网络数据使用 LLM 对其进行处理。

获取网络数据

接下来,在等效原理块内,我们将从 BBC 体育新闻网站 URL 检索网页内容:

 web_data = await eq.get_webpage(self.resolution_url) print(web_data)


一旦检索到数据,我们将使用 LLM 对其进行处理,以检查结果并从检索到的网页中确定获胜的团队。

使用 LLM 处理检索到的数据

为了处理从检索到的网页中获取的信息,我们将编写提示发送给 LLM,告诉它需要做什么。与 LLM 交互时,创建清晰且具体的提示非常重要,以指导模型提供准确且相关的响应。这是我们编写的提示:

 task = f"""In the following web page, find the winning team in a matchup between the following teams: Team 1: {self.team1} Team 2: {self.team2} Web page content: {web_data} End of web page data. If it says "Kick off [time]" between the names of the two teams, it means the game hasn't started yet. If you fail to extract the score, assume the game is not resolved yet. Respond with the following JSON format: {{ "score": str, // The score with numbers only, eg, "1:2", or "-" if the game is not resolved yet "winner": int, // The number of the winning team, 0 for draw, or -1 if the game is not yet finished }} """ result = await eq.call_llm(task) print(result)


我们精心设计的提示指导 LLM:

  • 从检索到的网页中识别获胜队伍并得分

  • 我们还为 LLM 添加了检查比赛是否尚未开始的条件。如果两支球队名称之间出现短语“Kick off [time]”,则表示比赛尚未开始。指示 LLM 识别这种情况并理解目前无法提取任何结果。

  • 我们还为 LLM 添加了另一个处理条件,即如果无法提取分数,则假设游戏未解决。这确保未完成或正在进行的游戏得到适当处理。

  • 最后,我们要求 LLM 使用 JSON 格式进行回复


此详细提示可处理不同的场景,并确保 LLM 准确一致地提取和处理所需信息。提示制作完成后,我们会使用call_llm方法将其发送给 LLM。


5. 根据等效原理设定结果

一旦我们从法学硕士 (LLM) 获得结果,我们将根据上面定义的等效原则对其进行检查和验证: “分数和获胜者必须完全相同。”如果结果根据等效原则匹配,则最终结果将被接受。

 eq.set(result)


注意:验证者不会验证等价原理块中的每个步骤,而仅关注最终结果,以减少复杂验证的需要,节省资源并简化合约的操作

6. 解析并评估结果

一旦结果被验证并最终确定,我们现在可以使用json.loads()解析结果。这会将结果转换为易于操作和评估的格式。从我们解析的结果中,我们将提取获胜者和得分:

 result_json = json.loads(final_result['output']) if result_json['winner'] > -1: self.has_resolved = True self.winner = result_json['winner'] self.score = result_json['score'] return result_json


如果游戏结果确定(获胜者 > -1),则合约的状态会相应更新。这确保准确记录最终结果。


现在我们准备部署我们的合约了!


让我们看看我们的合同是如何运作的!

🚀 部署你的足球预测智能合约

  1. 在 GenLayer 模拟器中,单击播放按钮来运行您的合约。

  2. 在构造函数参数部分中,提供比赛日期和要检查的两支球队的名称。例如,您可以将game_date设置为“2024-06-05”,将team1设置为“巴西”,将team2设置为“牙买加”。

  3. 设置游戏详细信息后,点击部署



🎯 执行交易

要与已部署的合约进行交互,请转到执行交易部分。在这里,您可以调用 resolve 方法来处理游戏的结果。



当执行 resolve 方法时:

  • 模拟器运行的节点从指定的 URL(在本例中为 BBC Sport URL)检索数据,然后 LLM 对其进行处理
  • 然后根据代码中定义的等效原理验证最终游戏的结果。

等价原理在智能合约执行时如何发挥作用:

  • 领先者计算:领先者验证器从 BBC 体育获取比赛数据并确定最终比分和获胜队伍。例如,领先者计算比分是“1:2”,牙买加队(第 2 队)战胜巴西队(第 1 队)。
  • 验证者的计算:每个验证者都独立地从同一个 URL 获取游戏数据并执行相同的任务来确定最终得分和获胜者。例如,一个验证者也可能将比分计算为“1:2”,即牙买加队(第 2 队)战胜巴西队(第 1 队)。
  • 比对:验证者将自己的结果与领导者的结果进行比较。根据等效原则,得分和获胜者必须完全相同。如果领导者的结果是“1:2”,牙买加(第 2 队)获胜,则每个验证者的结果也应该是“1:2”,牙买加(第 2 队)获胜。
  • 决策:如果所有验证者的结果与 Leader 的结果匹配,则接受 Leader 的结果为有效。


此过程可确保整个网络的一致性和准确性。如果验证者返回“1:3”,牙买加(第 2 队)为获胜者,而领导者返回“1:2”,牙买加(第 2 队)为获胜者,则验证者将拒绝该结果。

处理不同场景:

  • 如果比赛结束,JSON 响应将包括最终得分和获胜队伍。
  • 如果游戏已经开始但尚未结束,JSON 响应将表明游戏尚未解决。
  • 如果游戏尚未开始,JSON 响应将显示此状态。


查看日志可以了解到合同交互的详细信息。

💭 最后的想法:人工智能智能合约的其他用例

🙌 如果您读完了,那么恭喜您!!!


人工智能智能合约的前景一片光明。除了足球预测合约之外,您还可以使用 GenLayer 模拟器构建和测试其他智能合约创意:

  • 天气预报员
  • ERC-20 代币
  • 股票价格检查器
  • 新闻摘要
  • 旅行计划
  • 图书搜索
  • 逻辑谜题
  • 钱币魔法师


GenLayer 文档中还有更多关于如何实现上述内容的示例想法。