关于大语言模型使用技巧与API工具使用的个人笔记

提示工程

为什么要了解提示工程

同样的提问意图,在不同的提问策略下可以得到有显著差异的结果,有技巧地提问更能期待大模型得到更高质量的回答。所谓的高质量回答体现在:

  1. 挖掘出模型的潜在知识和能力

  2. 使模型更准确地理解输入的问题或任务,并提供相关回答

  3. 改进模型的生成输出,提高可读性、连贯性和准确性

提示工程的指导原则

简单总结一些影响大模型回答质量的重要因素/技巧(其中部分技巧可能会随着大模型迭代升级而变得没那么重要,但从思维方法论的角度来说也值得践行)

  • 提问具体明确不含糊

  • 举例引导期望的答案

3R

  • Role:角色设定和目的,确定大模型以什么样的身份完成任务。如企查查知彼阿尔法定位商查大模型,可查商业相关信息(企业、供应商相关工商、招聘、专利、舆情等信息)

  • Result:期望的结果。希望大模型输出什么样的结果,结果包括什么内容、有哪些特点或约束。可参考OKR(职场目标与关键成果)的SMART要求:

    • Specific,清晰具体的语言为对话定义明确的焦点,确保大模型理解当前主题和任务

      反例你对xxx报告的看法
      正例xxx报告的结论是否被xxx特点的人广泛接受有哪些赞同或反对的声音
      
      反例:简单易懂
      正例:用短语,不用专业术语,xx句/词以内
      
    • Measurable,提供可衡量的约束条件,如数字、客观标准

      反例:对于xxx, 要有权威论证
      正例:对于xxx,要有xxx行业/研究所的专家的观点
      
    • Relevant,相关联的,对结果的描述要与角色设定、背景目的保持一致,体现相关性。

  • Recipe,思考如何才能拿到预期的结果,并给出方法和指导。对于复杂的、独特的任务,可以给出示例,帮助大模型进行任务拆解,通过思维链的方法进行问题拆解(大问题拆为小问题),以逻辑清晰的方式组织问题或步骤,引导大模型沿着特定的思考路径以更系统、更连贯的方式回答问题。

    当然,大模型原有知识可能不足以提供复杂任务所需要的数据支撑,在数据/知识源不充足的情况下, 即便采用思维链的方法大模型也无法得出最终结果,但至少可以在问题拆解后给出更具体的问题解决思路/更丰富的逻辑框架。

    示例1:

    问题:深圳有多少渣男
    

问题:深圳有多少渣男
思路:这是一道市场规模估算题,目的是考察逻辑能力、分析能力、计算能力。该问题没有标准答案但有标准套路。
步骤:1. 界定问题:明确问题范围和假设,如指定的地域指哪个行政区,目标对象指哪些类型
     2. 分解问题:将问题分解为若干子问题或模块,例如按照不同地区、不同密度和比例划分
     3. 估算数据:对每个子问题或模块进行合理假设和估算,如利用已知数据、常识判断、类比推理等方法得出每个模块的数量或比例
     4. 汇总结果:将所有子问题或模块的结果相加或相乘,得出最终答案,并检查是否合理和一致
     5. 总结思路:简要回顾整个解题过程,并指出可能存在的不确定性和改进空间。

问答示例

询问旅游/游玩地点

询问美食相关

大模型开放平台

国内大模型列表:

国外大模型列表:

以下示例均基于Python

星火大模型

官方提供了简单的demo脚本,可自行稍加改造封装成一个组件。

输入: 你是一个专业导游,对惠州罗浮山非常熟悉,请给出罗浮山3日游攻略,大于500字小于1000字

星火大模型V2.0

可以看到,星火大模型V2在回答上述问题时出现了事实错误,其介绍的“罗浮宫”并不存在。

智谱AI

pip install zhipuai

用户输入:

如何学习Spark,请给出学习计划

GLM4:

============================== 1 passed in 22.79s ==============================
PASSED                               [100%]ChatResponse(code=1, message=学习Spark涉及多个阶段,以下是一个详细的学习计划,旨在帮助您从基础到高级逐步掌握Spark。

### 阶段一:基础知识准备
1. **编程语言基础**(1-2周)
   - 学习Scala和Java基础,特别是Scala的特质(trait)、函数式编程、泛型等。
   - 对于Java,关注多线程、网络编程(Netty)、远程过程调用(RPC)、类加载器(ClassLoader)等。

2. **大数据基础**(1周)
   - 了解Hadoop生态系统,特别是HDFS和MapReduce的工作原理。
   - 学习数据存储和数据处理的基本概念。

### 阶段二:Spark基础入门
1. **Spark框架理解**(1周)
   - 理解Spark是什么,以及它的应用场景,如批处理、流计算、图计算等。
   - 了解Spark与Hadoop的区别及Spark的优势。

2. **API使用**(2周)
   - 学习RDD(弹性分布式数据集)的基础操作,包括transformation和action。
   - 掌握SparkSession的创建及使用,学习DataFrame和Dataset API。

3. **运行模式**(1周)
   - 熟悉Spark的本地运行模式,Standalone集群模式,以及Spark on Yarn的部署和运行。

### 阶段三:深入理解Spark Core
1. **任务调度与执行**(2周)
   - 学习Spark的任务提交过程、任务调度和执行原理。
   - 理解宽依赖和窄依赖,以及lineage机制。

2. **性能调优**(2周)
   - 学习Shuffle操作及其优化。
   - 掌握Spark中的缓存机制,理解何时以及如何使用缓存。

### 阶段四:高级特性与优化
1. **Spark SQL**(2周)
   - 学习Spark SQL的使用,包括Hive兼容性、DataFrame和Dataset的转换。
   - 探索Spark SQL的优化策略,如查询优化、执行计划等。

2. **Spark Streaming**(2周)
   - 理解Spark Streaming的基本概念和架构。
   - 学习如何构建实时数据处理应用,包括窗口操作、状态管理。

3. **其他模块**(1-2周)
   - 学习图计算(GraphX)和机器学习库(MLlib)的基础。
   - 了解Spark的扩展库,如Structured Streaming和PySpark的新特性。

### 阶段五:实战与源码阅读
1. **实战项目**(3-4周)
   - 完成一个或多个Spark项目,实践之前学习的理论知识。

2. **源码阅读**(4周以上)
   - 选择Spark的部分模块进行源码阅读,理解其内部实现机制。

### 阶段六:持续学习与社区参与
- 跟进Spark的最新版本更新和社区动态。
- 参与社区讨论,尝试解决GitHub上的问题。
- 持续学习,实践是检验真理的唯一标准。

Moonshot AI

参考Moonshot AI - 开放平台,API调用非常简单,支持非流式请求和流式请求。

可以简单复用openai库.

pip install openai
from openai import OpenAI
from prompts.prompt_template import GastRole
MOONSHOT_API_KEY = "xxxxxxxxxxx"
client = OpenAI(
    api_key=MOONSHOT_API_KEY,
    base_url="https://api.moonshot.cn/v1",
)
model="moonshot-v1-8k"
question = "从外地来深圳,不想吃辣椒"
prompt_messages = GastRole.prompt_messages
prompt_messages.extend([
        {"role": "user", "content":question}])
completion = client.chat.completions.create(
  model=model,
  messages=prompt_messages,
  temperature=0.3,
)
message  = completion.choices[0].message
print(f"Question: {question}")
print(f"Answer: {message.content}")

示例:让大模型扮演一个职业规划顾问

示例:让大模型扮演一个美食家

零一万物大模型

除文字问答外,支持视觉问答。

示例:NL2SQL

from openai import OpenAI

API_BASE = "https://api.lingyiwanwu.com/v1"
API_KEY = "xxxxxxxxxx"

client = OpenAI(
    api_key=API_KEY,
    base_url=API_BASE
)
question = "你的自然语言转SQL能力如何?我来考你一个问题,在PostgreSQL数据库中,我有一个企业数据表company,希望你帮我查出注册资本(reg_cap)大于5000万人民币, 行业(industry)为互联网,通信地址在深圳西丽地铁站方圆500米的企业。"
completion = client.chat.completions.create(
    model="yi-34b-chat-0205",
    messages=[{"role": "user", "content": question}]
)
print(completion.choices[0].message.content)

下图为问答结果,可以看到生成的SQL语句在语法上没有问题,实际应用时可通过提示指明字段的说明让SQL更加精确。

示例:视觉问答

curl --location 'https://api.lingyiwanwu.com/v1/chat/completions' \
--header 'Authorization: Bearer $API_KEY' \
--header 'Content-Type: application/json' \
--data '{
    "model": "yi-vl-plus",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "xxxxxxxx"
                    }
                },
                {
                    "type": "text",
                    "text": " 请总结图片内容,针对性地给出建议,需要考虑你给建议的对象是谁,他需要什么样的建议。"
                }
            ]
        }
    ],
    "stream": false,
    "max_tokens": 1024
}'

curl --location 'https://api.lingyiwanwu.com/v1/chat/completions' \
--header 'Authorization: Bearer $API_KEY' \
--header 'Content-Type: application/json' \
--data '{
    "model": "yi-vl-plus",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "xxxxx"
                    }
                },
                {
                    "type": "text",
                    "text": " 请总结图片内容,揣摩图片内容撰写者的身份,动机"
                }
            ]
        }
    ],
    "stream": true,
    "max_tokens": 1024
}'

场景

利用大模型的基础能力,完成一些基础NLP任务

问题分类/意图识别

prompt:

PROMPT = {
    "ticket_question": {
        "name": "票务问答",
        "description": "查询或预定车票、船票、机票等,关于票务类交通工具班次类问题。"
    },
    "food_question":{
        "name": "美食问答",
        "description": "查询美食,食品"
    },
    "travel_question":{
        "name": "旅游问答",
        "description": "查询旅游景点、游玩地,包括热门景点和冷门景点,或者具有特殊性的地方。"
    },
    "other_question":{
        "name": "其他问答",
        "description": "不明确的问题"
    }
}

关系抽取

PROMPT = [
    {
        "document": "郭靖和黄蓉是情侣,欧阳克追求过黄蓉,欧阳锋呢?",
        "entities": ["郭靖", "黄蓉", "欧阳克", "欧阳锋"],
        "relation": [("郭靖", "情侣", "黄蓉"),
                    ("黄蓉", "追求者", "欧阳克")
                     ]
    }
]
  • 基于零一万物的模型yi-34b-chat-0205

  • 基于月之暗面的模型Moonshot 8k

可以看到,当给出一些不合事实的文档,月之暗面的模型能够更好地鉴别反事实现象并给出解释。

通用流程

  • 数据收集

  • 数据清洗和预处理

  • 数据表示(可直接使用文字,也可进行嵌入表示,如将文本嵌入向量空间,除方便大规模分析之外,也可提高数据集安全性)

  • 应用(根据业务需求构造prompt支持下游任务,针对prompt还可引入指令优化)

相关文档

CoolCats
CoolCats
理学学士

我的研究兴趣是时空数据分析、知识图谱、自然语言处理与服务端开发