那些deepseek教我的事......
目的:测试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"处理。希望这些方法能解决你的问题!如果还有其他疑问,请随时提问。
好了 ,大模型就到这里吧,剩下的我还是去总结下,帮你宣传一下啦。毕竟你给我省的时间,还是大大值得我帮你宣传一波的。于是本文诞生了......,不过下次是否你可以直接帮忙写......
更多推荐



所有评论(0)