商用利用確認自動化したい民
背景
生成AIツールが量産されている昨今、利用規約を確認せずインフルエンサーが紹介したツールを闇雲に活用するのは事業者としては危険である。大抵公式ホームページに TERMS of USEとしてリンクがあるのだが、目視で確認しようとすると、大体フォントが小さくて見つけるのも手間だし、読むのも長い。
そこで、ファクトチェックツールとしてGenspark Autopilot Agentが挙げられる。Genspark Autopilot Agentを触っていて実用性を感じたのは、OpenPoseやWav2lipのような古の機械学習技術で、Github repositoryのREADME.mdにライセンスが明記されているようなパターンである。
しかし、登場して間もないツールの場合、Genspark Autopilot Agentの検索では、ChatGPTで作られた品質確認されていない記事まで引っ張ってきたり、名前が似ている別の製品の記事情報を持ってきたりと、判断情報が怪しい場合があった。
今回は、公式ホームページのURLを渡して、商用利用判断とその根拠を出すようなプチツールが欲しいと思い、試作品を作ってみた。
環境
rye + uvを使っています
prompt frameworkはellを使っています
rye add ell-ai[all] beautifulsoup4
rye sync
コード
システムプロンプトをOpenAIのプロンプトジェネレーターで作成
import ell
import argparse
import requests
from bs4 import BeautifulSoup
from pydantic import BaseModel, Field
class CommercialUseResponse(BaseModel):
commercial_use_allowed: bool = Field(..., description="商用利用が許可されているかどうか")
justification_text: str = Field(..., description="商用利用に関連する根拠のテキスト")
@ell.complex(model="gpt-4o-mini", response_format=CommercialUseResponse)
def extract_commercial_use_text(content: str) -> CommercialUseResponse:
"""
利用規約ページのテキストを分析し、商用利用が可能かどうかの判断を行い、その根拠となるテキストを抽出して提示してください。
# Steps
1. **テキストの読み込みと理解**: 与えられた利用規約ページのテキストをまず理解し、商用利用に関連するセクションを特定してください。
2. **商用利用制限の検出**: 商用利用の可否に関する記述がある文やセクションを探し出し、内容を評価します。
3. **根拠の抽出**: 商用利用の可否を決定する際に参考にした具体的なテキスト部分を選定し、抽出します。
4. **結果の決定**: 上記の分析を基に、商用利用が可能か否かを結論付けます。
# Output Format
応答はJSON形式で出力してください。以下のフォーマットに従ってください:
```json
{
"commercial_use_allowed": [true/false],
"justification_text": "[商用利用に関連する根拠のテキスト]"
}
```
# Examples
**入力**:
テキスト: メディアや情報が商用目的で使用される場合、事前の書面による承認が必要です。
**出力**:
```json
{
"commercial_use_allowed": false,
"justification_text": "メディアや情報が商用目的で使用される場合、事前の書面による承認が必要です。"
}
```
(注: 実際の入力テキストや出力は、この例よりも長いことが予想されるため、より詳細に根拠テキストを含むようにしてください。)
# Notes
- 利用規約には商用利用に関する明示的な許可または禁止が記載されていることが多いですが、明示されていない場合もあります。その際には、推論によって最も適切な結論を導き出してください。
- 商用利用に関する一般的なキーワードとして、「商用」、「販売」、「マーケティング」、「書面による承認」などが頻繁に使用されます。
"""
return f"""
<ゴール>
商用利用可否のテキストを抽出してください。
</ゴール>
<制約>
・商用利用可否のテキストは必ず含まれていること
・根拠となる一文を必ず含めること
</制約>
<入力>
{content}
</入力>
"""
def extract_term_url(html_content: str):
"""
ページのHTMLを受け取り、利用規約のurlを返す
"""
soup = BeautifulSoup(html_content, 'html.parser')
hrefs = [a.get('href') for a in soup.find_all('a')]
term_href = [href for href in hrefs if '規約' in href or 'terms' in href]
return term_href
def fetch_html_content(url: str) -> BeautifulSoup:
response = requests.get(url)
return BeautifulSoup(response.text, 'html.parser').prettify()
def main():
parser = argparse.ArgumentParser(description="Process a URL to extract terms and conditions.")
parser.add_argument('--url', type=str, help='URL of the website to process')
args = parser.parse_args()
url = args.url
html_content = fetch_html_content(url)
result = extract_term_url(html_content)
if result:
term_of_use_url = url + result[0]
print("利用規約のURL: ", term_of_use_url)
full_html_content = fetch_html_content(term_of_use_url)
result = extract_commercial_use_text(full_html_content)
print("商用利用可否: ", result.parsed.commercial_use_allowed)
print("根拠: ", result.parsed.justification_text)
if __name__ == "__main__":
main()
結果
runway
$ rye run python check_terms_of_use.py --url https://runwayml.com/
利用規約のURL: https://runwayml.com//terms-of-use
商用利用可否: True
根拠: The Company does not restrict your commercial use of your Outputs.
hailuoai
$ rye run python check_terms_of_use.py --url https://hailuoai.video/
利用規約のURL: https://hailuoai.video//doc/terms-of-service.html
商用利用可否: False
根拠: These Terms of Use permit you to use the Website for your personal, non-commercial use only. You must not access or use for any commercial purposes any part of the Website or any services or materials available through the Website.
とってこれてそう。
ただし、Hailuoaiに関しては、公式Discordで、サブスクライブしていれば商用利用可能との回答があるので、今後利用規約ページが更新される可能性がありそう。(2024/10/13時点)
まとめ
公式URLを渡して、根拠となる一文を含む判断結果を渡してくれる君ができた。ロジックの前提として、"terms"という一文があるaタグのhrefを持ってきているので、想像していない命名で開発された公式ホームページには対応できないので注意。
それでは、快適な生成AIライフを