LLM 开发者的内功:Python Dict、JS 变量提升与 Prompt 设计的三重奏

11 阅读7分钟

LLM 开发者的内功:Python Dict、JS 变量提升与 Prompt 设计的三重奏

一次笔记整理引发的跨语言思考

最近在学习大模型应用开发时,我整理了一份混杂着Python、JavaScript和Prompt工程技巧的笔记。回头看发现,这些看似零散的知识点之间,其实藏着编程语言设计中一些相通的核心思想。本文尝试把它们串联起来,希望能给你带来一些启发。

一、Prompt 工程的核心原则

1.1 清晰、具体的指令

与LLM交互时,撰写清晰、具体的指令是最基本的原则。模糊的提问容易让模型产生偏离主题或错误的回答。不要把“简洁”和“模糊”混为一谈——很多时候,更长的提示词能为模型提供更完整的说明与背景信息,输出反而更精准。

python

# 示例:明确要求以JSON格式输出
prompt = f"""
请列出四大名著,并编著对应的作者与书籍类型。
使用JSON格式呈现,需包含以下字段:book_id、title、author、desc、genre
"""

1.2 引导模型逐步推理

复杂任务可以拆解成多个步骤,让模型一步一步完成。这既能降低错误率,也便于调试。

python

text = "在一座风光宜人的小村庄里,姐弟俩杰克和吉尔动身前往山顶的水井取水……"
prompt = f"""
执行以下操作:
1. 将文本概括为一句话
2. 把这句摘要翻译成法语
3. 列出法语摘要中出现的所有人名
4. 输出JSON对象,包含字段:french_summary、num_names
文本:```{text}```
"""

1.3 分步骤

#python 特别擅长字符串操作
text = f"""
泡一杯茶其实很简单!首先把水烧开。烧水的同时,拿出茶杯,放入茶包。水烧开后,将热水冲入杯中浸泡茶包。静置片刻让茶香析出。几分钟后,根据从个人口味,还可以加入糖或牛奶。这样一杯美味的茶饮就泡好了。
"""
# 分步骤
prompt = f"""
你将收到由三引号包裹的文本若文本中包含一系列操作指令,
请按照下述格式重新整理这些指令。
步骤 一 ...
步骤 二 ...
...
步骤N ...
如果文本中没有一系列操作指引,直接输出**"没有提供步骤。"**
\"\"\"{text}\"\"\"
"""
prompt
print(get_completion(prompt))

1.4 提供示例(Few-Shot)

LLM有随机性,通过少量示例可以规范它的输出风格。

python

prompt = f"""
你的任务是保持统一的行文风格作答。
提问:请讲讲何为耐心。
回答:能凿出幽深峡谷的江河,源自涓涓细流;恢弘壮阔的交响乐,起于单个音符……
请问:请讲讲何为韧性。
"""

1.5 处理无步骤指令的情况

text_2 = f"""
今日阳光明媚,鸟儿欢唱。这样的好天气很适合去公园散步。
花儿竞相绽放,树木在微风中轻轻摇曳。
人们纷纷出门,享受这宜人的天气。
有人野餐,有人嬉戏,还有人悠闲地躺在草地上休憩。
这是亲近户外、领略自然之美的绝佳时刻。
"""
prompt = f"""
你将收到由三引号包裹的文本。若内容包含一系列操作指令,请按以下格式重新整理:
第 1 步 - …
第 2 步 - …
……
第 N 步 - …
如果文本中没有相关操作指令,直接输出:未提供步骤。
\"\"\"{text_2}\"\"\"
"""
print(get_completion(prompt))

当要求模型整理操作步骤时,应明确指示:若文本中没有步骤,则输出预设的兜底语句(如“未提供步骤”),避免模型瞎编。

二、调用LLM API的最佳实践

python

from openai import OpenAI

client = OpenAI(
    api_key="your-api-key",
    base_url="https://api.deepseek.com/v1"
)

def get_completion(prompt, model='deepseek-chat'):
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        temperature=0.5,   # 0~2,0最严谨,2最随机
        max_tokens=1024    # 控制输入+输出的总token数
    )
    return response.choices[0].message.content
  • temperature:控制随机性。0表示确定性输出,适合需要严谨答案的场景;较高的值让模型更有“创意”。
  • max_tokens:限制回复长度,也间接控制成本。

三、Python Dict 与 Set:哈希表的应用

3.1 Dict(字典)

字典是一种键值对数据结构,底层基于哈希表(Hash Table) 实现。

  • 查找和插入速度极快,O(1)时间复杂度,不会因数据量增大而显著变慢。
  • 代价是内存占用高(以空间换时间)。
  • 作为对比,List查找需要遍历,O(n);但List内存更紧凑。

哈希表原理

  1. 对key进行哈希函数计算,得到一个整数索引。
  2. 索引指向存储位置,该位置存放value。
  3. 再次查询相同key时,直接通过哈希找到位置取出value。

key必须是可哈希(hashable)的,即不可变类型:字符串、数字、元组等。列表(list)不能作为key,因为它是可变的——若key可变,每次哈希的结果可能不同,字典就无法正确定位数据。

python

d = {"name": "张三", "age": 18}   # ✅
# d = {[1,2]: "list"}             # ❌ TypeError: unhashable type

3.2 Set(集合)

Set与Dict原理一致,只是只存key,不存value。因此Set中的元素也是唯一的,且必须是可哈希类型。

python

s = {1, 2, 3}    # 集合
# s = {[1,2]}    # ❌ 同样不可哈希

四、再谈不可变对象(Immutable)

Python中,str、int、tuple是不可变对象;list、dict、set是可变对象。

不可变对象的特点是:调用它自身的方法不会改变原对象,而是返回一个新对象。

python

a = 'abc'
b = a.replace('a', 'A')  # replace返回新字符串
print(a)  # 'abc',原对象不变
print(b)  # 'Abc'

可变对象(如list)的方法会直接修改原对象。这种区别直接影响我们如何设计数据结构和调试程序。

五、JavaScript中的变量提升与函数优先

5.1 变量提升(Hoisting)

在JS中,变量和函数的声明会被提升到当前作用域的顶部。但函数的提升优先级高于普通变量

javascript

// 示例1.js
showName();            // 输出 1
function showName(){
    console.log(1);
}
var showName = function(){
    console.log(2);
}

解释:function showName的函数声明被整体提升到顶部,而var showName只有声明提升(赋值留在原地)。执行showName()时,函数声明生效,输出1;后续执行赋值语句将变量覆盖为另一个函数,但此时代码已执行完毕。

5.2 重复定义的函数,后者覆盖前者

javascript

// 示例2.js
function showName(){
    console.log('极客时间');
}
showName()            // 输出 '极客邦'
function showName(){
    console.log('极客邦');
}
showName()            // 输出 '极客邦'

由于函数声明提升,第二个函数定义会覆盖第一个,因此两次调用都输出“极客邦”。

六、知识点之间的内在联系

  1. 哈希表的“唯一性”要求 → Python dict/set 的 key 不可变 → JS中对象属性名实际上是字符串(不可变)→ 底层都依赖稳定的哈希。
  2. Prompt的清晰指令 → 降低LLM随机性 → 对应temperature=0 → 确定性编程。
  3. 引导模型逐步推理 → 类似代码中的函数拆分,每个步骤职责单一,可组合。
  4. 变量提升与函数优先 → 提醒我们即使在高阶语言中,声明的顺序和执行时机仍然重要。同样,给LLM的示例顺序也会影响few-shot效果。

七、对LLM幻觉的一点思考

如果问了一个不存在的品牌例如“博依喜多多饮料”,模型则会给出一本正经的多可能性分析。这提醒我们:LLM会生成看似合理但实际不存在的信息。应对方法包括:

  • 要求模型引用可信来源
  • 在prompt中明确“如果不确定请直接说不知道”
  • 使用检索增强生成(RAG)

结语

编程语言的底层原理(哈希表、不可变性、变量提升)与LLM的Prompt工程,表面上看风马牛不相及,但都围绕着同一个核心:如何用确定的规则应对不确定性。dict用哈希将任意键映射到固定位置;Prompt则用清晰的指令和示例,将人类的模糊意图映射到模型的稳定输出。

希望这篇杂糅的笔记能帮助你打通不同技术领域的“任督二脉”。如果你也有类似的跨界思考,欢迎在评论区交流。