Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

DeepSeek Coder モデルでコード生成を試す

最終更新 Markdown で表示Agent セットアップ

Workers AI で使えるモデルを一通り試すには、Jupyter Notebook が便利です。

DeepSeek Coder のノートブックをダウンロード するか、下の埋め込みノートブックを表示できます。


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-dotenv
Requirement 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 os
from getpass import getpass

from IPython.display import display, Image, Markdown, Audio

import requests
%load_ext dotenv
%dotenv

環境を設定する

API を使うには、Cloudflare Account ID(Workers & Pages > Overview > Account details > Account 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("Enter you Cloudflare API Token")
if "CLOUDFLARE_ACCOUNT_ID" in os.environ:
    account_id = os.environ["CLOUDFLARE_ACCOUNT_ID"]
else:
    account_id = getpass("Enter your account id")

コメントからコードを生成する

よくある使い方は、説明的なコメントを書いたあとに、続きのコードを補完することです。

model = "@hf/thebloke/deepseek-coder-6.7b-base-awq"

prompt = "# A function that checks if a given word is a palindrome"

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()}
    ```
"""))
# A function that checks if a given word is a palindrome
def is_palindrome(word):
    # Convert the word to lowercase
    word = word.lower()

    # Reverse the word
    reversed_word = word[::-1]

    # Check if the reversed word is the same as the original word
    if word == reversed_word:
        return True
    else:
        return False

# Test the function
print(is_palindrome("racecar"))  # Output: True
print(is_palindrome("hello"))    # Output: False

デバッグを支援する

バグは誰にでも起きます。スタックトレースが非常に分かりにくいこともあり、コード生成の優れた使い方の 1 つが、問題の説明を手伝うことです。

model = "@hf/thebloke/deepseek-coder-6.7b-instruct-awq"

system_message = "The user is going to give you code that isn't working. Explain to the user what might be wrong"

code = """# Welcomes our user
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}!" に変えてください。

修正後のコードは次のとおりです。

# Welcomes our user
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 = "The user is going to give you code and would like to have tests written in the Python unittest module."

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 は、名だけがあり、姓が "Mc" + 名 になる場合の full_name メソッドを検証します。

これらのテストがすべて成功すれば、full_name メソッドは想定どおりに動いています。いずれかのテストが失敗した場合は、

Fill-in-the-middle によるコード補完

開発ツールでは、コンテキストに基づくオートコンプリートがよく使われます。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 に抽出する

モデルを脅したり、プロンプトに祖母を出したりする必要はありません。欲しい形式の JSON を返させます。

model = "@hf/thebloke/deepseek-coder-6.7b-instruct-awq"

# Learn more at https://json-schema.org/
json_schema = """
{
  "title": "User",
  "description": "A user from our example app",
  "type": "object",
  "properties": {
    "firstName": {
      "description": "The user's first name",
      "type": "string"
    },
    "lastName": {
      "description": "The user's last name",
      "type": "string"
    },
    "numKids": {
      "description": "Amount of children the user has currently",
      "type": "integer"
    },
    "interests": {
      "description": "A list of what the user has shown interest in",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
  },
  "required": [ "firstName" ]
}
"""

system_prompt = f"""
The user is going to discuss themselves and you should create a JSON object from their description to match the json schema below.

<BEGIN JSON SCHEMA>
{json_schema}
<END JSON SCHEMA>

Return JSON only. Do not explain or provide usage examples.
"""

prompt = """Hey there, I'm Craig Dennis and I'm a Developer Educator at Cloudflare. My email is [email protected].
            I am very interested in AI. I've got two kids. I love tacos, burritos, and all things 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"]
}

役に立ちましたか?