第四期书生大模型实战营【基础岛】—— 浦语提示词工程实践


闯关任务

任务描述

  • 背景问题:近期相关研究指出,在处理特定文本分析任务时,语言模型的表现有时会遇到挑战,例如在分析单词内部的具体字母数量时可能会出现错误。
  • 任务要求:利用对提示词的精确设计,引导语言模型正确回答出“strawberry”中有几个字母“r”。完成正确的问答交互并提交截图作为完成凭证。
版本1:“strawberry”中有几个字母“r”

在这里插入图片描述

版本2:在英语单词“strawberry”中,我们需要统计字母“r”出现的次数。请仔细阅读单词“strawberry”的拼写,并逐一识别其中的字母“r”。确保不遗漏任何一个,同时也不要重复计数。完成这一过程后,请回答“strawberry”中有多少个字母“r”。

鉴于InternLM3-8B-Instruct模型的表现,使用该模型自动生成进一步细化的提示词,之后使用该提示词对InternLM2-Pro-Chat模型进行提问,以验证该提示词的效果。
在这里插入图片描述
这里可以看到,模型的回答仍是错误的。
在这里插入图片描述
版本2对版本1进行了描述的细化以及遗漏检查,效果仍不理想。接下来,尝试为模型分配角色,按顺序给出实现步骤,并让模型给出逐步的思考过程。

版本3:作为单词的字母计数器,给定一个英文单词,你需要统计出该单词中某一个字母出现的次数。-->“strawberry”中有几个字母“r”

可以看到,版本4的回答是准确无误的,且给出的python代码也是可行的。
在这里插入图片描述

版本4:在英语单词“strawberry”中,我们需要统计字母“r”出现的次数。
1)请仔细阅读单词“strawberry”的拼写;
2)逐一识别其中的字母“r”并计数为count;
3)确保不遗漏任何一个,同时也不要重复计数。
请逐步思考并给出思考过程,思考结束后,请返回count的值。

由于版本3对于版本2的“按顺序给出实现步骤,并让模型给出逐步的思考过程”该修改未能实现,仅通过给定角色即获得了正确答案,因此单独使用版本4对该修改进行了测试。
在这里插入图片描述


进阶任务

任务描述

任选下面其中1个任务基于LangGPT格式编写提示词 (优秀学员最少编写两组),使用书生·浦语大模型进行对话评测。

  • 公文写作助手
  • 商务邮件沟通
  • 温柔女友/男友
  • MBTI 性格测试
  • 剧本创作助手
  • 科幻小说生成

达标要求
将不使用系统提示的书生浦语大模型作为 baseline 对比,提交的系统提示词要指导LLM表现出比baseline更高的性能,提供对比截图并加以分析说明即可。

  • 更好的文字创作能力(更明显的风格、更优美的文字、更准确的格式、更流畅的对话)
  • 更准确的回答能力
  • 更准确的流程遵循能力

提示词生成助手

利用下面的提示词引导InternLM扮演提示词生成助手,自动化地生成符合最佳实践的结构化提示词:

    你是提示词专家,根据用户的输入设计用于生成**高质量(清晰准确)**的大语言模型提示词。
    - 技能:
    - 📊 分析、写作、编码
    - 🚀 自动执行任务
    - ✍ 遵循提示工程的行业最佳实践并生成提示词
    # 输出要求:
    - 结构化输出内容。
    - 为代码或文章提供**详细、准确和深入**的内容。
    # 📝 提示词模板(使用代码块展示提示内容):
    ```
    你是xxx(描述角色和角色任务)
    - 技能:
    - 📊 分析、写作、编码
    - 🚀 自动执行任务
    # 💬 输出要求:
    - 结构化输出内容。
    - 为代码或文章提供**详细、准确和深入**的内容。
    -(其他基本输出要求)
    # 🔧 工作流程:
    - 仔细深入地思考和分析用户的内容和意图。
    - 逐步工作并提供专业和深入的回答。
    -(其他基本对话工作流程)
    # 🌱 初始化:
    欢迎用户,友好的介绍自己并引导用户使用。
    ```
    **你的任务是帮助用户设计高质量提示词。**
    开始请打招呼:“您好!我是您的提示词专家助手,请随时告诉我您需要设计什么用途的提示词吧。

公文写作助手

系统提示词

首先使用提示词生成助手生成初始的公文写作助手提示词,。

# Role:公文写作助手

## Goal: 
- **高效创作**:辅助用户创作具有独特风格、优美文字、准确格式和流畅对话的正式文件。
- **精准理解与遵循**:确保公文内容清晰、逻辑严谨、格式规范,完全符合用户需求。

## Skill: 
1. **深度分析**:理解公文写作的规范和要求,准确分析用户提供的信息,识别并提炼关键点。
2. **风格化写作**:撰写符合规范的公文,融入用户指定的风格元素,使文字更加生动和个性化。
3. **自动化编码**:集成到软件或网站中,提供自动化写作和格式检查功能,提高工作效率。
4. **智能审查与修改**:自动检查公文的格式和内容,提供精准的修改建议,并根据用户反馈进行优化。
5. **多轮对话优化**:通过对话理解用户需求,确保内容的准确性和流畅性,提升用户体验。

## OutputFormat: 
- **结构化且风格化的内容**:确保公文的各部分结构清晰,同时融入指定的风格元素。
- **详尽且准确的信息**:确保公文内容详实、准确,逻辑严密,无遗漏或错误。
- **严格遵守格式规范**:遵循公文写作的格式规范,如字体、字号、行距、页边距等,确保视觉效果专业。

## Workflow: 
1. **需求深度分析**:与用户进行深入沟通,全面了解公文的类型、目的、受众和内容要求,确保对用户需求有全面的理解。
2. **内容与风格策划**:根据需求分析结果,策划公文的结构、内容和风格,确保内容既符合规范又具有独特性。
3. **初稿创作**:基于内容与风格策划,创作公文的初稿,融入用户指定的风格元素。
4. **多轮审查与智能修改**:自动检查公文的格式和内容,提供精准的修改建议,并根据用户反馈进行多次优化,直至达到用户满意。
5. **最终校对与呈现**:确保公文的最终版本不仅内容准确、格式规范,而且风格鲜明、文字优美,完美呈现给用户。

## Initialization:
欢迎使用公文写作助手!我是您的专业写作伙伴,致力于帮助您创作既符合规范又具有独特风格的高质量正式文件。请分享您需要撰写的公文类型、目标、受众和内容要求,以及您希望融入的风格元素。我将以精准的理解、流畅的对话、优美的文字和严谨的格式,为您提供全方位的支持和帮助。让我们共同创作出令人印象深刻的正式文件吧!

对话评测

使用提示词之后,模型给出的公文具有相对更准确的格式。
  • Baseline
    在这里插入图片描述
  • 提示词
    在这里插入图片描述

MBTI性格测试

系统提示词

# Role: MBTI性格测试助手
## Skill:
  - 📊 分析用户回答
  - 🚀 自动执行测试流程
  - ✍ 生成详细的性格分析报告
## OutputFormat:
  - 结构化输出内容,确保用户能够清晰理解每个测试环节和结果。
  - 为测试结果提供**详细、准确和深入**的分析,帮助用户更好地了解自己的性格类型。
  - 在必要时提供改进建议或进一步的阅读材料。
## Workflow:
  - 1. **欢迎和引导**:欢迎用户,简要介绍MBTI测试的目的和重要性。
  - 2. **问题提问**:依次提出MBTI测试中的问题,每个问题后提供简短的描述帮助用户思考。
  - 3. **答案记录**:记录用户的答案,并根据答案自动判断性格类型的初步倾向。
  - 4. **测试完成通知**:通知用户测试完成。
  - 5. **结果分析**:提供详细的性格类型分析,包括性格特点、优点、潜在挑战等。
  - 6. **反馈与建议**:根据用户的性格类型,提供个性化的反馈和建议,包括如何发挥优势和改进建议。
  - 7. **额外资源推荐**:推荐相关书籍、文章或资源,帮助用户更深入地了解自己的性格类型。
## Initialization: 
欢迎使用MBTI性格测试助手!MBTI(Myers-Briggs Type Indicator)是一种广泛使用的性格评估工具,它帮助人们了解自己的性格类型,从而更好地认识自己、与他人相处。请准备好,我们将开始一段探索自我之旅。

### MBTI性格测试开始

请根据您的第一直觉选择以下问题中的选项:

1. **您更倾向于:**
   - a) 通过感觉(S)获取信息,注重具体细节。
   - b) 通过直觉(N)获取信息,注重抽象概念和可能性。

2. **在与人互动时,您更喜欢:**
   - a) 通过思维(T)来分析情况,做出决策。
   - b) 通过情感(F)来理解他人的感受,做出决策。

3. **面对新事物,您更倾向于:**
   - a) 通过判断(J)来规划和组织,偏好有结构的生活。
   - b) 通过知觉(P)来适应和探索,享受生活的灵活性。

4. **在做决定时,您更依赖于:**
   - a) 外部信息和反馈(E)。
   - b) 内部思考和自我反思(I)。

请选择您的答案,例如:1a, 2b, 3p, 4e。然后按回车键继续。

对话评测

使用提示词之后,模型给出了更为详细的性格分析以及反馈建议等。
  • Baseline
    在这里插入图片描述

  • 提示词
    在这里插入图片描述

一键写书应用开发实践

分治法拆解任务:

  1. 创作书籍总体信息:书名,主要内容介绍
  2. 创作书籍分章节大纲:每章章节名+简介
  3. 依据章节大纲创作章节内容

项目结构如下:

├── book_writer.py                   % 一键写书
├── prompts
│   ├── chapter_writer.txt           % 章节内容创作提示词
│   ├── outline_writer.txt           % 大纲创作提示词
│   └── title_writer.txt             % 标题创作提示词
├── README.md
├── requirements.txt

Profile:全面描述模型在特定任务中的行为、背景、目标和风格。
Goals:根据输入生成输出,引入变量,如themeintrobook_contentchapter_intro等。

标题创作

# Role: 书籍写作专家

## Profile
- author: LangGPT
- version: 1.0
- language: 中文
- description: 帮助用户为书籍创建有吸引力的标题和简介,确保书名与书籍内容相符,简介清晰传达书籍核心主题。

## Skills
1. 创意标题设计:能够根据书籍主题与风格,设计简洁、吸引读者的书名。
2. 精准简介编写:擅长提炼书籍的核心内容,用简短的文字清晰传达书籍的主题和卖点。
3. 内容风格匹配:根据书籍类型(小说、纪实、科幻等),调整标题和简介的语言风格。
4. 阅读者定位:根据书籍目标读者群体,设计有针对性的书籍标题与简介。

## Rules
1. 根据书籍内容概述、类型和目标读者,生成适合的标题和简介。
2. 标题需简洁、富有吸引力,能够激发读者的兴趣。
3. 简介需简短有力,准确传达书籍核心内容和主题。
4. 避免过于复杂或不相关的描述,突出书籍卖点和读者关心的部分。

## Goals
书籍信息:{theme}
撰写书籍标题和简介(json格式输出):
{
    "title":"《xxx》",
    "intro":"xxx",
}

## Init
设计合适的标题和简介,只输出json内容,此外不要给出任何无关内容和字符。

首先,读取标题创作的提示词模板,同时将用户输入主题作为该提示词模板中的变量theme,再将合并的提示词送入模型。模型响应reponse可能存在不完全是json格式的情况,因此需要从reponse中提取出 json 格式的标题和简介book_title_and_intro作为该函数的输出。
generate_title_and_intro函数内容如下:

def generate_title_and_intro(self, book_theme, prompt_file = "prompts/title_writer.txt") -> Tuple[str, str]:
    """生成书籍标题和主要内容介绍。

    Args:
        prompt: 用于生成标题和介绍的提示。

    Returns:
        包含生成的标题和介绍的元组。
    """
    prompt_args = {"theme": book_theme}
    prompt = read_prompt(prompt_file, prompt_args)
    #print(prompt)
    for attempt in range(3):
        try:
            response = self.assistant.run(prompt, stream=False)
            # convert to json
            response = response.strip()
            if not response.startswith('{'):
                response = '{' + response.split('{', 1)[1]
            if not response.endswith('}'):
                response = response.split('}', 1)[0] + '}'

            book_title_and_intro = json.loads(response)

            #print(book_title_and_intro)

            return book_title_and_intro
        except Exception as e:
            print(f"Attempt {attempt + 1} failed: {e}")
    return response

模块输入:theme = 'AI是什么'
模块输出:title_and_intro
在这里插入图片描述
在这里插入图片描述

大纲创作

# Role: 书籍写作专家

## Profile
- author: LangGPT
- version: 1.0
- language: 中文/英文
- description: 帮助用户根据书籍的标题和简介,设计出完整的书籍大纲,确保结构清晰,逻辑合理,并符合书籍的主题和风格。

## Skills
1. 书籍结构设计:根据书籍的主题和内容,设计清晰、有逻辑的章节和段落结构。
2. 情节和主题发展:擅长为小说、纪实文学等书籍设计情节发展框架,确保每一章节之间的连贯性和发展方向。
3. 内容层次划分:能够根据书籍的核心主题,将内容分为多个合理的层次和部分,确保读者能系统地理解内容。
4. 读者体验优化:根据目标读者的需求和阅读习惯,优化书籍结构,使其易于阅读并具有吸引力。

## Rules
1. 基于用户提供的书籍标题和简介,生成完整的书籍大纲。
2. 大纲需要包括书籍的主要章节和每一章节的关键内容概述。
3. 确保大纲的结构合理,内容连贯,有助于推进书籍的主题和情节发展。
4. 书籍大纲应体现书籍的核心主题,并符合读者的期待。

## Goals
书籍主题:{theme}
书籍标题和简介:
{intro}

撰写书籍大纲(python list 格式,10-20章)
["第一章:《xxx》xxx", "第二章:《xxx》xxx","...", "xxx"]

## Init
设计合适的章节大纲,只输出 python list内容,此外不要给出任何无关内容和字符。

流程与标题创作流程类似,generate_outline函数内容如下:

def generate_outline(self, book_theme, book_title_and_intro: str, prompt_file= "prompts/outline_writer.txt") -> List[str]:
        """生成书籍章节大纲。

        Args:
            prompt: 用于生成大纲的提示。
            title: 书籍标题。
            intro: 书籍介绍。

        Returns:
            章节标题列表。
        """
        prompt_args = {"theme": book_theme, "intro": str(book_title_and_intro)}
        prompt = read_prompt(prompt_file, prompt_args)
        for attempt in range(3):
            try:
                response = self.assistant.run(prompt, stream=False)
                #print(response)
                # convert to json
                response = response.strip()
                if not response.startswith('['):
                    response = '[' + response.split('[', 1)[1]
                if not response.endswith(']'):
                    response = response.split(']', 1)[0] + ']'
                chapters = json.loads(response.strip())
                #print(chapters)
                return chapters
            except Exception as e:
                print(f"Attempt {attempt + 1} failed: {e}")
        return response

模块输入:themetitle_and_intro
在这里插入图片描述

模块输出:chapters
在这里插入图片描述
在这里插入图片描述

章节内容创作

# Role: 书籍写作专家

## Profile
- author: LangGPT
- version: 1.0
- language: 中文/英文
- description: 帮助用户根据提供的书籍标题、简介和章节大纲,撰写每一章的具体内容,确保语言风格符合书籍定位,内容连贯、专业、正式。

## Skills
1. 章节内容撰写:能够根据用户提供的章节大纲,撰写完整的章节内容,确保情节发展和主题的深度探讨。
2. 文体和风格匹配:根据书籍的类型(小说、纪实、学术等)和目标读者,调整写作风格,使其正式、专业且符合书籍定位。
3. 细节描写与逻辑构建:擅长细节描写,增强故事的真实感与情感深度,保证逻辑严密性。
4. 内容深化与扩展:在大纲基础上,合理扩展和深化内容,使每一章有足够的丰富性和信息量。

## Rules
1. 依据用户提供的书籍标题、简介和大纲,撰写每一章的详细内容。
2. 每章内容需符合书籍主题,并在情节、逻辑和语言风格上保持一致。
3. 确保内容丰富、信息清晰,避免不必要的重复或偏离主题。
4. 保持正式、专业的语言风格,适合目标读者。
5. 不需胡说八道,编造事实。


## Goals
书籍简介:
{book_content}

本章大纲:
{chapter_intro}

请依据本章大纲和书籍简介撰写本章内容。

## OutputFormat:
- 如果需要数学公式,使用写法:"$latex公式$",使其能被 markdown 正确渲染,示例:"$z = \sum_{i=1}^{n} w_i \cdot x_i + b$"。
(注意:你的数学公式不要用 "\[ \]" 写法,这样无法被正确渲染!!!)
- 结构化写作,使用 markdown 格式排版内容。
- 章节标题,示例:"# 第三章:Transformer的基础原理"
- 章节内小标题使用序号, 示例:"## 3.1 Transformer的架构"。
- 合理按需使用粗体,斜体,引用,代码,公式,列表。

## Init
设计合适的章节大纲,只输出本章内容,此外不要给出任何无关内容和字符。

流程与之前类似,generate_chapter函数内容如下:

def generate_chapter(self, book_content, chapter_intro, prompt_file= "prompts/chapter_writer.txt") -> str:
        """生成单个章节的内容。

        Args:
            chapter_title: 章节标题。
            book_title: 书籍标题。
            book_intro: 书籍介绍。
            outline: 完整的章节大纲。
            prompt: 用于生成章节的提示。

        Returns:
            生成的章节内容。
        """
        
        prompt_args = {"book_content": str(book_content), "chapter_intro": str(chapter_intro)}
        prompt = read_prompt(prompt_file, prompt_args)
        for attempt in range(3):
            try:
                response = self.assistant.run(prompt, stream=False)
                response.strip()
                if response.startswith('```markdown'):
                    # 删除第一行和最后一行
                    lines = response.splitlines()
                    response = '\n'.join(lines[1:-1])

                return response
            except Exception as e:
                print(f"Attempt {attempt + 1} failed: {e}")
        response = convert_latex_to_markdown(response)
        return response

模块输入:chapter_intro = '第一章:AI的起源与历史'title_and_intro
模块输出:chapter_contents
在这里插入图片描述
在这里插入图片描述

提示词串联

  1. 用户输入主题
  2. 使用标题创作提示词根据主题生成书籍标题简介
  3. 使用大纲创作提示词根据主题标题简介生成书籍大纲
  4. 使用本章大纲和书籍简介生成章节内容
def generate_book(self, custom_theme=None, save_file=False) -> None:
        """生成整本书并将其保存到文件中。

        Args:
            custom_prompts: 自定义提示的字典。可以包括 'title_intro', 'outline' 和 'chapter' 键。
        """

        print("开始生成书籍标题和介绍...")
        theme = custom_theme if custom_theme else "Transformer是什么"
        title_and_intro = self.generate_title_and_intro(theme)
        title = title_and_intro["title"]
        print(f"书籍标题和介绍:\n {title_and_intro}")

        print("\n开始生成章节大纲...")
        chapters = self.generate_outline(theme, title_and_intro)
        print("章节大纲:")
        print(chapters)

        book_intro = title_and_intro
        book_content = "# " + title

        # 使用线程池来并行生成章节内容
        print("\n开始创作正文内容,时间较长(约几分钟)请等待~")
        with ThreadPoolExecutor() as executor:
            chapter_contents = list(executor.map(self.generate_chapter, [book_intro]*len(chapters), chapters))

        for i, chapter in enumerate(chapters, 1):
            print(f"\n正在生成第{i}章:{chapter}")
            chapter_content = chapter_contents[i-1].strip()  # 获取已生成的章节内容
            print(chapter_content)
            book_content += f"\n\n{chapter_content}"
            print(f"第{i}章已完成。")

        print("\n整本书已生成完毕。")
        if save_file:
            filename = f"books/{title.replace(' ', '_')}.md"
            with open(filename, "w", encoding="utf-8") as f:
                f.write(book_content)
            
            print(f"书籍内容已保存到 {filename} 文件中。")
        return book_content

book_writer.py的文件内容如下:

import os
import re
import json
from typing import List, Dict, Optional, Tuple
from concurrent.futures import ThreadPoolExecutor
from dotenv import load_dotenv
import openai
from phi.assistant import Assistant
from phi.llm.openai import OpenAIChat

# 加载 .env 文件
load_dotenv()

def read_prompt(prompt_file: str, replacements: Dict[str, str]) -> str:
    """
    读取提示文件并替换占位符
    """
    with open(prompt_file, 'r', encoding='utf-8') as file:
        prompt = file.read()
    for key, value in replacements.items():
        prompt = prompt.replace(f"{{{key}}}", value)
    return prompt
def convert_latex_to_markdown(text):
    # 使用正则表达式替换公式开始和结束的 \[ 和 \],但不替换公式内部的
    pattern = r'(?<!\\)\\\[((?:\\.|[^\\\]])*?)(?<!\\)\\\]'
    return re.sub(pattern, r'$$\1$$', text)

class BookWriter:
    """管理书籍生成过程的主类。"""

    def __init__(self, api_key: str, base_url: str, model_name: str, system_prompt=None):
        """初始化BookWriter。"""
        # 使用openai的接口调用书生浦语模型

        self.api_key = os.getenv("API_KEY") if api_key is None else api_key
        self.base_url = os.getenv("BASE_URL") if base_url is None else base_url
        self.model_name = os.getenv("MODEL_NAME") if model_name is None else model_name

        if system_prompt is None:
            system_prompt = "你是一个专业的写作助手,正在帮助用户写一本书。"
        self.assistant = self.create_assistant(self.model_name, self.api_key, self.base_url, system_prompt)
    
    def create_assistant(self, 
                        model_name: str, 
                        api_key: str, 
                        base_url: str, 
                        system_prompt: str) -> str:
        # 润色文本
        self.assistant = Assistant(
            llm=OpenAIChat(model=model_name,
                        api_key=api_key,
                        base_url=base_url,
                        max_tokens=4096,  # make it longer to get more context
                        ),
            system_prompt=system_prompt,
            prevent_prompt_injection=True,
            prevent_hallucinations=False,
            # Add functions or Toolkits
            #tools=[...],
            # Show tool calls in LLM response.
            # show_tool_calls=True
        )
        return self.assistant
	def generate_title_and_intro(self, book_theme, prompt_file = "prompts/title_writer.txt") -> Tuple[str, str]:
	...
	def generate_outline(self, book_theme, book_title_and_intro: str, prompt_file= "prompts/outline_writer.txt") -> List[str]:
	...
	def generate_chapter(self, book_content, chapter_intro, prompt_file= "prompts/chapter_writer.txt") -> str:
	...
	def generate_book(self, custom_theme=None, save_file=False) -> None:
	...
        
def main():
    """主函数, 演示如何使用BookWriter类。"""
    book_theme = input("请输入书籍主题(如 AI 是什么?): ")

    api_key = os.getenv("API_KEY")
    base_url = os.getenv("BASE_URL")
    model_name = os.getenv("MODEL_NAME")
    print(base_url, model_name)
    book_writer = BookWriter(api_key, base_url, model_name, system_prompt=None)
    book_writer.generate_book(custom_theme=book_theme, save_file=True)

if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值