INTEGRITY Dokumentace

Generování kódu pomocí modelů DeepSeek Coder

Praktickým způsobem, jak prozkoumat všechny dostupné modely na Workers AI je použít Jupyter Notebook.

Můžete stáhnout poznámkový blok DeepSeek Coder nebo si prohlédněte vložený notebook níže.


Generování kódu pomocí DeepSeek Coder

Schopnost modelů AI generovat kód otevírá řadu případů použití. Model DeepSeek Coder modely @hf/thebloke/deepseek-coder-6.7b-base-awq a @hf/thebloke/deepseek-coder-6.7b-instruct-awq jsou nyní dostupné na Workers AI.

Pojďme si je prozkoumat pomocí 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

Konfigurace prostředí

Chcete-li používat API, budete potřebovat Cloudflare Account ID (přejděte do Workers & Pages > Overview > Account details > Account ID) a API token s podporou Workers AI.

Pokud chcete tyto soubory přidat do svého prostředí, můžete vytvořit nový soubor s názvem .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")

Vygenerujte kód z komentáře

Běžným případem použití je doplnění kódu za uživatele poté, co uvede popisný komentář.

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

Pomoc při ladění

Chyby se stávají každému. Někdy mohou být tyto stacktrace velmi zastrašující, a právě vysvětlení problému je skvělým případem použití generování kódu.

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))

Chyba ve vašem kódu spočívá v tom, že se pokoušíte použít proměnnou name která není ve vaší funkci nikde definována. Správná proměnná, kterou máte použít, je first_name. Proto byste měli změnit f"Hello, {name}!" na f"Hello, {first_name}!".

Zde je opravený kód:

# Welcomes our user
def hello_world(first_name="World"):
    print(f"Hello, {first_name}")

Když zavoláte hello_world(), ve výchozím nastavení vypíše "Hello, World". Pokud zavoláte hello_world("John"), vypíše se "Hello, John".

Napište testy!

Psaní jednotkových testů patří mezi osvědčené postupy. S dostatečným kontextem je možné jednotkové testy napsat.

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))

Zde je jednoduchý testovací případ unittest pro třídu User:

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()

V tomto testovacím případě máme dva testy:

Pokud všechny tyto testy projdou, znamená to, že full_name metoda funguje podle očekávání. Pokud některý z těchto testů selže, znamená to

Doplňování kódu metodou Fill-in-the-middle

Běžným případem použití ve vývojářských nástrojích je automatické doplňování textu na základě kontextu. DeepSeek Coder umožňuje odeslat existující kód se zástupným symbolem, takže model dokáže doplnění vytvořit přímo v daném kontextu.

Varování: Tokeny začínají předponou <| a s příponou |> nezapomeňte je zkopírovat a vložit.

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)

Experimentální: Extrakce dat do JSON

Modelu nemusíte vyhrožovat ani do promptu zatahovat babičku. JSON ve formátu, jaký chcete, získáte zpět i tak.

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"]
}