DeepSeek Coderモデルを使用したコード生成の探求
Workers AIで利用可能なすべてのモデルを探る便利な方法は、Jupyter Notebook ↗を使用することです。
DeepSeek Coderノートブックを[ダウンロード]するか、以下の埋め込みノートブックを表示できます。
AIモデルがコードを生成できるようになると、さまざまなユースケースが解放されます。DeepSeek Coder ↗モデル @hf/thebloke/deepseek-coder-6.7b-base-awq と @hf/thebloke/deepseek-coder-6.7b-instruct-awq がWorkers AIで利用可能になりました。
APIを使用してそれらを探求してみましょう!
import sys!{sys.executable} -m pip install requests python-dotenvRequirement already satisfied: requests in ./venv/lib/python3.12/site-packages (2.31.0)Requirement already satisfied: python-dotenv in ./venv/lib/python3.12/site-packages (1.0.1)Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.12/site-packages (from requests) (3.3.2)Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.12/site-packages (from requests) (3.6)Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.12/site-packages (from requests) (2.1.0)Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.12/site-packages (from requests) (2023.11.17)import osfrom getpass import getpass
from IPython.display import display, Image, Markdown, Audio
import requests%load_ext dotenv%dotenvAPIを使用するには、CloudflareアカウントID ↗(Workers & Pages > 概要 > アカウントの詳細 > アカウントIDに移動)とWorkers AI有効なAPIトークン ↗が必要です。
これらのファイルを環境に追加したい場合は、.envという名前の新しいファイルを作成できます。
CLOUDFLARE_API_TOKEN="YOUR-TOKEN"CLOUDFLARE_ACCOUNT_ID="YOUR-ACCOUNT-ID"if "CLOUDFLARE_API_TOKEN" in os.environ: api_token = os.environ["CLOUDFLARE_API_TOKEN"]else: api_token = getpass("Cloudflare APIトークンを入力してください")if "CLOUDFLARE_ACCOUNT_ID" in os.environ: account_id = os.environ["CLOUDFLARE_ACCOUNT_ID"]else: account_id = getpass("アカウントIDを入力してください")一般的なユースケースは、ユーザーが説明的なコメントを提供した後にコードを完成させることです。
model = "@hf/thebloke/deepseek-coder-6.7b-base-awq"
prompt = "# 与えられた単語が回文かどうかをチェックする関数"
response = requests.post( f"https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/{model}", headers={"Authorization": f"Bearer {api_token}"}, json={"messages": [ {"role": "user", "content": prompt} ]})inference = response.json()code = inference["result"]["response"]
display(Markdown(f""" ```python {prompt} {code.strip()} ```"""))# 与えられた単語が回文かどうかをチェックする関数def is_palindrome(word): # 単語を小文字に変換 word = word.lower()
# 単語を逆にする reversed_word = word[::-1]
# 逆の単語が元の単語と同じかどうかをチェック if word == reversed_word: return True else: return False
# 関数をテストprint(is_palindrome("racecar")) # 出力: Trueprint(is_palindrome("hello")) # 出力: False私たちは皆、バグに遭遇したことがあります。時にはスタックトレースが非常に intimidating であり、コード生成を使用する素晴らしいユースケースは、問題を説明するのを助けることです。
model = "@hf/thebloke/deepseek-coder-6.7b-instruct-awq"
system_message = "ユーザーが動作しないコードを提供します。ユーザーに何が間違っているかを説明してください"
code = """# ユーザーを歓迎しますdef hello_world(first_name="World"): print(f"Hello, {name}!")"""
response = requests.post( f"https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/{model}", headers={"Authorization": f"Bearer {api_token}"}, json={"messages": [ {"role": "system", "content": system_message}, {"role": "user", "content": code}, ]})inference = response.json()response = inference["result"]["response"]display(Markdown(response))あなたのコードのエラーは、定義されていない変数 name を使用しようとしていることです。使用すべき正しい変数は first_name です。したがって、f"Hello, {name}!" を f"Hello, {first_name}!" に変更する必要があります。
修正されたコードは次のとおりです:
# ユーザーを歓迎しますdef hello_world(first_name="World"): print(f"Hello, {first_name}")これで、hello_world() を呼び出すと、デフォルトで “Hello, World” と表示されます。hello_world("John") を呼び出すと、“Hello, John” と表示されます。
ユニットテストを書くことは一般的なベストプラクティスです。十分なコンテキストがあれば、ユニットテストを書くことが可能です。
model = "@hf/thebloke/deepseek-coder-6.7b-instruct-awq"
system_message = "ユーザーがコードを提供し、Pythonのunittestモジュールでテストを書くことを希望しています。"
code = """class User:
def __init__(self, first_name, last_name=None): self.first_name = first_name self.last_name = last_name if last_name is None: self.last_name = "Mc" + self.first_name
def full_name(self): return self.first_name + " " + self.last_name"""
response = requests.post( f"https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/{model}", headers={"Authorization": f"Bearer {api_token}"}, json={"messages": [ {"role": "system", "content": system_message}, {"role": "user", "content": code}, ]})inference = response.json()response = inference["result"]["response"]display(Markdown(response))Userクラスのためのシンプルなunittestテストケースは次のとおりです:
import unittest
class TestUser(unittest.TestCase):
def test_full_name(self): user = User("John", "Doe") self.assertEqual(user.full_name(), "John Doe")
def test_default_last_name(self): user = User("Jane") self.assertEqual(user.full_name(), "Jane McJane")
if __name__ == '__main__': unittest.main()このテストケースでは、2つのテストがあります:
test_full_nameは、ユーザーがファーストネームとラストネームの両方を持っているときのfull_nameメソッドをテストします。test_default_last_nameは、ユーザーがファーストネームのみを持っているときのfull_nameメソッドをテストし、ラストネームが “Mc” + ファーストネームに設定されます。
これらのテストがすべて合格すれば、full_name メソッドが期待通りに動作していることを意味します。これらのテストのいずれかが失敗すれば、それは…
開発者ツールにおける一般的なユースケースは、コンテキストに基づいて自動補完することです。DeepSeek Coderは、既存のコードをプレースホルダーとともに提出する機能を提供し、モデルがコンテキスト内で補完できるようにします。
警告:トークンは <| で始まり |> で終わりますので、コピー&ペーストする際は注意してください。
model = "@hf/thebloke/deepseek-coder-6.7b-base-awq"
code = """<|fim▁begin|>import re
from jklol import email_service
def send_email(email_address, body): <|fim▁hole|> if not is_valid_email: raise InvalidEmailAddress(email_address) return email_service.send(email_address, body)<|fim▁end|>"""
response = requests.post( f"https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/{model}", headers={"Authorization": f"Bearer {api_token}"}, json={"messages": [ {"role": "user", "content": code} ]})inference = response.json()response = inference["result"]["response"]display(Markdown(f""" ```python {response.strip()} ```"""))is_valid_email = re.match(r"[^@]+@[^@]+\.[^@]+", email_address)モデルを脅迫したり、祖母をプロンプトに持ち込む必要はありません。希望する形式のJSONを取得します。
model = "@hf/thebloke/deepseek-coder-6.7b-instruct-awq"
# 詳細は https://json-schema.org/ を参照してください。json_schema = """{ "title": "User", "description": "私たちの例アプリのユーザー", "type": "object", "properties": { "firstName": { "description": "ユーザーのファーストネーム", "type": "string" }, "lastName": { "description": "ユーザーのラストネーム", "type": "string" }, "numKids": { "description": "ユーザーが現在持っている子供の数", "type": "integer" }, "interests": { "description": "ユーザーが興味を示したリスト", "type": "array", "items": { "type": "string" } }, }, "required": [ "firstName" ]}"""
system_prompt = f"""ユーザーが自分自身について話し、以下のJSONスキーマに一致するJSONオブジェクトを作成する必要があります。
<BEGIN JSON SCHEMA>{json_schema}<END JSON SCHEMA>
JSONのみを返してください。説明や使用例は提供しないでください。"""
prompt = """こんにちは、私はCraig Dennisで、Cloudflareの開発者教育者です。私のメールはcraig@cloudflare.comです。 AIに非常に興味があります。子供が2人います。タコス、ブリトー、そしてCloudflareのすべてが大好きです。"""
response = requests.post( f"https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/{model}", headers={"Authorization": f"Bearer {api_token}"}, json={"messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": prompt} ]})inference = response.json()response = inference["result"]["response"]display(Markdown(f""" ```json {response.strip()} ```""")){ "firstName": "Craig", "lastName": "Dennis", "numKids": 2, "interests": ["AI", "Cloudflare", "Tacos", "Burritos"]}