上下文工程(Prompt Engineering)演讲材料

一、演讲大纲

1. 开场:什么是LLM?(5分钟)

2. 上下文工程基础(10分钟)

3. 核心技巧(20分钟)

4. 实战演示(15分钟)

5. 最佳实践与总结(10分钟)

二、演讲稿

开场

大家好!今天我要跟大家分享一个新兴但非常重要的技能——上下文工程,也叫Prompt Engineering。

首先问大家一个问题:当你写代码时,你会怎么做?你会写明确的函数、定义清晰的参数、使用严格的语法,对吗?

但现在,有一种新的"编程方式"正在改变这一切——你只需要用自然语言描述你想要什么,AI就能帮你完成。这就是大语言模型(LLM)带来的革命。

传统编程 vs LLM:

# 传统方式:需要写详细的逻辑
def calculate_average(numbers):
    if not numbers:
        return 0
    return sum(numbers) / len(numbers)

# LLM方式:用自然语言描述
"请帮我计算这个列表的平均值:[1, 2, 3, 4, 5]"

但这里有个问题——虽然LLM能理解自然语言,但怎么说直接决定了结果的质量。这就是上下文工程的核心。

第一部分:理解LLM

LLM是什么?

简单来说,LLM(Large Language Model,大语言模型)是一个训练在海量文本数据上的神经网络。它的工作原理可以简化理解为:

  1. 输入:你给它一段文字(Prompt)

  2. 处理:模型基于学到的模式,预测接下来最可能出现的文字

  3. 输出:生成连贯的回答

就像一个读过无数书籍的人,它能根据上下文推测接下来应该说什么。

关键特点:

第二部分:什么是上下文工程?

定义:

上下文工程是设计和优化给LLM的输入(Prompt),以获得最佳输出的技术和艺术。

可以把它理解为"用自然语言编程"——你需要:

对比示例:

差的Prompt:

写个排序函数

好的Prompt:

请用Python写一个快速排序函数,要求:
1. 函数名为 quick_sort
2. 接收一个整数列表作为参数
3. 返回排序后的列表
4. 包含详细注释说明算法步骤

看到区别了吗?好的Prompt明确、具体、有结构。

第三部分:核心技巧

技巧1:清晰明确的指令

**原则:**把LLM当作一个聪明但字面理解的助手。

示例:

# 模糊的指令
"帮我处理这个数据"

# 明确的指令
"请将以下CSV数据按照'销售额'列降序排序,并保留前10行:
name,sales,region
Alice,1000,East
Bob,1500,West
..."

代码示例:

# 差的Prompt
prompt = "写个API调用"

# 好的Prompt
prompt = """
请使用Python的requests库编写一个函数:
- 函数名:fetch_user_data
- 功能:从JSONPlaceholder API获取用户数据
- 参数:user_id (整数)
- 返回:用户信息的字典
- 错误处理:如果请求失败,返回None并打印错误信息
- URL格式:https://jsonplaceholder.typicode.com/users/{user_id}
"""

技巧2:Few-shot Learning(提供示例)

让LLM通过例子学习你想要的格式。

示例:

任务:将产品描述转换为JSON格式

示例1:
输入:iPhone 15 Pro,价格$999,颜色黑色
输出:{"name": "iPhone 15 Pro", "price": 999, "color": "black"}

示例2:
输入:MacBook Air,价格$1299,颜色银色
输出:{"name": "MacBook Air", "price": 1299, "color": "silver"}

现在处理:
输入:iPad Pro,价格$799,颜色白色

代码应用:

def create_few_shot_prompt(examples, new_input):
    prompt = "将自然语言转换为Python代码:\n\n"
    
    # 添加示例
    for ex in examples:
        prompt += f"需求:{ex['description']}\n"
        prompt += f"代码:\n{ex['code']}\n\n"
    
    # 添加新任务
    prompt += f"需求:{new_input}\n代码:\n"
    return prompt

examples = [
    {
        "description": "打印1到10的数字",
        "code": "for i in range(1, 11):\n    print(i)"
    },
    {
        "description": "计算列表的总和",
        "code": "numbers = [1, 2, 3, 4, 5]\ntotal = sum(numbers)\nprint(total)"
    }
]

prompt = create_few_shot_prompt(examples, "找出列表中的最大值")

技巧3:角色扮演(Role Prompting)

让LLM扮演特定角色,会影响回答的风格和深度。

# 基础版本
"解释什么是递归"

# 角色版本
"你是一位资深的计算机科学教授,正在给大一新生讲解递归。
请用通俗易懂的语言,配合具体例子,解释什么是递归。"

代码示例:

def create_role_prompt(role, task):
    return f"""
你是一位{role}。

{task}

请以专业的角度回答,并确保:
1. 内容准确可靠
2. 语言清晰易懂
3. 提供具体例子
"""

# 使用
prompt = create_role_prompt(
    role="有10年经验的Python后端工程师",
    task="解释Python中的装饰器是什么,如何使用,以及常见应用场景"
)

技巧4:思维链(Chain of Thought)

引导LLM逐步思考,特别适合复杂问题。

# 直接提问
"23 * 47 = ?"

# 思维链提问
"请计算 23 * 47,并展示你的计算步骤:
1. 先计算 23 * 40
2. 再计算 23 * 7
3. 将两个结果相加"

代码调试示例:

debugging_prompt = """
这段代码有bug,请按照以下步骤分析:

代码:
```python
def find_max(arr):
    max_val = 0
    for num in arr:
        if num > max_val:
            max_val = num
    return max_val

result = find_max([-5, -2, -10, -1])
print(result)  # 期望输出:-1,实际输出:0

请分析:

  1. 代码的预期行为是什么?

  2. 实际发生了什么?

  3. 问题出在哪一行?

  4. 为什么会出现这个问题?

  5. 如何修复? """

#### 技巧5:结构化输出

明确指定输出格式,方便程序处理。

```python
structured_prompt = """
请分析以下代码,并以JSON格式返回结果:

```python
def calculate(a, b):
    return a + b

返回格式: { "function_name": "函数名", "parameters": ["参数列表"], "return_type": "返回值类型", "complexity": "时间复杂度", "description": "功能描述" } """

---

### 第四部分:实战演示

#### 示例1:代码生成器

```python
class CodeGenerator:
    def generate_function(self, description, language="Python"):
        prompt = f"""
请用{language}编写一个函数,满足以下需求:

{description}

要求:
1. 包含完整的函数定义
2. 添加类型提示(如果语言支持)
3. 包含文档字符串说明功能
4. 添加输入验证
5. 提供使用示例

请只返回代码,不要有额外解释。
"""
        return prompt

# 使用
generator = CodeGenerator()
prompt = generator.generate_function(
    """
    功能:将RGB颜色值转换为十六进制颜色代码
    输入:三个整数(r, g, b),范围0-255
    输出:字符串,格式如"#FF5733"
    异常:如果输入超出范围,抛出ValueError
    """
)
print(prompt)

示例2:数据处理助手

class DataProcessor:
    def create_processing_prompt(self, data, task):
        return f"""
数据:
{data}

任务:{task}

请按以下步骤处理:
1. 理解数据结构
2. 执行指定任务
3. 返回处理后的结果
4. 如果有异常情况,说明原因

输出格式:纯JSON,不要有markdown标记
"""

# 使用示例
processor = DataProcessor()
data = """
[
    {"name": "Alice", "age": 25, "city": "Beijing"},
    {"name": "Bob", "age": 30, "city": "Shanghai"},
    {"name": "Carol", "age": 25, "city": "Beijing"}
]
"""

prompt = processor.create_processing_prompt(
    data,
    "统计每个城市的人数,并按人数降序排列"
)

示例3:智能调试助手

class DebugAssistant:
    def analyze_error(self, code, error_message, expected_behavior):
        return f"""
作为一个调试专家,请分析以下问题:

错误代码:
```python
{code}

错误信息: {error_message}

期望行为: {expected_behavior}

请提供:

  1. 问题诊断: 错误的根本原因

  2. 修复方案: 修改后的正确代码

  3. 预防建议: 如何避免类似错误

  4. 相关知识: 涉及的概念或最佳实践

格式化输出为Markdown。 """

使用

assistant = DebugAssistant() prompt = assistant.analyze_error( code=""" def divide_list(lst, n): return [lst[i:i+n] for i in range(0, len(lst), n)]

result = divide_list([1,2,3,4,5], 0) """, error_message="ZeroDivisionError: integer division or modulo by zero", expected_behavior="将列表分成指定大小的小块" )

---

### 第五部分:最佳实践

#### 1. 迭代优化

Prompt工程是迭代过程:

```python
# 版本1:太简单
prompt_v1 = "写个爬虫"

# 版本2:加入细节
prompt_v2 = "用Python写一个爬虫,爬取新闻网站的标题"

# 版本3:完整需求
prompt_v3 = """
用Python编写一个新闻爬虫:
- 使用requests和BeautifulSoup库
- 目标:爬取某新闻网站首页的所有文章标题和链接
- 需要错误处理(网络异常、解析失败等)
- 添加User-Agent避免被封
- 将结果保存为CSV文件
- 包含完整的注释
"""

2. 温度参数控制

不同任务需要不同的"创造性":

# 代码生成:需要精确,使用低温度
code_generation_params = {
    "temperature": 0.2,  # 更确定性的输出
    "prompt": "写一个二分查找函数"
}

# 创意写作:需要多样性,使用高温度
creative_writing_params = {
    "temperature": 0.8,  # 更有创造性
    "prompt": "写一个科幻故事的开头"
}

3. 提示词模板库

建立自己的模板库:

PROMPT_TEMPLATES = {
    "code_review": """
请审查以下代码:

```{language}
{code}

关注点:

  1. 代码质量和可读性

  2. 潜在的bug或边界情况

  3. 性能优化建议

  4. 安全问题

  5. 最佳实践遵循情况

请提供详细的评审意见。 """,

"api_documentation": """

为以下API接口编写文档:

{api_signature}

要求包含:

{code}

要求:

def use_template(template_name, **kwargs): template = PROMPT_TEMPLATES[template_name] return template.format(**kwargs)

#### 4. 链式调用

对于复杂任务,分步骤处理:

```python
class PromptChain:
    def __init__(self):
        self.steps = []
    
    def add_step(self, prompt_template):
        self.steps.append(prompt_template)
        return self
    
    def execute(self, initial_input):
        """
        模拟链式执行(实际需要调用LLM API)
        """
        current_input = initial_input
        for step in self.steps:
            prompt = step.format(input=current_input)
            # 这里应该调用LLM API
            # current_input = call_llm(prompt)
            print(f"Step prompt:\n{prompt}\n")
        return current_input

# 使用示例:代码生成 -> 优化 -> 添加测试
chain = PromptChain()
chain.add_step("""
步骤1:生成初始代码

需求:{input}

请生成Python代码实现。
""").add_step("""
步骤2:优化代码

原代码:
{input}

请优化代码的性能和可读性。
""").add_step("""
步骤3:添加单元测试

代码:
{input}

请添加完整的单元测试。
""")

chain.execute("实现一个LRU缓存")

三、关键要点总结

上下文工程的黄金法则

  1. 明确性原则:越具体越好

  2. 示例驱动:用例子说明期望

  3. 分步引导:复杂任务拆解

  4. 格式约束:指定输出结构

  5. 迭代优化:不断改进提示词

常见错误

❌ 假设模型"知道"你的意图
❌ 一次性提出过于复杂的要求
❌ 没有提供足够的上下文
❌ 忽略输出格式的指定
❌ 不验证和测试结果

工具推荐

四、实践练习

练习1:改进以下Prompt

原始:"写个函数处理字符串"

改进后:你来试试看!

练习2:构建Prompt模板

为"代码重构"任务设计一个可复用的Prompt模板。

练习3:链式任务

设计一个Prompt链,完成:需求分析 -> 设计 -> 编码 -> 测试

五、结语

上下文工程不仅仅是"如何跟AI聊天",它是一种新的编程范式。

记住:

感谢大家!欢迎提问。

附录:完整代码示例

"""
上下文工程实用工具包
"""

class PromptEngineer:
    """上下文工程工具类"""
    
    def __init__(self, model="gpt-4"):
        self.model = model
        self.conversation_history = []
    
    def create_system_prompt(self, role, rules=None):
        """创建系统提示"""
        prompt = f"你是{role}。\n"
        if rules:
            prompt += "\n请遵循以下规则:\n"
            for i, rule in enumerate(rules, 1):
                prompt += f"{i}. {rule}\n"
        return prompt
    
    def few_shot_prompt(self, task_description, examples, new_input):
        """Few-shot学习提示"""
        prompt = f"{task_description}\n\n"
        prompt += "示例:\n"
        for i, ex in enumerate(examples, 1):
            prompt += f"\n示例{i}:\n"
            prompt += f"输入:{ex['input']}\n"
            prompt += f"输出:{ex['output']}\n"
        prompt += f"\n现在请处理:\n输入:{new_input}\n输出:"
        return prompt
    
    def chain_of_thought(self, problem, steps):
        """思维链提示"""
        prompt = f"问题:{problem}\n\n"
        prompt += "请按以下步骤思考:\n"
        for i, step in enumerate(steps, 1):
            prompt += f"{i}. {step}\n"
        prompt += "\n请详细展示每一步的推理过程。"
        return prompt
    
    def structured_output(self, task, output_format):
        """结构化输出提示"""
        prompt = f"任务:{task}\n\n"
        prompt += "请按以下格式输出:\n"
        prompt += f"```json\n{output_format}\n```"
        return prompt

# 使用示例
if __name__ == "__main__":
    pe = PromptEngineer()
    
    # 示例1:Few-shot
    prompt1 = pe.few_shot_prompt(
        task_description="将自然语言转换为SQL查询",
        examples=[
            {
                "input": "查找所有年龄大于25岁的用户",
                "output": "SELECT * FROM users WHERE age > 25;"
            },
            {
                "input": "统计每个部门的员工数量",
                "output": "SELECT department, COUNT(*) FROM employees GROUP BY department;"
            }
        ],
        new_input="查找北京地区销售额最高的前10名销售员"
    )
    print(prompt1)
    print("\n" + "="*50 + "\n")
    
    # 示例2:思维链
    prompt2 = pe.chain_of_thought(
        problem="优化这个慢查询:SELECT * FROM orders WHERE YEAR(order_date) = 2024",
        steps=[
            "分析查询的性能问题",
            "识别导致性能差的原因",
            "提出优化方案",
            "重写优化后的查询"
        ]
    )
    print(prompt2)

演讲时间分配建议:

演讲技巧:

  1. 多用对比示例(好vs坏)

  2. 现场演示会更有说服力

  3. 鼓励听众互动提问

  4. 准备几个备用示例应对特定领域问题