コンテンツにスキップ

DeepSeek Coderモデルを使用したコード生成の探求

Last reviewed: 8 months ago

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-awqWorkers 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アカウントID(Workers & Pages > 概要 > アカウントの詳細 > アカウントIDに移動)とWorkers AI有効なAPIトークンが必要です。

これらのファイルを環境に追加したい場合は、.envという名前の新しいファイルを作成できます。

Terminal window
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")) # 出力: True
print(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に抽出

モデルを脅迫したり、祖母をプロンプトに持ち込む必要はありません。希望する形式の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"]
}