llm-universe 提示词工程 api开发 打卡笔记1 —— (datawhale)
llm-universe 提示词工程 api开发 打卡笔记1 —— (datawhale)
项目目标
1.熟悉 LangChain,Rag等大模型开发开源知识,
2.了解llm开发的全部流程,独立开发个人的小助手。
环境配置
使用conda
独立分配一个环境
conda create -n llm-universe
conda activate llm-universe
cd 项目文件夹
pip install -r requirements.txt
llm应用开发
api参数设定
Temperature
对于不同的问题与应用场景,我们可能需要设置不同的 temperature。例如,在本次学习项目搭建的个人知识库助手项目中,我们一般将 temperature 设置为 0,从而保证助手对知识库内容的稳定使用,规避错误内容、模型幻觉;在产品智能客服、科研论文写作等场景中,我们同样更需要稳定性而不是创造性;但在个性化 AI、创意营销文案生成等场景中,我们就更需要创意性,从而更倾向于将 temperature 设置为较高的值。
system prompt
设置此参数相当于设置模型的默认设置。
{
"system prompt": "你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
"user prompt": "我今天有什么事务?"
}
api调用示例
文心一言YB-chat,使用.env文件来存储
import qianfan
from dotenv import load_dotenv, find_dotenv
# 读取本地/项目的环境变量。
# find_dotenv() 寻找并定位 .env 文件的路径
# load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())
def gen_wenxin_messages(prompt):
'''
构造文心模型请求参数 messages
请求参数:
prompt: 对应的用户提示词
'''
messages = [{"role": "user", "content": prompt}]
return messages
def get_completion(prompt, model="Yi-34B-Chat", temperature=0.01):
'''
获取文心模型调用结果
请求参数:
prompt: 对应的提示词
model: 调用的模型,默认为 ERNIE-Bot,也可以按需选择 ERNIE-Bot-4 等其他模型
temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~1.0,且不能设置为 0。温度系数越低,输出内容越一致。
'''
chat_comp = qianfan.ChatCompletion()
message = gen_wenxin_messages(prompt)
resp = chat_comp.do(messages=message,
model=model,
temperature = temperature,
system="你是一名个人助理-小鲸鱼")
return resp["result"]
get_completion("请你告诉我该如何做prompt engineering")
返回值:
Prompt engineering 是一个相对较新的概念,它指的是设计或优化提示(prompts)以获得更好的模型输出。在自然语言处理(NLP)中,提示通常是指在训练语言模型时使用的输入文本,它们可以帮助模型理解并生成符合用户预期的响应。以下是一些提示工程的策略和技巧
return:
1. **明确性(Clarity)**:确保你的提示清晰明确,让模型知道你想要什么。避免歧义和模糊的表述。
2. **具体性(Specificity)**:尽量提供具体的上下文和细节,这样模型才能生成更准确和相关的回答。
3. **简洁性(Brevity)**:尽量保持提示简洁,避免冗长和无关的信息,这有助于模型专注于关键点。
4. **引导性(Directness)**:使用引导性的语言来指导模型生成你想要的输出。例如,使用“请”、“描述”、“解释”等词汇。
5. **反馈循环(Feedback Loop)**:不断迭代和优化你的提示,根据模型的输出调整提示,直到得到满意的结果。
6. **调试(Debugging)**:如果模型输出不符合预期,尝试找出问题所在,可能是提示设计不当,也可能是模型理解错误。
7. **多样化(Variety)**:对于同一个任务,尝试不同的提示,看看哪个效果最好。
8. **上下文敏感性(Context Sensitivity)**:如果你的提示需要考虑特定的背景或上下文,确保在提示中提供足够的背景信息。
9. **避免误导(Avoid Misleading)**:如果你的提示可能引导模型产生不准确或误导性的回答,尽量避免这种情况。
10. **测试和验证(Testing and Validation)**:对你的提示进行充分的测试,确保它们在实际应用中能够产生预期的结果。
11. **参考示例(Example Use)**:如果可能,提供示例或使用案例来帮助模型理解如何应用提示。
12. **适应性(Adaptability)**:根据模型的能力和限制调整提示,确保提示与模型的能力相匹配。
13. **多模态提示(Multimodal Prompts)**:对于支持多模态输入的模型,可以使用图像、声音或其他形式的数据来增强提示。
14. **伦理和敏感性(Ethics and Sensitivity)**:在处理敏感话题时,确保提示不会导致模型产生不适当或冒犯性的输出。
Prompt engineering 是一个相对较新的概念,它指的是设计或优化提示(prompts)以获得更好的模型输出。在自然语言处理(NLP)中,提示通常是指在训练语言模型时使用的输入文本,它们可以帮助模型理解并生成符合用户预期的响应。提示工程是一个不断发展的领域,随着语言模型能力的增强和应用场景的扩大,提示工程师需要不断学习和创新。
提示词工程(prompt engineering)
好的提示词工程才能最大限度的发挥llm大脑的作用,高质量的提问往往才联系着高质量的回答,所以我们应该学习如何更好的写出提示词。以下的内容均基于datawhale提供的开源资料,这些是我认为在prompt-engineering中比较重要点,如果想要系统的学习prompt-engineering,请直接前往 动手学大模型应用开发 查看prompt engineering
章节
使用分隔符清晰地表示输入的不同部分
在编写 Prompt 时,我们可以使用各种标点符号作为“分隔符”,将不同的文本部分区分开来。分隔符就像是 Prompt 中的墙,将不同的指令、上下文、输入隔开,避免意外的混淆。你可以选择用 ```,“”",< >, ,: 等做分隔符,只要能明确起到隔断作用即可。
寻求结构化的输出
有时候我们需要语言模型给我们一些结构化的输出,而不仅仅是连续的文本。什么是结构化输出呢?就是按照某种格式组织的内容,例如 JSON、HTML 等。这种输出非常适合在代码中进一步解析和处理,例如,您可以在 Python 中将其读入字典或列表中。
prompt = f"""
请生成包括书名、作者和类别的三本虚构的、非真实存在的中文书籍清单,\
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
提供少量示例 few-shot learning
“Few-shot” prompting(少样本提示),即在要求模型执行实际任务之前,给模型提供一两个参考样例,让模型了解我们的要求和期望的输出样式。
prompt = f"""
你的任务是以一致的风格回答问题(注意:文言文和白话的区别)。
<学生>: 请教我何为耐心。
<圣贤>: 天生我材必有用,千金散尽还复来。
<学生>: 请教我何为坚持。
<圣贤>: 故不积跬步,无以至千里;不积小流,无以成江海。骑骥一跃,不能十步;驽马十驾,功在不舍。
<学生>: 请教我何为孝顺。
"""
response = get_completion(prompt)
print(response)
<圣贤>: 孝顺者,孝敬父母,顺从长辈,尊重家族传统,忠诚孝道,不忘家国情怀。
给模型时间思考
我们应通过 Prompt 引导语言模型进行深入思考。可以要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。在 Prompt 中添加逐步推理的要求,能让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确。
示例:
text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
他们一边唱着欢乐的歌,一边往上爬,\
然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
虽然略有些摔伤,但他们还是回到了温馨的家中。\
尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
"""
prompt = f"""
1-用一句话概括下面用<>括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个名称。
4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。
请使用以下格式:
摘要:<摘要>
翻译:<摘要的翻译>
名称:<英语摘要中的名称列表>
输出 JSON 格式:<带有 English_summary 和 num_names 的 JSON 格式>
Text: <{text}>
"""
response = get_completion(prompt)
print("response :")
print(response)
response :
摘要:在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水,不幸中途发生意外,但他们仍然充满冒险精神。
翻译:In a charming village, siblings Jack and Jill set out to fetch water from a well on top of a hill, unfortunately encountering an accident along the way, but their adventurous spirit remains undiminished.
名称:Jack, Jill
原文地址:https://blog.csdn.net/q2544048170/article/details/137888123
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!