Python 让DeepSeek返回JSON结构

作者:追风剑情 发布于:2026-6-18 14:32 分类:AI

示例:

import json
import re
import requests

# Ollama API 地址
OLLAMA_URL = "http://localhost:11434/api/generate"

# 模型名称(根据你的 ollama list 输出)
MODEL_NAME = "deepseek-r1:7b"

def ask_deepseek_json(prompt, system_prompt=None):
    """
    向 deepseek-r1:7b 发送请求,要求返回 JSON 结构。
    返回解析后的 Python 字典,若失败则返回 None。
    """
    # 构建请求体
    payload = {
        "model": MODEL_NAME,
        "prompt": prompt,
        "system": system_prompt or "你是一个专业的 AI 助手,必须始终以合法的 JSON 格式回答问题。不要添加任何额外的解释、前缀或后缀。",
        "stream": False,          # 非流式输出,便于一次获取完整响应
        "options": {
            "temperature": 0.3    # 降低随机性,提高确定性
        }
    }

    try:
        response = requests.post(OLLAMA_URL, json=payload, timeout=120)
        response.raise_for_status()
        result = response.json()
        raw_output = result.get("response", "").strip()
        print("原始响应(前200字符):", raw_output[:200])

        # 尝试提取 JSON(可能被 markdown 代码块包裹)
        json_str = extract_json(raw_output)
        if json_str:
            return json.loads(json_str)
        else:
            print("无法提取 JSON,原始内容:", raw_output)
            return None

    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None
    except json.JSONDecodeError as e:
        print(f"JSON 解析失败: {e}\n原始内容: {raw_output}")
        return None

def extract_json(text):
    # 去除 ```json 和 ``` 标记
    match = re.search(r"```json\s*(.*?)\s*```", text, re.DOTALL)
    if match:
        text = match.group(1)
    else:
        match = re.search(r"```\s*(.*?)\s*```", text, re.DOTALL)
        if match:
            text = match.group(1)
    text = text.strip()

    # 优先寻找最外层的 [ 或 {
    start = -1
    for ch in ["[", "{"]:
        pos = text.find(ch)
        if pos != -1:
            start = pos
            break
    if start == -1:
        return None

    # 用栈匹配最外层括号
    stack = []
    for i, ch in enumerate(text[start:], start=start):
        if ch in "{[": stack.append(ch)
        elif ch in "}]":
            if not stack: break
            last = stack.pop()
            if (ch == "}" and last != "{") or (ch == "]" and last != "["):
                break
            if not stack:
                return text[start:i+1]
    return None

# ========== 使用示例 ==========
if __name__ == "__main__":
    # 要查询的问题
    user_prompt = """
    请以 JSON 格式列出当前流行的 5 种 Python Web 框架,每个框架包含以下字段:
    - name: 框架名称
    - category: 类别(如"全栈"、"微框架")
    - primary_use: 主要用途
    - year_released: 首次发布年份(数字)
    请只返回 JSON 数组,不要其他文字。
    """

    data = ask_deepseek_json(user_prompt)

    if data:
        print("\n=== 解析成功的 JSON 数据 ===")
        print(json.dumps(data, indent=2, ensure_ascii=False))
    else:
        print("未能获取有效的 JSON 响应。")

111111.png

标签: AI

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号