Skip to content

阶段 1:LLM 基础与 Prompt 工程

📖 本阶段目标

  • 深入理解大语言模型的工作原理和特性
  • 掌握 Prompt 工程的核心技术和设计模式
  • 学习 CoT(Chain of Thought)、ReAct 等高级提示技术
  • 实践常见的 LLM 应用场景

🧠 LLM 核心概念

1. 关键参数理解

Temperature(温度)

  • 范围:0.0 - 2.0
  • 作用:控制输出的随机性
  • 0.0:确定性输出,适合事实性任务
  • 0.7:平衡创造性和一致性(默认值)
  • 1.5+:高度创造性,适合创意写作
# 温度对比示例
response_creative = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "给我讲个故事"}],
    temperature=1.2  # 更有创意
)

response_factual = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "什么是量子计算?"}],
    temperature=0.1  # 更准确
)

Max Tokens(最大令牌数)

  • 控制生成文本的长度
  • 1 token ≈ 0.75 个英文单词,≈ 0.5 个中文字符
  • 需要同时考虑输入和输出的 token 限制

Top P(核采样)

  • 范围:0.0 - 1.0
  • 作用:只从累计概率为 P 的 token 中采样
  • 通常与 temperature 二选一使用

2. Token 计算与成本控制

import tiktoken

def count_tokens(text, model="gpt-4"):
    """计算文本的 token 数量"""
    encoding = tiktoken.encoding_for_model(model)
    return len(encoding.encode(text))

# 示例
text = "这是一段测试文本,用于计算 token 数量。"
tokens = count_tokens(text)
print(f"Token 数量: {tokens}")

# 成本估算(以 GPT-4 为例)
cost_per_1k_input = 0.03  # 美元
cost_per_1k_output = 0.06  # 美元
estimated_cost = (tokens / 1000) * cost_per_1k_input

📝 Prompt 工程核心技术

1. Prompt 基本结构

一个好的 Prompt 通常包含以下要素:

┌─────────────────────────────────┐
│  1. 角色定义(Role)             │
│     "你是一个专业的..."          │
├─────────────────────────────────┤
│  2. 任务描述(Task)             │
│     "请帮我..."                  │
├─────────────────────────────────┤
│  3. 上下文信息(Context)        │
│     "基于以下信息..."            │
├─────────────────────────────────┤
│  4. 输入数据(Input)            │
│     具体的数据内容                │
├─────────────────────────────────┤
│  5. 输出格式(Format)           │
│     "请以JSON格式输出..."        │
├─────────────────────────────────┤
│  6. 约束条件(Constraints)      │
│     "不要包含...", "必须..."     │
└─────────────────────────────────┘

示例

prompt = """
你是一个专业的数据分析师。

任务:分析以下用户评论,提取关键信息。

评论内容:
"{user_comment}"

请按以下JSON格式输出:
{{
  "sentiment": "positive/negative/neutral",
  "key_points": ["要点1", "要点2"],
  "concerns": ["问题1", "问题2"],
  "rating_estimate": 1-5
}}

约束:
- sentiment 必须是三选一
- key_points 最多3个
- 如果没有concerns则返回空数组
"""

2. Few-Shot Learning(少样本学习)

通过提供示例来引导模型输出:

prompt = """
请将以下句子分类为:问题、陈述、命令

示例:
输入:"今天天气怎么样?"
输出:问题

输入:"我喜欢吃苹果。"
输出:陈述

输入:"请打开窗户。"
输出:命令

现在请分类:
输入:"{user_input}"
输出:
"""

3. Chain of Thought (CoT) - 思维链

让模型展示推理过程,提高复杂任务的准确性:

prompt = """
问题:一个班级有60名学生,其中40%是女生,女生中有30%戴眼镜。
请问戴眼镜的女生有多少人?

请一步步思考:
1. 首先计算女生总数
2. 然后计算戴眼镜的女生数量
3. 给出最终答案

让我们开始:
"""

Zero-Shot CoT(零样本思维链):

prompt = """
{question}

让我们一步步思考这个问题。
"""

4. ReAct (Reasoning + Acting) 模式

结合推理和行动,适合需要工具调用的场景:

prompt = """
你可以使用以下工具:
- search(query): 搜索信息
- calculator(expression): 计算数学表达式
- get_weather(city): 获取天气信息

请按以下格式回答:
Thought: [你的思考过程]
Action: [要使用的工具]
Action Input: [工具的输入]
Observation: [工具的输出,由系统填充]
... (重复 Thought/Action/Observation)
Thought: 我现在知道最终答案了
Final Answer: [最终答案]

问题:北京明天的天气如何?如果下雨,建议穿什么衣服?

让我们开始:
Thought:
"""

5. 结构化输出

JSON 模式

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4-turbo-preview",
    messages=[
        {
            "role": "system",
            "content": "你是一个数据提取助手,总是以JSON格式输出。"
        },
        {
            "role": "user",
            "content": """
            提取以下文本中的实体:
            "苹果公司CEO蒂姆·库克于2023年访问了中国上海。"

            输出格式:
            {
              "organizations": [],
              "persons": [],
              "locations": [],
              "dates": []
            }
            """
        }
    ],
    response_format={"type": "json_object"}
)

🛠️ 实践项目

项目 1:智能问答系统

目标:构建一个能够回答用户问题的系统

# examples/stage1/qa_system.py
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def create_qa_prompt(question, context=""):
    """创建问答 Prompt"""
    if context:
        return f"""
        基于以下上下文回答问题:

        上下文:
        {context}

        问题:{question}

        如果上下文中没有相关信息,请明确说明。
        """
    else:
        return f"""
        请回答以下问题:{question}

        如果你不确定答案,请说"我不确定"而不是编造信息。
        """

def ask_question(question, context=""):
    """问答函数"""
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "你是一个准确、有帮助的助手。"},
            {"role": "user", "content": create_qa_prompt(question, context)}
        ],
        temperature=0.3
    )
    return response.choices[0].message.content

# 测试
if __name__ == "__main__":
    # 无上下文问答
    answer1 = ask_question("什么是量子计算?")
    print("答案1:", answer1)

    # 有上下文问答
    context = """
    量子计算是一种基于量子力学原理的计算方式。
    它使用量子比特(qubit)而不是传统的二进制比特。
    量子计算机在某些特定问题上可以比传统计算机快得多。
    """
    answer2 = ask_question("量子计算使用什么单位?", context)
    print("答案2:", answer2)

项目 2:数据结构化提取

目标:从非结构化文本中提取结构化信息

# examples/stage1/data_extraction.py
import json
from openai import OpenAI

client = OpenAI()

def extract_structured_data(text):
    """从文本中提取结构化数据"""
    prompt = f"""
    从以下文本中提取信息,并以JSON格式返回:

    文本:
    {text}

    请提取:
    - name: 人名
    - company: 公司名
    - position: 职位
    - email: 邮箱
    - phone: 电话
    - location: 地点

    如果某个字段没有信息,设置为 null。
    只返回JSON,不要其他说明。
    """

    response = client.chat.completions.create(
        model="gpt-4-turbo-preview",
        messages=[
            {"role": "system", "content": "你是一个数据提取专家。"},
            {"role": "user", "content": prompt}
        ],
        response_format={"type": "json_object"},
        temperature=0
    )

    return json.loads(response.choices[0].message.content)

# 测试
if __name__ == "__main__":
    text = """
    张三是ABC科技有限公司的高级工程师,
    他的邮箱是zhangsan@abc.com,
    办公地点在北京海淀区,联系电话是13800138000。
    """

    result = extract_structured_data(text)
    print(json.dumps(result, ensure_ascii=False, indent=2))

项目 3:文本摘要生成器

目标:对长文本进行智能摘要

# examples/stage1/text_summarizer.py
from openai import OpenAI

client = OpenAI()

def summarize_text(text, style="concise", max_length=100):
    """
    文本摘要

    Args:
        text: 原始文本
        style: 摘要风格 (concise/detailed/bullet_points)
        max_length: 最大字数
    """
    style_prompts = {
        "concise": "生成简洁的摘要",
        "detailed": "生成详细的摘要,保留关键细节",
        "bullet_points": "生成要点列表形式的摘要"
    }

    prompt = f"""
    请对以下文本{style_prompts[style]}(不超过{max_length}字):

    {text}

    摘要:
    """

    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "你是一个专业的文本摘要助手。"},
            {"role": "user", "content": prompt}
        ],
        temperature=0.5,
        max_tokens=500
    )

    return response.choices[0].message.content

# 测试
if __name__ == "__main__":
    long_text = """
    人工智能(AI)正在改变我们的世界。从医疗诊断到自动驾驶,
    从智能客服到内容创作,AI的应用无处不在。大语言模型的出现
    更是开启了AI应用的新纪元。这些模型能够理解和生成自然语言,
    使得人机交互变得更加自然和高效。然而,AI的发展也带来了
    一些挑战,包括数据隐私、算法偏见和就业影响等问题。
    我们需要在推动技术进步的同时,也要关注这些重要的社会议题。
    """

    # 不同风格的摘要
    summary1 = summarize_text(long_text, style="concise", max_length=50)
    print("简洁摘要:", summary1)

    summary2 = summarize_text(long_text, style="bullet_points")
    print("\n要点摘要:", summary2)

📊 提示工程最佳实践

✅ DO(应该做的)

  1. 明确具体:提供清晰、具体的指令
  2. 提供上下文:给出足够的背景信息
  3. 使用分隔符:用 """### 分隔不同部分
  4. 指定输出格式:明确期望的输出结构
  5. 迭代优化:根据结果不断调整 Prompt
  6. 添加示例:使用 Few-shot Learning
  7. 分步思考:使用 CoT 处理复杂问题

❌ DON'T(不应该做的)

  1. 模糊指令:避免含糊不清的要求
  2. 过度复杂:Prompt 太长反而降低效果
  3. 假设知识:不要假设模型知道你的私有信息
  4. 忽略测试:未经测试就用于生产
  5. 暴露敏感信息:不要在 Prompt 中包含密钥或私密数据

✅ 阶段完成检查清单

  • [ ] 理解 Temperature、Max Tokens、Top P 等参数的作用
  • [ ] 掌握 Prompt 的基本结构(角色、任务、格式等)
  • [ ] 能够使用 Few-Shot Learning 引导模型
  • [ ] 理解并实践 Chain of Thought (CoT) 技术
  • [ ] 了解 ReAct 模式的基本原理
  • [ ] 完成至少 2 个实践项目(问答/提取/摘要)
  • [ ] 能够设计结构化输出的 Prompt
  • [ ] 学会通过迭代优化 Prompt 效果

🎯 下一步

完成本阶段后,进入 阶段 2:工具调用与函数式 Agent,学习如何让 LLM 调用外部工具和 API。


💡 小贴士:Prompt 工程是一门艺术,也是一门科学。好的 Prompt 往往需要多次迭代。建议建立自己的 Prompt 模板库,积累常用模式。