如何使用 Code Llama

2023 年 9 月 9 日

两周前,Meta 发布了 Code Llama 模型,该模型有三种变体。

  • 指令
  • 代码补全
  • Python

本指南将介绍如何针对 Code Llama 的不同变体和功能构建提示。

以下示例使用 70 亿参数模型,并使用 4 位量化,但 130 亿和 340 亿参数模型也已推出。本指南使用开源 Ollama 项目来下载和提示 Code Llama,但这些提示也适用于其他模型提供商和运行时。

指令

instruct 模型经过训练可以输出对问题的类似人类的答案。此模型变体最容易使用,并且在行为上最接近 ChatGPT,可以回答包括自然语言和代码在内的各种问题。

提示

ollama run codellama:7b-instruct 'You are an expert programmer that writes simple, concise code and explanations. Write a python function to generate the nth fibonacci number.'

响应

Here is a Python function that generates the nth Fibonacci number:

def fib(n):
    if n <= 1:
        return n
    else:
        return fib(n-1) + fib(n-2)

This function uses the recursive formula for the Fibonacci sequence, which is:

fib(n) = fib(n-1) + fib(n-2)

代码审查

代码审查对于团队来说通常很耗时。Code Llama 可以通过提供对提交或拉取请求的第二组眼睛来帮助检测简单的错误。

提示

ollama run codellama '
Where is the bug in this code?

def fib(n):
    if n <= 0:
        return n
    else:
        return fib(n-1) + fib(n-2)
'

响应

The bug in this code is that it does not handle the case where `n` is equal to 1.

单元测试

编写单元测试通常需要大量的样板代码。Code Llama 可以提供帮助。

提示

ollama run codellama "write a unit test for this function: $(cat fib.py)"

响应

Here's an example of how you could write a unit test for the `fib` function:

```
import unittest

class TestFib(unittest.TestCase):
    def test_fib(self):
        self.assertEqual(fib(0), 0)
        self.assertEqual(fib(1), 1)
        self.assertEqual(fib(2), 1)
        self.assertEqual(fib(3), 2)
        self.assertEqual(fib(4), 3)
        self.assertEqual(fib(5), 5)
        self.assertEqual(fib(6), 8)
        self.assertEqual(fib(7), 13)
        self.assertEqual(fib(8), 21)
        self.assertEqual(fib(9), 34)
if __name__ == '__main__':
    unittest.main()
```

This test case covers all the cases where the input is an integer between 0 and 9, inclusive.

代码补全

标准代码补全模型将根据提供的提示简单地继续生成后续的 token。如果您只想生成代码,例如在看到函数签名或注释后让模型编写函数,此变体最有效。

提示

ollama run codellama:7b-code '# A simple python function to remove whitespace from a string:'

响应

def remove_whitespace(s):
    return ''.join(s.split())

填充

中间填充 (FIM),或者更简短地说,填充是代码补全模型支持的一种特殊提示格式,可以完成两个已编写代码块之间的代码。这对于在现有函数内插入代码特别有效,例如以下示例。

def compute_gcd(x, y):

    <FILL>

    return result

使用 Code Llama,填充提示需要模型预期的特殊格式。

<PRE> {prefix} <SUF>{suffix} <MID>

要将此与现有代码一起使用,请将代码拆分为之前和之后。在上面的示例中,将代码拆分为两部分:前缀和后缀。例如,对于我们上面的 LCM 示例。

提示

ollama run codellama:7b-code '<PRE> def compute_gcd(x, y): <SUF>return result <MID>'

尽管结果会有所不同,但您应该会得到类似于以下内容的结果。

响应

  if x == y:
        return x

    if x > y:
        x = x - y
    else:
        y = y - x

    result = compute_gcd(x, y)

注意:模型可能会在结果末尾返回 <EOT>。这是一个特殊 token,它出现在响应中,表示响应的结尾,类似于 <PRE><SUF><MID>

Python

为了感谢创建该模型的社区和工具,Code Llama 的作者包含了一个 Python 变体,该变体在 100B 个额外的 Python token 上进行了微调,使其成为在机器学习相关工具或任何其他 Python 代码上工作时使用的理想模型。

提示

ollama run codellama:7b-python '
# django view for rendering the current day and time without a template
def current_datetime(request):'

响应

    now = datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

基于 Code Llama 构建的工具