首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从零到一:使用pycharm搭建API接口调用大模型

从零到一:使用pycharm搭建API接口调用大模型

原创
作者头像
不吃花椒的喵酱
发布2025-12-23 18:56:22
发布2025-12-23 18:56:22
1010
举报

从零到一:使用pycharm搭建API接口调用大模型

代码语言:latex
复制
【前言】
随着人工智能技术的快速发展,大语言模型(LLM)已成为许多应用场景的核心技术。本文将详细介绍如何使用PyCharm开发环境搭建API接口调用大模型的完整流程,包括两种主流调用方式、模型列表查看方法,以及一个完整的求职岗位查询实战案例。

【任务】
1.掌握使用OpenAI库和requests库调用大模型API的方法。
2.学会查看和展示可用的大模型列表。
3.实现基于大模型的求职岗位查询系统。
4.掌握API调用的错误处理和结果展示技巧。

【准备】
开始之前,请确保你已经准备好:
1.安装pycharm,并在终端使用清华源安装依赖库:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests python-dotenv tabulate openpyxl

2.在硅基流动官网(https://cloud.siliconflow.cn/)上注册一个账户,随后在创建一个api密钥。我们本次实验中使用免费模型为Qwen/Qwen2.5-7B-Instruct。

By:不吃花椒的喵酱

一.大模型调用

大模型调用有两种方式,一种通过openai库进行调用,一种通过requests库进行调用。

我们通过简单的代码,来分别简述两种大模型调用的方式:

1.1 openai方式调用:

代码实现:

代码语言:python
复制
from openai import OpenAI

client = OpenAI(
    api_key="你的api密钥", # 使用你创建的api密钥
    base_url="https://api.siliconflow.cn/v1",
)

try:
    response = client.chat.completions.create(
        model="Qwen/Qwen2.5-7B-Instruct",  #使用免费的大模型
        messages=[
            {
                "role": "user",
                "content": "你好",
            }
        ],
        stream=False,
    )

    # 响应内容访问方式
    print(response.choices[0].message.content)

except Exception as e:
    print(f"调用API时出错: {e}")
    import traceback

    traceback.print_exc()
图1:OpenAI库调用大模型代码示例
1.2 Requests方式调用

代码实现:

代码语言:python
复制
import requests
import json

url = "https://api.siliconflow.cn/v1/chat/completions"

payload = {
    "model": "Qwen/Qwen2.5-7B-Instruct",
    "messages": [
        {
            "role": "user",
            "content": "中国大模型行业2025年将会迎来哪些机遇和挑战",
        }
    ],
    "stream": False,
    "max_tokens": 2048,
    "stop": None,
    "temperature": 0.7,
    "top_p": 0.7,
    "top_k": 50,
    "frequency_penalty": 0.5,
    "n": 1,
    "response_format": {"type": "text"},
}

headers = {
    "Authorization": "Bearer 你的api密钥", # 使用你创建的api密钥
    "Content-Type": "application/json",
}

try:
    print("正在发送请求到AI模型...")
    response = requests.post(url, json=payload, headers=headers, timeout=30)  # 添加超时时间

    print(f"响应状态码: {response.status_code}")

    # 检查HTTP状态码
    if response.status_code == 200:
        data = response.json()

        # 检查API返回的错误
        if "error" in data:
            print(f"API错误: {data['error']['message']}")
        elif "choices" in data and len(data["choices"]) > 0:
            answer = data["choices"][0]["message"]["content"]
            print("=" * 60)
            print("AI回答:")
            print("=" * 60)
            print(answer)
            print("=" * 60)
        else:
            print("响应格式异常:", json.dumps(data, indent=2, ensure_ascii=False))
    else:
        print(f"HTTP错误 {response.status_code}: {response.text}")

except requests.exceptions.Timeout:
    print("请求超时,请检查网络连接或稍后重试")
except requests.exceptions.ConnectionError:
    print("连接错误,请检查网络连接")
except requests.exceptions.RequestException as e:
    print(f"请求异常: {e}")
except json.JSONDecodeError:
    print("响应不是有效的JSON格式:", response.text)
except KeyError as e:
    print(f"响应数据结构异常,缺少键: {e}")
    print("完整响应:", response.text[:500])  # 打印前500个字符用于调试
except Exception as e:
    print(f"未知错误: {e}")
    import traceback

    traceback.print_exc()
图2:Requests库调用大模型代码示例

二.查看硅基流动的大模型列表

2.1 简单列表形式

查看返回大模型列表的结果:

代码实现:

代码语言:python
复制
from openai import OpenAI

client = OpenAI(
    api_key="你的api密钥", # 使用你创建的api密钥
    base_url="https://api.siliconflow.cn/v1",
)

try:
    models = client.models.list()
    print("可用的模型:")
    for model in models.data:
        print(f"- {model.id}")
except Exception as e:
    print(f"获取模型列表时出错: {e}")
图3:获取模型列表简单形式代码示例
2.2 表格形式展示

返回的结果为表格形式:

代码实现:

代码语言:python
复制
from openai import OpenAI
import pandas as pd

client = OpenAI(
    api_key="你的api密钥", # 使用你创建的api密钥
    base_url="https://api.siliconflow.cn/v1",
)

try:
    models = client.models.list()
    print("可用的模型:")
    print("="*80)
    
    # 准备数据用于制作表格
    model_data = []
    
    for model in models.data:
        model_info = {
            "模型ID": model.id,
            "创建时间": model.created if hasattr(model, 'created') else 'N/A',
            "所属组织": model.owned_by if hasattr(model, 'owned_by') else 'N/A'
        }
        model_data.append(model_info)
        
        # 同时打印列表形式
        print(f"- {model.id}")
    
    print("\n" + "="*80)
    print("模型信息表格:")
    print("="*80)
    
    # 使用pandas创建表格
    if model_data:
        df = pd.DataFrame(model_data)
        print(df.to_string(index=False))
        
        # 保存到Excel文件
        df.to_excel("硅基流动可用模型列表.xlsx", index=False, engine='openpyxl')
        print(f"\n表格已保存到文件: 硅基流动可用模型列表.xlsx")
    else:
        print("未获取到模型数据")
        
except Exception as e:
    print(f"获取模型列表时出错: {e}")
    import traceback
    traceback.print_exc()
    
图4:获取模型列表表格形式代码示例

三.通过pycharm调用API接口,实现大模型求职岗位查询

第一步:准备工作

在运行代码之前,请确保你的项目目录下有以下文件和配置。

1. 创建项目文件夹

在你的电脑上创建一个新的文件夹,例如 智能简历招聘,所有的文件都将放在这里面。

2. 创建简历文件 (简历.txt)

智能简历招聘 文件夹中,创建一个名为 简历.txt 的文件,并将以下内容复制进去:

代码语言:latex
复制
# 简历.txt

张三
电话: 138-1234-5678
邮箱: zhangsan.cs@email.com
求职意向: 软件开发工程师(实习/应届生)

--------------------------------------------------

教育背景:
2020.09 - 2024.06     XX大学      计算机科学与技术      本科
主修课程: 数据结构与算法、计算机网络、操作系统、数据库系统、软件工程、编译原理

--------------------------------------------------

专业技能:
- 编程语言: 熟练掌握 Java、Python;熟悉 C++、JavaScript
- 后端技术: 熟练使用 Spring Boot、MyBatis 进行后端开发;了解 Django、Flask 框架
- 前端技术: 熟悉 HTML、CSS、JavaScript;了解 Vue.js 框架和 Element UI 组件库
- 数据库: 熟练使用 MySQL、Redis
- 开发工具: 熟练使用 Git 进行版本控制;熟悉 Docker 容器技术;了解 Linux 常用命令
- 其他: 熟悉 RESTful API 设计原则;了解常见的微服务架构

--------------------------------------------------

项目经验:

项目一: 校园二手交易平台 (个人项目)
2023.03 - 2023.06
- 项目描述: 一个为在校大学生提供的二手物品在线交易平台,支持用户注册登录、商品发布、搜索、下单和评论等功能。
- 技术栈: Spring Boot + MyBatis + MySQL + Redis + Vue.js + Element UI
- 我的职责:
  - 独立负责项目的前后端架构设计、数据库表结构设计。
  - 使用 Spring Boot 和 MyBatis 开发了用户、商品、订单等模块的后端 RESTful API。
  - 使用 Redis 缓存热点商品数据和用户登录信息,提升了系统响应速度。
  - 使用 Vue.js 和 Element UI 构建了响应式的前端界面,实现了良好的用户交互。
  - 通过 Nginx 部署项目到阿里云服务器。

项目二: 基于协同过滤的电影推荐系统 (课程设计)
2022.10 - 2022.12
- 项目描述: 一个根据用户的历史评分行为,为其推荐可能感兴趣的电影的系统。
- 技术栈: Python + Pandas + Scikit-learn + Flask
- 我的职责:
  - 使用 Pandas 对 MovieLens 数据集进行数据清洗和预处理。
  - 实现了基于用户的协同过滤算法,计算用户相似度并生成推荐列表。
  - 使用 Flask 框架搭建了一个简单的 Web 服务,通过 API 接口提供推荐结果。
  - 使用 Matplotlib 对推荐结果进行了可视化分析。

--------------------------------------------------

实习经历:

2023.07 - 2023.09     ABC科技有限公司     后端开发实习生
- 参与公司 CRM 系统的维护与功能迭代,修复了若干历史 Bug。
- 根据产品需求文档,使用 Spring Boot 开发了 2 个新的业务模块 API 接口。
- 编写了单元测试用例,确保了交付代码的质量和稳定性。
- 学习并遵循团队的 Git Flow 工作流,参与了代码审查。

--------------------------------------------------

个人荣誉:
- 2022年 XX大学“蓝桥杯”程序设计竞赛省级一等奖
- 大学英语六级 (CET-6)

感谢您审阅我的简历!
3. 创建 API 密钥文件 (.env)

在同一个文件夹中,创建一个名为 .env 的文件。这个文件用于安全地存储你的 API 密钥,绝不能泄露给别人。

文件内容如下,请将 你的API密钥 替换为你自己的 SiliconFlow API 密钥

代码语言:python
复制
SILICONFLOW_API_KEY="你的API密钥" # 使用你创建的api密钥
4. 安装 Python 依赖库
代码语言:python
复制
# 在终端使用清华源安装依赖库:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests python-dotenv tabulate openpyxl
第二步:完整代码

智能简历招聘文件夹中,创建一个 Python 文件,例如 job_ai.py,然后将以下完整代码复制进去:

代码语言:python
复制
import os
import requests
import json
from dotenv import load_dotenv
from tabulate import tabulate
from datetime import datetime
import csv

# 检查 openpyxl 是否已安装
try:
    from openpyxl import Workbook

    EXCEL_SUPPORT = True
except ImportError:
    EXCEL_SUPPORT = False
    print("警告:未安装 'openpyxl' 库,将无法保存为 Excel 文件。")
    print("请运行 `pip install openpyxl` 来安装此功能。")

# --- 1. 配置和初始化 ---

load_dotenv()
API_KEY = os.getenv("SILICONFLOW_API_KEY")
if not API_KEY:
    raise ValueError("错误:API密钥未设置。请在 .env 文件中配置 SILICONFLOW_API_KEY。")

URL = "https://api.siliconflow.cn/v1/chat/completions"

# 【优化】使用不同模型处理不同任务
SUMMARY_MODEL = "Qwen/Qwen2.5-7B-Instruct"  # 可以使用更强大的模型进行总结
RECOMMEND_MODEL = "Qwen/Qwen2.5-7B-Instruct"  # 可以使用更强大的模型进行推荐


# --- 2. 辅助函数 ---

def validate_link(url: str) -> bool:
    """通过发送HEAD请求来验证链接是否有效。"""
    try:
        response = requests.head(url, timeout=10, allow_redirects=True)
        return response.status_code == 200
    except requests.RequestException:
        return False


def read_resume(filepath: str) -> str:
    """读取简历文件内容"""
    try:
        with open(filepath, "r", encoding="utf-8") as f:
            return f.read()
    except FileNotFoundError:
        print(f"错误:找不到简历文件 '{filepath}'。请确保该文件存在于脚本同一目录下。")
        exit()
    except Exception as e:
        print(f"读取简历文件时发生错误: {e}")
        exit()


# 第一步:简历总结函数
def summarize_resume(full_resume_text: str) -> str | None:
    """调用AI模型总结简历内容"""
    prompt = f"""
请将以下简历内容进行精炼总结,提取出最关键的信息。总结应包含:
1. 求职者的核心技能和掌握程度。
2. 主要工作经验和项目亮点。
3. 教育背景和求职意向。

请用一段通顺的中文进行总结,不要使用列表或markdown格式。

简历内容如下:
---
{full_resume_text}
---
"""
    payload = {
        "model": SUMMARY_MODEL,
        "messages": [{"role": "user", "content": prompt}],
        "stream": False,
        "temperature": 0.3,  # 降低温度,使总结更客观
    }
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    }
    try:
        print("\n第一步:正在总结简历核心信息...")
        response = requests.post(URL, json=payload, headers=headers, timeout=60)
        if response.status_code == 200:
            data = response.json()
            if "error" in data:
                print(f"API返回错误: {data['error']['message']}")
                return None
            summary = data["choices"][0]["message"]["content"].strip()
            print("✅ 简历总结完成。")
            print("-" * 50)
            print("简历摘要预览:")
            print(summary)
            print("-" * 50)
            return summary
        else:
            print(f"总结时发生HTTP错误 {response.status_code}: {response.text}")
            return None
    except Exception as e:
        print(f"总结时发生异常: {e}")
        return None


def build_prompt(resume_summary: str) -> str:
    """【优化】基于简历摘要构建推荐提示"""
    prompt = f"""
你是一位专业的职业顾问和招聘专家。下面是一份求职者简历的**核心摘要**:

---
{resume_summary}
---

请根据这份摘要,推荐5个最匹配的招聘岗位。

**请严格按照以下JSON格式返回结果,不要包含任何其他解释性文字或markdown格式:**
[
  {{
    "job_title": "岗位名称",
    "company": "公司名称",
    "description": "岗位简要描述和匹配原因",
    "job_link": "真实有效的招聘链接"
  }},
  {{
    "job_title": "岗位名称2",
    "company": "公司名称2",
    "description": "岗位简要描述和匹配原因2",
    "job_link": "真实有效的招聘链接2"
  }}
  ... (共5个)
]

**重要提示:**
1. 请确保提供的 `job_link` 是真实、有效的招聘网站链接,例如来自 LinkedIn、Boss直聘、拉勾网、猎聘等主流招聘平台。
2. **不要生成虚假、示例或无效的链接。** 如果找不到真实链接,请用 "null" 代替。
"""
    return prompt


def get_ai_recommendations(prompt: str) -> list | None:
    """第二步:调用AI API获取推荐"""
    payload = {
        "model": RECOMMEND_MODEL,
        "messages": [{"role": "user", "content": prompt}],
        "stream": False,
        "temperature": 0.5,
        "response_format": {"type": "json_object"}
    }
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    }

    try:
        print("\n第二步:正在基于摘要请求岗位推荐...")
        response = requests.post(URL, json=payload, headers=headers, timeout=60)
        if response.status_code == 200:
            data = response.json()
            if "error" in data:
                print(f"API返回错误: {data['error']['message']}")
                return None

            content_str = data["choices"][0]["message"]["content"]
            recommendations = json.loads(content_str)  # 标准模型通常不需要清理
            return recommendations
        else:
            print(f"推荐时发生HTTP错误 {response.status_code}: {response.text}")
            return None
    except json.JSONDecodeError:
        print("AI返回的内容不是有效的JSON格式。")
        print("原始响应:", response.text[:500])
        return None
    except Exception as e:
        print(f"推荐时发生未知错误: {e}")
        return None


# --- 3. 文件保存函数 (已优化) ---

def save_to_csv(data: list, headers: list, filename: str):
    """将表格数据保存为 CSV 文件"""
    try:
        with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(headers)
            writer.writerows(data)
        print(f"\n✅ 结果已成功保存为 CSV 文件: {filename}")
    except Exception as e:
        print(f"\n❌ 保存 CSV 文件时出错: {e}")


def save_to_excel(data: list, headers: list, filename: str):
    """将表格数据保存为 Excel 文件"""
    if not EXCEL_SUPPORT:
        print("\n❌ 无法保存为 Excel 文件,因为缺少 'openpyxl' 库。")
        print("请运行 `pip install openpyxl` 来安装此功能。")
        return
    try:
        wb = Workbook()
        ws = wb.active
        ws.title = "岗位推荐"

        # 正确的写入方式:使用 append 逐行写入
        ws.append(headers)
        for row_data in data:
            ws.append(row_data)

        # 自动调整列宽
        for col in ws.columns:
            max_length = 0
            column = col[0].column_letter
            for cell in col:
                try:
                    if len(str(cell.value)) > max_length:
                        max_length = len(str(cell.value))
                except:
                    pass
            adjusted_width = (max_length + 2) * 1.2
            ws.column_dimensions[column].width = adjusted_width

        wb.save(filename)
        print(f"\n✅ 结果已成功保存为 Excel 文件: {filename}")
    except Exception as e:
        print(f"\n❌ 保存 Excel 文件时出错: {e}")


# --- 4. 主执行逻辑(自动保存Excel) ---

def main():
    """主函数"""
    resume_file = "简历.txt"
    full_resume_content = read_resume(resume_file)

    # --- 程序执行两步流程 ---
    # 1. 总结简历
    resume_summary = summarize_resume(full_resume_content)

    if not resume_summary:
        print("简历总结失败,无法继续进行岗位推荐。")
        return

    # 2. 基于摘要进行推荐
    prompt = build_prompt(resume_summary)
    recommendations = get_ai_recommendations(prompt)

    if recommendations and isinstance(recommendations, list):
        print("\n正在验证链接有效性并生成推荐表格...")

        table_data = []
        headers = ["序号", "岗位", "公司", "链接有效性", "招聘链接"]

        for i, job in enumerate(recommendations, 1):
            job_title = job.get("job_title", "未知岗位")
            company = job.get("company", "未知公司")
            job_link = job.get("job_link")

            if job_link and job_link.lower() != 'null':
                is_valid = validate_link(job_link)
                status_text = "✅ 有效" if is_valid else "❌ 无效"
            else:
                status_text = "⚠️ 未提供"
                job_link = "N/A"

            table_data.append([i, job_title, company, status_text, job_link])

        print("\n" + "=" * 100)
        print("为您找到以下岗位推荐:")
        print("=" * 100 + "\n")
        print(tabulate(table_data, headers=headers, tablefmt="grid", maxcolwidths=[None, None, None, None, 50]))
        print("\n" + "=" * 100)

        # 按年月日时间保存为 Excel 文件,无需用户交互
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"job_recommendations_{timestamp}.xlsx"
        save_to_excel(table_data, headers, filename)

        print("=" * 100)
        print("程序执行完毕。")
        print("=" * 100)

    else:
        print("未能获取到有效的岗位推荐。")


if __name__ == "__main__":
    main()
第三步:运行结果
图5:程序运行结果展示
图6:大模型返回岗位信息.xlxs文件

四.掌握API调用的错误处理和结果展示技巧

代码语言:latex
复制
       我们在实际开发中,调用大模型API时,错误处理和结果展示是非常关键的两个环节。良好的错误处理机制可以提升程序的稳定性,而清晰的结果展示则能提高用户体验和调试效率。
一、API调用中的常见错误类型
代码语言:latex
复制
	我们在使用 requests 或 openai 库调用大模型API接口时,可能会遇到以下几种常见错误:

错误类型

描述

示例

HTTP状态码异常

如401(未授权)、404(资源不存在)、500(服务器内部错误)

response.status_code == 401

网络连接问题

请求超时、DNS解析失败、连接被拒绝等

requests.exceptions.Timeout

JSON格式错误

API返回的数据不是有效的JSON格式

json.JSONDecodeError

响应结构异常

返回数据字段缺失或结构不一致

KeyError

API限流

超出请求频率限制

{"error": {"message": "Rate limit exceeded"}}

二、错误处理的最佳实践
1. 使用 try-except 捕获异常
代码语言:python
复制
try:
    response = requests.post(url, json=payload, headers=headers, timeout=30)
    if response.status_code == 200:
        data = response.json()
        if "error" in data:
            print(f"API错误: {data['error']['message']}")
        else:
            answer = data["choices"][0]["message"]["content"]
            print("AI回答:", answer)
    else:
        print(f"HTTP错误 {response.status_code}: {response.text}")
except requests.exceptions.Timeout:
    print("请求超时,请检查网络连接或稍后重试")
except requests.exceptions.ConnectionError:
    print("连接错误,请检查网络连接")
except json.JSONDecodeError:
    print("响应不是有效的JSON格式:", response.text)
except KeyError as e:
    print(f"响应数据结构异常,缺少键: {e}")
except Exception as e:
    print(f"未知错误: {e}")
    traceback.print_exc()
2. 设置合理的超时时间
代码语言:python
复制
response = requests.post(url, json=payload, headers=headers, timeout=30)
3. 处理API限流
代码语言:python
复制
if "Rate limit" in data.get("error", {}).get("message", ""):
    print("请求过于频繁,请稍后再试")
三、结果展示技巧
1. 控制台输出优化
代码语言:python
复制
# 1. 控制台输出优化,使用 tabulate 库美化表格输出:

from tabulate import tabulate

table_data = [
    [1, "软件工程师", "腾讯", "✅ 有效", "https://..."],
    [2, "后端开发", "阿里", "❌ 无效", "https://..."]
]
headers = ["序号", "岗位", "公司", "链接有效性", "招聘链接"]

print(tabulate(table_data, headers=headers, tablefmt="grid"))
2. 结果保存到文件
代码语言:python
复制
# 2. 保存为 Excel 文件(使用 openpyxl)

from openpyxl import Workbook

def save_to_excel(data: list, headers: list, filename: str):
    wb = Workbook()
    ws = wb.active
    ws.title = "岗位推荐"
    ws.append(headers)
    for row_data in data:
        ws.append(row_data)
    wb.save(filename)
3. 自动命名文件并保存
代码语言:python
复制
from datetime import datetime

timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"job_recommendations_{timestamp}.xlsx"
save_to_excel(table_data, headers, filename)

五、实验总结

代码语言:latex
复制
	通过这次实验,我们不仅跑通了大模型API调用的完整链路,更亲手打造了一个有实际价值的智能求职助手。从简单的"你好"到读懂整份简历,从控制台输出到自动生成Excel报告,每一步都在见证AI如何真正落地为生产力。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从零到一:使用pycharm搭建API接口调用大模型
    • 一.大模型调用
    • 二.查看硅基流动的大模型列表
    • 三.通过pycharm调用API接口,实现大模型求职岗位查询
    • 四.掌握API调用的错误处理和结果展示技巧
    • 五、实验总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档