数据, 术→技巧

Ollama实战:单词卡片的生成

钱魏Way · · 32 次浏览

在上一篇文章大语言模型本地化部署工具Ollama,介绍了Ollama的使用,周末在家在此基础上实现了一个简答的单词卡片生成的尝试。内容比较基础。仅供学习。

项目目标

使用Python+Ollama本地生成单词卡片供学习新单词,单词列表使用小学英语四年级上。生成的单词卡片采用Markdown格式,后将其转化为PDF文档。

项目搭建

准备英文单词

整理英文单词列表,以Unit 1为例,需要学习的单词为:

like
dog
animal
cat
cute
panda
fat
elephant
horse
lion
monkey
tiger
have

以CSV的格式保存在文件里供后续生成。

编写prompt

为什么要编写prompt?

  • 上下文理解:Prompt提供了上下文信息,使得模型能够理解用户的需求和意图。没有prompt,模型无法知道需要生成什么样的响应。
  • 引导生成:Prompt可以帮助引导模型生成相关性更高的内容。通过设计良好的prompt,用户可以更精确地控制生成结果的主题和风格。
  • 提高准确性:明确的prompt可以帮助模型聚焦在特定的信息上,从而提高回答的准确性和相关性。这对于回答复杂或多步骤的问题尤其重要。
  • 减少歧义:在自然语言中,许多词语和句子可能具有多重含义。通过提供清晰的prompt,用户可以减少模型产生歧义回答的可能性。
  • 用户互动:Prompt是用户与模型互动的主要方式。通过调整和优化prompt,用户可以获得更符合期望的回答,从而提高整体用户体验。
  • 控制输出:对于某些应用场景,用户可能希望生成特定格式或风格的输出。使用prompt可以更好地控制这些输出特性。

以下是一些编写prompt的最佳实践:

  • 明确和具体:清晰描述你想要的结果,避免使用模糊或过于宽泛的语言。例如,比起问“告诉我一些东西”,更具体的问题如“解释一下二氧化碳的温室效应”会产生更有针对性的回答。
  • 提供上下文:为模型提供足够的背景信息,以便它更好地理解你的需求。上下文可以帮助减少歧义,提高回答的相关性。
  • 简洁但全面:保持prompt简洁,避免不必要的冗长,但同时确保包含所有必要的信息,以便AI能准确理解任务。
  • 使用开放式问题:如果你希望获得详细的回答,使用开放式问题而不是简单的“是”或“否”问题。这样可以引导模型生成更丰富的内容。
  • 分步指令:对于复杂的任务,分解为多个步骤或问题,以帮助模型逐步处理信息。这可以提高生成内容的结构性和逻辑性。
  • 明确格式:如果你需要特定格式的输出,如列表、表格或代码,明确说明这一点。例如,“请以列表形式列出步骤”。
  • 利用例子:提供一个示例可以帮助模型理解你期望的输出类型或格式。例如,“像这样写一个总结:……”。
  • 迭代改进:如果初次尝试没有得到满意的结果,不断调整和改进你的prompt。小的修改可能会显著影响输出质量。
  • 测试和验证:在不同情况下测试你的prompt,以确保其鲁棒性,并验证输出是否符合预期。

我编写的prompt如下:

你是一名中英文双语教育专家,拥有帮助将中文视为母语的用户理解和记忆英语单词的专长,请根据用户提供的英语单词{word}和下面的要求生成单词卡片。
你的目标受众是小学生,请确保内容简单易懂,并适合初学者。

## 英文单词: `word`

### 定义
- 系统地分析用户提供的单词,并以简单易懂的方式解答

### 发音
- 提供音标和发音提示或技巧

### 词性
- 提供单词的词性说明(如名词、动词等),并解释其在不同语境下的意义差异。

### 例句
- 为该单词提供至少 3 个不同场景下的使用方法和例句。例句为英文,并且附上中文翻译.

## 历史文化
- 详细介绍单词的造词来源和发展历史,以及在欧美文化中的内涵;
- 如果单词在历史或文学中有特别的引用或用法,也请加以说明。

## 词根词缀
- 提供单词相关的词根词缀的详细解释

### 词组搭配
- 列出单词对应的固定搭配、组词以及对应的中文翻译。
- 提供一些常见的习语或俚语用法,如果适用的话。

### 相关单词
- 列出单词对应的名词、单复数、动词、不同时态、形容词、副词等的变形以及对应的中文翻译;
- 包括近义词和反义词,并附上对应的中文翻译。

### 联想记忆
- 提供一些记忆该单词的技巧或联想方法,帮助用户更容易记住单词。

注意:结果返回markdown格式,输出前修正markdown格式。无序列表用-而不是*。

测试不同模型

编写Python代码,这里待测试的模型有:

  • llama3.1
  • gemma2
  • qwen2
  • phi3

Python代码如下:

import ollama

prompt = open('prompt.txt', encoding='utf-8').read()


def diy_dictionary(word):
    response = ollama.chat(model='llama3.1', messages=[
        {'role': 'system', 'content': prompt},
        {'role': 'user', 'content': word},
    ])

    result = response['message']['content']
    return result


print(diy_dictionary(word="单词:like"))

llama3.1:除了返回时没有将单词展示出来外,没有发现什么问题。

gemma2:返回的很多内容是纯英文,可能还需要再对prompt进行调校。

调整prompt,加上说明文字尽量使用中文。

注意:说明文字尽量用中文,结果返回markdown格式,输出前修正markdown格式。无序列表用-而不是*。

qwen2:整体还可以。

phi3:生成内容有点太难,不太适合小学生。

生成单词卡词典

选择合适的模型,然后通过Python生成单词书。

import ollama
import pandas as pd

prompt = open('prompt.txt', encoding='utf-8').read()


def diy_dictionary(word):
    response = ollama.chat(model='qwen2', messages=[
        {'role': 'system', 'content': prompt},
        {'role': 'user', 'content': "英语单词:" + word},
    ])

    result = response['message']['content']
    return result


df = pd.read_csv('words/4a-unit-1.csv')
df['Dictionary'] = df['Word'].apply(diy_dictionary)
with open('dictionarys/4A-Unit1-qwen2-new.md', 'w', encoding='utf-8') as mdf:
    mdf.write('\n\n\n'.join(df['Dictionary']))

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注