推理基础设施 · Python2.5 嵌套结构:推理请求的"俄罗斯套娃"
02
列表 / 字典操作 · 5 / 6

2.5 嵌套结构:推理请求的"俄罗斯套娃"

💡 推理请求体几乎都是嵌套 dict + list:messages[].content、sampling_params、logprobs...

2.5 嵌套结构

核心就是 list 和 dict 互相套

req = {
    "model": "qwen2.5-7b",
    "messages": [
        {"role": "system", "content": "You are helpful"},
        {"role": "user", "content": "hi"},
    ],
    "sampling": {"temperature": 0.7, "top_p": 0.9},
}

访问套路:一层一层往里取

  • req["messages"] → list
  • req["messages"][0] → 第一个 dict
  • req["messages"][0]["role"]"system"
  • req["sampling"]["temperature"]0.7

安全访问

每一层都可能不存在:

req.get("sampling", {}).get("temperature", 0.7)

.get("sampling", {}):如果不存在,返回空 dict,下一层 .get 也不会报错。

示范

req = {
    "model": "qwen2.5-7b",
    "messages": [
        {"role": "system", "content": "You are helpful"},
        {"role": "user", "content": "hi"},
    ],
    "sampling": {"temperature": 0.7, "top_p": 0.9},
}

print(req["messages"][-1]["content"])              # hi
print(req.get("sampling", {}).get("temperature"))  # 0.7

✍️ 练习

给定上面 req,写代码做两件事:

  1. 数一下 messages 里有几条消息(提示:用 len
  2. 用一行表达式(不抛 KeyError)取出 sampling.top_k,不存在就用 50

把两个结果都 print 出来。

💡 思路提示

点开看提示
  1. len(req["messages"]) 数列表长度
  2. 链式 .getreq.get("sampling", {}).get("top_k", 50)
  3. 如果 sampling 字段可能不存在,第二个参数 {} 就让它返回空 dict

✅ 参考解法

写不出来再打开
req = {
    "model": "qwen2.5-7b",
    "messages": [
        {"role": "system", "content": "You are helpful"},
        {"role": "user", "content": "hi"},
    ],
    "sampling": {"temperature": 0.7, "top_p": 0.9},
}

print(len(req["messages"]))
print(req.get("sampling", {}).get("top_k", 50))

🔍 进阶思考

多层嵌套很深时,可以写个工具函数:

def dig(d, *keys, default=None):
    for k in keys:
        if isinstance(d, dict) and k in d:
            d = d[k]
        else:
            return default
    return d

print(dig(req, "sampling", "top_k", default=50))   # 50

避免重复写 .get 链。