目的:测试deepseek能力,希望通过python前处理和后处理来进行实际任务。

任务目标:输出一个公司列表,通过大模型调研输出其主营业务、公司性质和成立年份。

流水账记录下我做作业的全过程:

1. 新建pycharm project,添加python解释器,显示权限不足,浏览器搜索原因,因为未用管理员身份运行导致。

2. 新建pycharm project,但是目录是空的,因为好久不写python工程,想求助个最佳的目录结构。询问大模型,得到了一版答案。鉴于平时都用机器学习项目,因此也让其修正答案针对机器学习的目录结果。请审视如下两个答案:

my_project/
│
├── my_project/               # 主包目录
│   ├── __init__.py           # 包初始化文件
│   ├── main.py               # 主程序入口
│   ├── models/               # 数据模型
│   │   ├── __init__.py
│   │   └── user.py
│   ├── services/             # 业务逻辑
│   │   ├── __init__.py
│   │   └── user_service.py
│   ├── utils/                # 工具函数
│   │   ├── __init__.py
│   │   └── helpers.py
│   └── tests/                # 单元测试
│       ├── __init__.py
│       ├── test_models.py
│       └── test_services.py
│
├── requirements.txt          # 项目依赖
├── README.md                 # 项目说明
├── .gitignore                # Git忽略文件
├── setup.py                  # 项目安装脚本
└── venv/                     # 虚拟环境目录(可选)

其二:

ml_project/
│
├── data/                     # 数据目录
│   ├── raw/                  # 原始数据
│   ├── processed/            # 处理后的数据
│   ├── external/             # 外部数据(如第三方数据集)
│   └── interim/              # 中间数据(处理过程中的临时数据)
│
├── models/                   # 模型目录
│   ├── trained_models/       # 训练好的模型
│   └── model_checkpoints/    # 训练过程中的模型检查点
│
├── notebooks/                # Jupyter Notebooks
│   ├── exploration/          # 数据探索和分析
│   ├── experiments/          # 实验和模型开发
│   └── reports/              # 结果报告和可视化
│
├── src/                      # 源代码目录
│   ├── data/                 # 数据预处理和加载
│   │   ├── __init__.py
│   │   ├── load_data.py
│   │   └── preprocess.py
│   ├── features/             # 特征工程
│   │   ├── __init__.py
│   │   └── feature_engineering.py
│   ├── models/               # 模型定义和训练
│   │   ├── __init__.py
│   │   ├── train.py
│   │   └── model.py
│   ├── visualization/        # 可视化工具
│   │   ├── __init__.py
│   │   └── plot.py
│   └── utils/                # 工具函数
│       ├── __init__.py
│       └── helpers.py
│
├── tests/                    # 单元测试
│   ├── __init__.py
│   ├── test_data.py
│   ├── test_models.py
│   └── test_features.py
│
├── logs/                     # 日志文件
│   ├── training_logs/        # 训练日志
│   └── error_logs/           # 错误日志
│
├── config/                   # 配置文件
│   ├── __init__.py
│   ├── config.yaml           # 项目配置(如超参数、路径等)
│   └── model_config.yaml     # 模型配置
│
├── requirements.txt          # 项目依赖
├── README.md                 # 项目说明
├── .gitignore                # Git忽略文件
├── setup.py                  # 项目安装脚本
└── environment.yml           # Conda环境配置文件(可选)

并且给出了目录说明,针对关键的文件,还提供了一些示例代码,如main和test_main。

3. 鉴于逐一手工新建文件,较为复杂,希望写一个程序自动实现,但是写程序时间也很长,于是求助大模型“是否有快捷方式创建上述的目录结构”。

给了三个方法,也提供了具体实现:

  • Python 脚本:适合需要自定义逻辑的场景。

  • Shell 脚本:简单直接,适合快速创建目录结构。

  • Cookiecutter:适合需要标准化和复用的场景。

鉴于熟悉python脚本,在大模型输出的脚本基础上,略作改造即可使用,如下参考:

import os

# 定义目录结构
project_structure = {
    "ml_project": {
        "data": ["raw", "processed", "external", "interim"],
        "models": ["trained_models", "model_checkpoints"],
        "notebooks": ["exploration", "experiments", "reports"],
        "src": {
            "data": [],
            "features": [],
            "models": [],
            "visualization": [],
            "utils": [],
        },
        "tests": [],
        "logs": ["training_logs", "error_logs"],
        "config": [],
    }
}

# 创建目录
def create_directory(base_path, structure):
    for name, content in structure.items():
        path = os.path.join(base_path, name)
        os.makedirs(path, exist_ok=True)
        print(f"Created: {path}")
        if isinstance(content, dict):
            create_directory(path, content)
        elif isinstance(content, list):
            for subdir in content:
                subdir_path = os.path.join(path, subdir)
                os.makedirs(subdir_path, exist_ok=True)
                print(f"Created: {subdir_path}")

# 主函数
if __name__ == "__main__":
    base_path = os.getcwd()  # 当前工作目录
    create_directory(base_path, project_structure)

    # 创建空文件
    with open(os.path.join(base_path, "ml_project/README.md"), "w") as f:
        f.write("# ML Project\n")
    with open(os.path.join(base_path, "ml_project/requirements.txt"), "w") as f:
        f.write("# Project dependencies\n")
    with open(os.path.join(base_path, "ml_project/.gitignore"), "w") as f:
        f.write("# Git ignore file\n")
    with open(os.path.join(base_path, "ml_project/setup.py"), "w") as f:
        f.write("# Setup script\n")
    with open(os.path.join(base_path, "ml_project/environment.yml"), "w") as f:
        f.write("# Conda environment file\n")

    print("Project structure created successfully!")

4. 开始启动我的工程了,但是还是有不少脚本要写啊。干脆还是找大模型帮忙,“我有个公司列表,需要遍历公司的列表,拼接成一个标准的提示词,输入deepseek的api接口,输出该公司的主营业务,公司性质,成立年月,并按照json形式输出。并且将json的输出整理成一个dataframe,输出到excel中,请提供如上的脚本。”

import requests
import pandas as pd
import json

# DeepSeek API 的 URL 和 API Key
DEEPSEEK_API_URL = "https://api.deepseek.com/v1/company_info"  # 替换为实际的 API URL
API_KEY = "your_api_key_here"  # 替换为你的 API Key

# 公司列表
companies = ["阿里巴巴", "腾讯", "百度", "华为", "字节跳动"]

# 定义请求头
headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 存储结果的列表
results = []

# 遍历公司列表
for company in companies:
    # 构造提示词
    prompt = f"请提供以下公司的主营业务、公司性质和成立年月:{company}"

    # 构造请求体
    payload = {
        "prompt": prompt,
        "max_tokens": 100  # 根据需要调整
    }

    # 调用 DeepSeek API
    response = requests.post(DEEPSEEK_API_URL, headers=headers, json=payload)

    # 检查请求是否成功
    if response.status_code == 200:
        # 解析 API 返回的 JSON 数据
        api_response = response.json()

        # 提取需要的信息
        company_info = {
            "公司名称": company,
            "主营业务": api_response.get("主营业务", "未知"),
            "公司性质": api_response.get("公司性质", "未知"),
            "成立年月": api_response.get("成立年月", "未知")
        }
        results.append(company_info)
    else:
        print(f"请求失败:{company},状态码:{response.status_code}")

# 将结果转换为 DataFrame
df = pd.DataFrame(results)

# 输出到 Excel 文件
output_file = "company_info.xlsx"
df.to_excel(output_file, index=False)

print(f"数据已成功导出到 {output_file}")

写的不错,我有翻看官网的例子,貌似指定system_prompt 效果会更好

import json
from openai import OpenAI

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

system_prompt = """
The user will provide some exam text. Please parse the "question" and "answer" and output them in JSON format. 

EXAMPLE INPUT: 
Which is the highest mountain in the world? Mount Everest.

EXAMPLE JSON OUTPUT:
{
    "question": "Which is the highest mountain in the world?",
    "answer": "Mount Everest"
}
"""

user_prompt = "Which is the longest river in the world? The Nile River."

messages = [{"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}]

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages,
    response_format={
        'type': 'json_object'
    }
)

print(json.loads(response.choices[0].message.content))

于是,结合刚刚大模型输出的程序,手动调整了下,效率还是很高的。

from openai import OpenAI
import pandas as pd
import json

client = OpenAI(
  api_key="XXXXXX",
  base_url="https://api.deepseek.com",
)

system_prompt = """
你是一个资深的商业分析师,擅长做公司研究,用户将提供一个公司名称,请提供公司的主营业务、公司性质和成立年份,并且用JSON的格式输出。 

EXAMPLE INPUT: 
华为

EXAMPLE JSON OUTPUT:
{
    "主营业务": "通信业",
    "公司性质": "民营企业",
    "成立年份": "1987"
}
"""

companies = ["阿里巴巴", "腾讯", "百度", "华为", "字节跳动"]

# 存储结果的列表
results = []

# 遍历公司列表
for company in companies:
    # 构造提示词
    user_prompt = f"{company}"

    messages = [{"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}]

    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
        response_format={
            'type': 'json_object'
        }
    )

    print(json.loads(response.choices[0].message.content))

    # 检查请求是否成功
    if response:
        # 解析 API 返回的 JSON 数据
        api_response = json.loads(response.choices[0].message.content)

        # 提取需要的信息
        company_info = {
            "公司名称": company,
            "主营业务": api_response.get("主营业务", "未知"),
            "公司性质": api_response.get("公司性质", "未知"),
            "成立年份": api_response.get("成立年份", "未知")
        }
        results.append(company_info)
    else:
        print(f"请求失败:{company}")

# 将结果转换为 DataFrame
df = pd.DataFrame(results)

# 输出到 CSV 文件
output_file = "company_data.csv"
df.to_csv(output_file, index=False)  # index=False 表示不保存行索引

print(f"数据已成功导出到 {output_file}")

看通过“立角色”,user的promte可以很简单,仅提供公司名称就可以啦。立一些什么角色呢,才疏学浅,总是词不达意,干脆大模型问起,“做公司调研的职业名称是?”,哈哈,大模型输出几个字,我就想起来了,不就是商业分析师。

从事公司调研的职业名称通常与金融分析市场研究商业分析投资研究相关。以下是一些常见的职业名称及其职责:


1. 行业研究员(Industry Research Analyst)

如下省略。。。。。。

到此为止了吗,还没有,中间还有写小插曲,因为过程中还需要一些bug,比如deepseek的接口不能直接用,比如,软件还没有安装,借助pycharm自身代码检查的功能,很快克服了。

目的达成!!!

5. 既然走到这里,还是在完善一步吧,求助大模型输出测试用例,我把刚刚的py文件丢给大模型,大模型就帮忙输出了测试用例。“以下是针对你上传的 main.py 文件的测试用例代码。这些测试用例可以用于 PyCharm 的测试文件中,确保代码的功能正确性。”

import unittest
from unittest.mock import patch, MagicMock
import json
from main import client, system_prompt, companies, results, df, output_file


class TestCompanyAnalysis(unittest.TestCase):

    @patch('main.client.chat.completions.create')
    def test_api_response(self, mock_create):
        # 模拟 API 返回的 JSON 数据
        mock_response = MagicMock()
        mock_response.choices = [MagicMock()]
        mock_response.choices[0].message.content = json.dumps({
            "主营业务": "电子商务、云计算、数字媒体和娱乐、创新业务",
            "公司性质": "上市公司",
            "成立年份": "未知"
        })
        mock_create.return_value = mock_response

        # 调用 API
        user_prompt = "阿里巴巴"
        messages = [{"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}]
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=messages,
            response_format={'type': 'json_object'}
        )

        # 验证 API 返回的数据
        self.assertEqual(json.loads(response.choices[0].message.content), {
            "主营业务": "电子商务、云计算、数字媒体和娱乐、创新业务",
            "公司性质": "上市公司",
            "成立年份": "未知"
        })

    def test_companies_list(self):
        # 验证公司列表是否正确
        expected_companies = ["阿里巴巴", "腾讯", "百度", "华为", "字节跳动"]
        self.assertEqual(companies, expected_companies)

    def test_results_structure(self):
        # 验证 results 列表的结构是否正确
        for result in results:
            self.assertIn("公司名称", result)
            self.assertIn("主营业务", result)
            self.assertIn("公司性质", result)
            self.assertIn("成立年份", result)

    def test_dataframe_creation(self):
        # 验证 DataFrame 是否正确创建
        self.assertEqual(len(df), len(companies))
        self.assertListEqual(list(df.columns), ["公司名称", "主营业务", "公司性质", "成立年份"])

    def test_csv_output(self):
        # 验证 CSV 文件是否正确输出
        import os
        self.assertTrue(os.path.exists(output_file))
        with open(output_file, 'r', encoding="utf-8") as f:
            content = f.read()
            self.assertIn("公司名称,主营业务,公司性质,成立年份", content)


if __name__ == '__main__':
    unittest.main()

代码ok了,运行起来,oops,src下的目录的内容,不能被直接调用,求助大模型,“pycharm文件夹 test下的test_main文件需要import src下的main文件,路径在该怎样写”,给我五种方法,

  • 推荐方法:将 src 和 test 都作为包,并使用绝对导入(方法 3 或方法 4)。

  • 简单方法:在 PyCharm 中标记 src 为 Sources Root(方法 4)。

  • 动态方法:修改 sys.path(方法 2),但不够优雅。

方法4,简直是方便多了,用起来。

oops,为什么有个测试用例没过呢,原来 测试用例读取的格式有问题,该怎么写呢,求助大模型直接输如错误提示“UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 4: character maps to <undefined>”,直接告诉我答案啦,简直是救星。

UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 4: character maps to <undefined> 错误通常发生在尝试读取包含非 ASCII 字符的文件时,而默认的编码方式(如 Windows 上的 charmap)无法正确解码这些字符。

..................此处省略

总结

  • 如果文件是 utf-8 编码,直接指定 encoding="utf-8"

  • 如果文件编码不确定,可以使用 chardet 检测编码。

  • 如果文件包含无法解码的字符,可以使用 errors="ignore" 或 errors="replace" 处理。

希望这些方法能解决你的问题!如果还有其他疑问,请随时提问。

好了 ,大模型就到这里吧,剩下的我还是去总结下,帮你宣传一下啦。毕竟你给我省的时间,还是大大值得我帮你宣传一波的。于是本文诞生了......,不过下次是否你可以直接帮忙写......

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐