AI 기반 스마트 계약은 AI를 사용하여 실시간 웹 데이터에 액세스하고 자연어 지침을 해석하여 기존 스마트 계약을 향상시킵니다.
이 튜토리얼에서는 다음 내용을 다룹니다.
참고: 이 튜토리얼에서는 Python에 대한 일부 지식이 필요하다고 가정합니다.
스마트 계약은 의심할 여지 없이 게임의 판도를 바꿔 놓았습니다. 이는 계약 조건이 코드에 직접 기록되어 본질적으로 자체 실행됩니다. 미리 결정된 조건이 충족되면 블록체인에 배포되어 제3자 없이도 거래가 안전하고 투명하게 처리되도록 보장합니다.
그러나 스마트 계약은 특정 지침만 따르며 프로그래밍에 없는 예상치 못한 상황이나 복잡한 요구 사항을 처리할 수 없습니다. 그들은 시간이 지남에 따라 일어나는 일을 기반으로 배우거나 적응하지 않습니다. 또한 외부 데이터에 독립적으로 액세스할 수 없습니다. 외부 데이터를 스마트 계약에 공급하여 실제 이벤트에 대응할 수 있도록 하려면 Oracle과 같은 제3자 서비스가 필요합니다.
스마트 계약의 이러한 한계는 GenLayer가 기존 스마트 계약의 모든 기능을 유지하면서도 다음을 수행할 수 있는 지능형 계약을 생성하여 해결하려고 하는 것입니다.
GPT-4 및 LLaMA와 같은 LLM 모델을 사용하여 자연어 지침을 이해하고 처리합니다.
타사 도구 없이도 인터넷에서 실시간 데이터에 액세스하고 사용할 수 있습니다.
GenLayer는 낙관적 민주주의 합의 방법을 사용하여 지능형 계약의 거래 및 운영을 검증합니다. 이 합의 방법의 핵심 부분은 동등성 원칙 입니다. 동등성 원칙은 LLM 또는 실시간 웹 데이터에서 생성된 것과 같은 비결정적 출력을 처리할 때 정확성과 일관성을 보장하기 위해 낙관적 민주주의 프레임워크 내에서 사용되는 특정 규칙 또는 기준 집합입니다. 앞으로는 동등성 원칙과 지능형 계약을 실행할 때 이것이 어떻게 작동하는지에 대해 더 자세히 설명하겠습니다.
이 블로그에서는 웹에서 실시간 데이터를 가져오고 LLM을 사용하여 처리하여 경기 결과를 예측할 수 있는 축구 예측 지능형 계약을 구축하는 방법을 살펴보겠습니다. 흥미롭지 않나요?
바로 들어가 보겠습니다 :).
계약 구축을 시작하기 전에 계약을 실행할 환경을 설정해야 합니다. GenLayer의 시뮬레이터는 지능형 계약을 구축하고 테스트하는 데 사용할 수 있는 대화형 샌드박스입니다. 설정해 보겠습니다.
터미널로 이동하여 다음을 복사하여 붙여넣어 컴퓨터에 GenLayer를 설치합니다.
npm install -g genlayer
설치가 완료되면 init 명령을 실행하여 개발 환경 설정 프로세스를 시작합니다.
genlayer init
이 명령을 실행하면 5개의 유효성 검사기로 설정이 초기화되고 선호하는 LLM 공급자를 선택하라는 메시지가 표시됩니다.
선택할 수 있는 옵션은 세 가지가 있습니다.
OpenAI: 유효성 검사기 실행을 위한 가장 빠르고 안정적인 옵션)
Ollama: 무료 오픈 소스 옵션으로 다른 옵션보다 성능이 느릴 수 있습니다.
Heurist: 오픈 소스 AI 모델을 위한 추론 제공자
선택을 완료하면 GenLayer 시뮬레이터 환경에 필요한 Docker 컨테이너가 자동으로 다운로드 및 구성됩니다. 설정이 완료되면 http://localhost:8080/ 에서 GenLayer Simulator에 액세스할 수 있습니다.
이제 계약을 작성해 봅시다!
시뮬레이터에는 코드 작성을 위한 코드 편집기가 있습니다.
지능형 계약은 Python으로 작성되어 웹 상호 작용 및 자연어 처리에 필요한 데이터 및 문자열 작업을 처리하는 데 이상적입니다.
이 예측 계약을 위해 우리는 BBC Sport 웹사이트 에서 웹 데이터를 검색한 다음 LLM을 사용하여 검색된 데이터를 처리하여 어느 팀이 승리하는 팀인지 결정합니다. 이를 수행하는 단계별 프로세스를 살펴보겠습니다.
연습을 건너뛰려면 GitHub 에서 코드를 확인하고 아래의 "계약 배포" 섹션으로 이동하세요.
먼저 지능형 계약에 사용할 라이브러리와 모듈을 가져옵니다.
import json from genvm.base.equivalence_principle import EquivalencePrinciple from genvm.base.icontract import IContract
json
: 이 모듈은 데이터 교환을 위한 일반적인 형식인 JSON 데이터를 구문 분석하고 처리하는 데 사용됩니다.EquivalencePrinciple
: 결과가 여러 검증자 간에 일관되고 정확하도록 보장합니다. 이는 여러 검증자의 결과를 비교하여 비결정적 출력의 무결성을 유지하는 데 중요한 역할을 합니다.IContract
: GenLayer에서 지능형 계약을 생성하기 위한 기본 클래스로 필수 속성과 동작을 제공합니다. 이는 계약이 GenLayer(GenVM) 환경 내에서 원활하게 통합되도록 보장합니다. 이제 지능형 계약 클래스(이 경우 예측 시장)를 정의해야 합니다. 지능형 계약 계약 클래스는 IContract
에서 상속됩니다. GenLayer 프레임워크 내에서 계약이 올바르게 실행되도록 하려면 IContract
에서 상속해야 합니다.
class PredictionMarket(IContract):
다음으로 계약 상태를 초기화하고 필요한 매개변수를 설정하겠습니다. 이 단계는 계약 실행 전반에 걸쳐 사용할 초기 조건과 속성을 정의하므로 중요합니다.
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입니다.
이러한 매개변수는 계약의 초기 상태를 정의하여 게임 결과를 처리할 수 있도록 준비합니다.
이제 게임의 결과를 결정하는 메서드를 추가해 보겠습니다. 이 방법을 사용하면 아직 해결되지 않은 게임 결과만 처리할 수 있습니다.
async def resolve(self) -> None: if self.has_resolved: return "Already resolved" final_result = {}
이 메서드는 먼저 self.has_resolved
검사하여 결과가 이미 결정되었는지 확인합니다. 이는 중복 처리를 방지하고 효율성을 보장합니다. 게임이 아직 해결되지 않은 경우 final_result
초기화하여 결과를 저장합니다. 이 사전은 게임의 최종 검증 결과를 보유합니다.
동등성 원칙은 지능형 계약을 작성할 때 매우 중요합니다. 웹에 접속하거나 LLM에 전화할 때 불일치가 발생할 수 있습니다. 앞서 말한 등가 원칙은 비결정적 작업(웹 또는 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=True
플래그는 리더와 검증자 모두 동일한 작업을 수행하고 결과를 비교하여 일관성을 보장함을 나타냅니다.
이 동등성 원칙 내에서 게임에 대한 웹 데이터를 가져와 LLM을 사용하여 처리합니다.
앞으로는 동등 원칙 블록 내에서 BBC 스포츠 뉴스 웹사이트 URL에서 웹페이지 콘텐츠를 검색할 것입니다.
web_data = await eq.get_webpage(self.resolution_url) print(web_data)
데이터가 검색되면 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으로 보냅니다.
LLM에서 결과를 얻은 후에는 위에 정의된 동등성 원칙에 따라 확인 및 검증됩니다. "점수와 승자는 정확히 동일해야 합니다." 동등성 원칙에 따라 결과가 일치하면 최종 결과가 승인됩니다.
eq.set(result)
참고: 검증자는 동등성 원칙 블록의 모든 단계를 검증하지 않고 최종 결과에만 집중하여 복잡한 검증의 필요성을 줄이고 리소스 를 절약하며 계약 운영을 단순화합니다.
결과가 검증되고 마무리되면 이제 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) 그에 따라 계약 상태가 업데이트됩니다. 이를 통해 최종 결과가 정확하게 기록됩니다.
이제 계약을 배포할 준비가 되었습니다!
실제 계약 내용을 살펴보겠습니다!
GenLayer Simulator에서 재생 버튼을 클릭하여 계약을 실행하세요.
생성자 매개변수 섹션에 경기 날짜와 확인하려는 두 팀의 이름을 입력하세요. 예를 들어 game_date
"2024-06-05"로, team1
"Brazil"로, team2
"Jamaica"로 설정할 수 있습니다.
게임 세부 정보가 설정되면 배포를 클릭하세요.
배포된 계약과 상호 작용하려면 트랜잭션 실행 섹션으로 이동하세요. 여기서는 게임 결과를 처리하기 위해 Resolve 메소드를 호출할 수 있습니다.
해결 방법이 실행될 때:
이 프로세스는 네트워크 전반에 걸쳐 일관성과 정확성을 보장합니다. 검증인이 자메이카(팀 2)를 승자로하여 "1:3"을 반환하고 리더가 자메이카(팀 2)를 사용하여 "1:2"를 반환하는 경우 검증인은 결과를 거부합니다.
계약 상호 작용에 대한 자세한 정보를 보려면 로그를 확인하세요.
🙌 끝까지 읽으셨다면 축하드립니다!!!
AI 기반 스마트 계약의 미래는 밝아 보입니다. 축구 예측 계약 외에도 GenLayer Simulator로 구축하고 테스트할 수 있는 다른 지능형 계약 아이디어가 있습니다.
GenLayer 문서 에는 위의 일부를 달성하는 방법에 대한 더 많은 예제 아이디어가 있습니다.