大模型prompt engineering api开发

项目目标

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

相关推荐

  1. 开源模型源代码

    2024-04-22 11:44:04       5 阅读
  2. 为什么要学习模型应用开发

    2024-04-22 11:44:04       12 阅读
  3. 模型prompt engineering api开发

    2024-04-22 11:44:04       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 11:44:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 11:44:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 11:44:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 11:44:04       18 阅读

热门阅读

  1. torch.where()中并行方式的实现

    2024-04-22 11:44:04       31 阅读
  2. http和https区别与上网过程

    2024-04-22 11:44:04       14 阅读
  3. SQLite去除.db-shm和.db-wal文件【已解决】

    2024-04-22 11:44:04       12 阅读
  4. Spring Boot 中整合 Redisson 实现分布式锁

    2024-04-22 11:44:04       11 阅读
  5. 三年经验!你还不知道KVM虚拟化技术???

    2024-04-22 11:44:04       11 阅读
  6. python内存泄漏解决

    2024-04-22 11:44:04       12 阅读
  7. 工程师每日刷题-7

    2024-04-22 11:44:04       13 阅读
  8. Vue模版语法(初学Vue之v-指令语法)

    2024-04-22 11:44:04       14 阅读
  9. 什么是 ORM(对象关系映射)

    2024-04-22 11:44:04       14 阅读
  10. web开发

    web开发

    2024-04-22 11:44:04      13 阅读
  11. 【数学建模】建筑工地开工问题

    2024-04-22 11:44:04       13 阅读
  12. 速盾:cdn都能防御哪些攻击?

    2024-04-22 11:44:04       12 阅读