在上一篇文章大语言模型本地化部署工具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']))