From 4ead2c1f9f9e0baa40bab9bbde98a8f0f5d79c24 Mon Sep 17 00:00:00 2001 From: root <3040141700@qq.com> Date: Thu, 26 Feb 2026 16:49:19 +0800 Subject: [PATCH] first commit --- 05-LLM/.env | 4 + 05-LLM/01_api_deepseek_v3.py | 46 ++++++++++ 05-LLM/02_api_deepseek_v3_optimizer.py | 70 ++++++++++++++++ 05-LLM/03_api_deepseek_v3.py | 112 +++++++++++++++++++++++++ 05-LLM/04_ollama_api_qwen.py | 87 +++++++++++++++++++ 05-LLM/class.txt | 10 +++ 05-LLM/test2.txt | 5 ++ 05-LLM/大模型生成提示词.txt | 26 ++++++ 8 files changed, 360 insertions(+) create mode 100644 05-LLM/.env create mode 100644 05-LLM/01_api_deepseek_v3.py create mode 100644 05-LLM/02_api_deepseek_v3_optimizer.py create mode 100644 05-LLM/03_api_deepseek_v3.py create mode 100644 05-LLM/04_ollama_api_qwen.py create mode 100644 05-LLM/class.txt create mode 100644 05-LLM/test2.txt create mode 100644 05-LLM/大模型生成提示词.txt diff --git a/05-LLM/.env b/05-LLM/.env new file mode 100644 index 0000000..0f246fb --- /dev/null +++ b/05-LLM/.env @@ -0,0 +1,4 @@ +BASE_URL=https://api.deepseek.com +DEEPSEEK_API_KEY=sk-3bdf1e37c79f4ec8afde20e9489b6632 +DEV2FILE=D:\code\workspace7\TMF\05-LLM\test2.txt +CLASS_FILE=D:\code\workspace7\TMF\05-LLM\class.txt \ No newline at end of file diff --git a/05-LLM/01_api_deepseek_v3.py b/05-LLM/01_api_deepseek_v3.py new file mode 100644 index 0000000..e5ed0b2 --- /dev/null +++ b/05-LLM/01_api_deepseek_v3.py @@ -0,0 +1,46 @@ +from openai import OpenAI + + +def dm01(): + client = OpenAI( + api_key="sk-0797e0871d044ca5a9baf9d30216cd1a", + base_url="https://api.deepseek.com") + + response = client.chat.completions.create( + model="deepseek-chat", + messages=[ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": "Hello"}, + ], + stream=False + ) + + print(response.choices[0].message.content) + + +# 调用第三方模型(远程),这里以DeepSeek为例。 +def dm02(prompt): + # 创建客户端 + client = OpenAI(api_key="sk-0797e0871d044ca5a9baf9d30216cd1a", base_url="https://api.deepseek.com") + # 创建会话 + response = client.chat.completions.create( + # 模型deepseek-chat是deepseek-v3 + # 模型deepseek-reasoner是deepseek-r1 + model="deepseek-chat", + messages=[ + {"role": "system", "content": "你是一个ai助手"}, + {"role": "user", "content": prompt}, + ], + stream=False + ) + # 打印结果 + print(response.choices[0].message.content) + + +if __name__ == '__main__': + # dm01() + prompt="我要做中文新闻文本分类的任务,大概数据如下:体验2D巅峰 倚天屠龙记十大创新概览 8 60年铁树开花形状似玉米芯(组图) 5 同步A股首秀:港股缩量回调 2 最终要求对应的类别如下所示:finance,realty,stocks,education,science,society,politics,sports,game,entertainment" + + dm02(prompt) + # 调用大模型来实现分类任务 + # dm02("体验2D巅峰 倚天屠龙记十大创新概览") \ No newline at end of file diff --git a/05-LLM/02_api_deepseek_v3_optimizer.py b/05-LLM/02_api_deepseek_v3_optimizer.py new file mode 100644 index 0000000..0345956 --- /dev/null +++ b/05-LLM/02_api_deepseek_v3_optimizer.py @@ -0,0 +1,70 @@ +# 先安装: pip install openai +# 导包 +from dotenv import load_dotenv +load_dotenv() +import os +from openai import OpenAI + +api_key = os.getenv("") +print("api_key-->", api_key) +base_url = os.getenv("BASE_URL") +print("base_url-->", base_url) + + +SYSTEM_PROMPT = """ +你是一个专业的中文新闻分类器,你的任务是将输入的中文新闻标题分类到以下10个类别之一: + +0 - finance (金融财经) +1 - realty (房地产) +2 - stocks (股市) +3 - education (教育) +4 - science (科技科学) +5 - society (社会民生) +6 - politics (政治) +7 - sports (体育) +8 - 悦儿 (yueer) +9 - game (游戏) + +分类规则: +1. 仔细分析新闻标题的内容和主题 +2. 只从上述10个类别中选择最匹配的一个 +3. 返回格式只需返回对应的英文类别名称 +4. 如果确实无法确定类别,选择最接近的类别 + +示例输入输出: +输入:"体验2D巅峰 倚天屠龙记十大创新概览" +输出:"悦儿" + +输入:"同步A股首秀:港股缩量回调" +输出:"stocks" + +输入:"金科西府 名墅天成" +输出:"realty" + +现在请对以下新闻标题进行分类: +""" + + +def get_deepseek_res(prompt): + # 创建客户端 + client = OpenAI(api_key="sk-0797e0871d044ca5a9baf9d30216cd1a", base_url=os.getenv("BASE_URL")) + # 创建会话 + response = client.chat.completions.create( + # 模型deepseek-chat是deepseek-v3 + # 模型deepseek-reasoner是deepseek-r1 + model="deepseek-chat", + messages=[ + {"role": "system", "content": SYSTEM_PROMPT}, + {"role": "user", "content": prompt}, + ], + stream=False + ) + # 返回结果 + # return response.choices[0].message.content + return response + + +if __name__ == '__main__': + prompt = "倚天屠龙记" + res = get_deepseek_res(prompt) + print(res.choices[0].message.content) \ No newline at end of file diff --git a/05-LLM/03_api_deepseek_v3.py b/05-LLM/03_api_deepseek_v3.py new file mode 100644 index 0000000..8a330d7 --- /dev/null +++ b/05-LLM/03_api_deepseek_v3.py @@ -0,0 +1,112 @@ +# 先安装: pip install openai +import os +import dotenv +from sklearn.metrics import accuracy_score +from tenacity import retry, stop_after_attempt, wait_fixed +import pandas as pd +import json +from langchain_openai import ChatOpenAI + + +dotenv.load_dotenv() + +# 获取环境变量 +BASE_URL = os.getenv("BASE_URL") +DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") +DEV2FILE = os.getenv("DEV2FILE") +CLASS_FILE = os.getenv("CLASS_FILE") + + +# 提前定义提示词 +SYSTEM_PROMPT = """ +你是一个专门用于中文新闻标题分类的助手,能够将给定的新闻标题准确地分类到以下十个预定义的类别之一: +finance(财经)、realty(房产)、stocks(股市)、education(教育)、science(科技)、society(社会)、politics(政治)、sports(体育)、game(游戏)和entertainment(娱乐)。 +请根据标题内容和以下关键词与示例,匹配最相关的类别。如果标题涉及教育机构但核心是社会贡献,优先归为 society。 +返回 JSON 格式:{"category": "类别", "reason": "分类原因"} + +例如: +- 输入:“同步A股首秀:港股缩量回调”,应返回{"category": "stocks", "reason": "股市"} +- 输入:“布拉特:放球员一条生路吧 FIFA能消化俱乐部的攻击”,应返回“sports”。{"category": "sports", "reason": "体育"} + +请注意,只从上述提供的十个类别中选择一个最合适的进行返回。如果标题与多个类别相关,请选择最相关的一个。请直接返回类别名称,无需额外解释!!! +""" + +# 加载配置和类别映射 +id2name = {i: line.strip() for i, line in enumerate(open(CLASS_FILE, encoding="utf-8"))} +# name2id{标签:索引} +name2id = {v: k for k, v in id2name.items()} + +# 创建 LLM 对象 +llm = ChatOpenAI( + base_url=BASE_URL, + api_key=DEEPSEEK_API_KEY, + model="deepseek-chat", + model_kwargs={"response_format": {"type": "json_object"}} +) + + +# 定义带重试机制的 LLM 调用函数 +@retry(stop=stop_after_attempt(3), wait=wait_fixed(2)) +def invoke_llm(prompt): + """调用 LLM + # stop_after_attempt:若失败则重试最多3次 + # wait_fixed:每次间隔2秒""" + return llm.invoke(prompt) + + +# 调用模型进行新闻标题分类获取响应 +def get_deepseek_res(title: str) -> dict: + """将新闻标题分类到指定类别,返回分类结果""" + # 定义提示词,包含类别说明和示例 + prompt = [ + {"role": "system", "content": SYSTEM_PROMPT}, + {"role": "user", "content": f"新闻标题:'{title}',请分类并说明原因。"} + ] + # print(prompt) # [{"role":'system',"content":提示词},{"role":'user',"content":''体验2D巅峰 倚天屠龙记十大创新概览''}] + + # 调用 LLM 获取分类结果 + response = invoke_llm(prompt) + result = json.loads(response.content) + + # 返回分类结果,包含类别和原因 + return { + "category": result.get("category", "society"), # 默认 社会society + "reason": result.get("reason", "未明确分类,归为社会类别") + } + + +# 分类并进行评估 +def evaluate_classification(): + """对新闻标题分类进行评估""" + # 读取 tab 分隔的新闻标题和标签数据 + df = pd.read_csv(DEV2FILE, sep='\t', header=None, names=['title', 'label'], encoding='utf-8') + # 拆包 + titles = df['title'].tolist() + labels = df['label'].tolist() + print("titles-->", titles) + print("labels-->", labels) + # 如果多的话,只测试前 2 个 + # titles = titles[:2] + # labels = labels[:2] + # 定义列表用于存储预测结果 + pred_labels = [] + # 遍历所有的标题,依次调用get_deepseek_res + for title in titles: + # 调用大模型获取结果 + category_dict = get_deepseek_res(title) + print('category_dict-->', category_dict) # {'category': 'game', 'reason': '游戏'}...{'category': 'society', 'reason': '社会'} + # 获取预测类别,如果没有默认设置,则默认为 society社会 + pred_category = category_dict.get("category", "society") + print('pred_category-->', pred_category) # game...society + # 添加到预测结果列表中 注意: name2id格式{标签:索引} + pred_labels.append(name2id[pred_category]) + # 最终打印或者返回预测结果 + print('pred_labels-->', pred_labels) # [8,5] + # 准确率 + print('accuracy_score-->', accuracy_score(pred_labels, labels)) + + +# 测试 +if __name__ == '__main__': + # 测试评估 + evaluate_classification() diff --git a/05-LLM/04_ollama_api_qwen.py b/05-LLM/04_ollama_api_qwen.py new file mode 100644 index 0000000..23455fb --- /dev/null +++ b/05-LLM/04_ollama_api_qwen.py @@ -0,0 +1,87 @@ +import ollama +import requests + +# Python中使用ollama API的方式 + + +# 使用Python直接调用ollama:方式一 +def dm01(): + """ + 如果是访问本地服务器直接使用ollama即可 + 如果是访问远程服务器,则需要使用ollama.Client创建一个新的对象并指定主机地址: new_ollama = ollama.Client(url) + """ + # 获取用户要问的问题 + pro = '给我讲一个笑话' + + # 访问本地服务器,获取响应 + res = ollama.chat( + model="qwen2.5:0.5b", + messages=[{"role": "user", "content": pro}] + ) + print('res-->', res) # 整个对象 + # 只获取响应内容的两种方式 + print(res.message.content) + # print(res['message']['content']) + + +# 使用Python直接调用ollama:方式二 +def dm02(): + from ollama import Client + client = Client(host='http://127.0.0.1:11434') + response = client.chat(model='qwen2.5:0.5b', messages=[ + { + 'role': 'user', + 'content': '为什么天空是蓝⾊的?', + }, + ]) + print(response['message']['content']) + + +# 使用Python直接调用ollama:方式三 +def dm03(): + stream = ollama.chat( + model='qwen2.5:0.5b', + messages=[{'role': 'user', 'content': '讲一个不少于200字的笑话'}], + stream=True, + ) + # print("stream-->", stream) # 只是个对象 + for chunk in stream: + # print("chunk-->", chunk) + print(chunk['message']['content'], end='', flush=True) + + +# 使用requests库调用ollama +def dm04(): + headers = {"Content-Type": "application/json"} + data = { + "model": "deepseek-r1:1.5b", # 模型选择 + "options": { + "temperature": 0. # 为0表示不让模型⾃由发挥,输出结果相对较固定,> 0的话,输出的结果会⽐较放⻜⾃我 + }, + "stream": False, # 流式输出 + "messages": [{ + "role": "system", + "content": "你是谁?" + }] # 对话列表 + } + response = requests.post(url='http://127.0.0.1:11434/api/chat', json=data, headers=headers, timeout=60) + print(response.json()['message']['content']) + + +# 使用langchain框架调用ollama +def dm05(): + from langchain_community.llms import Ollama + # 如果⾃⼰本地系统有ollama服务,可以省略base_url + # temperature:控制生成文本随机性的重要参数,取值越小(接近0,模型输出结果越确定,越大,模型输出结果越开放) + llm = Ollama(base_url="http://127.0.0.1:11434", + model="deepseek-r1:1.5b", temperature=0) + res = llm.invoke("给我讲一个笑话") + print(res) + + +if __name__ == '__main__': + # dm01() + # dm02() + # dm03() + # dm04() + dm05() \ No newline at end of file diff --git a/05-LLM/class.txt b/05-LLM/class.txt new file mode 100644 index 0000000..73c5937 --- /dev/null +++ b/05-LLM/class.txt @@ -0,0 +1,10 @@ +finance +realty +stocks +education +science +society +politics +sports +game +entertainment diff --git a/05-LLM/test2.txt b/05-LLM/test2.txt new file mode 100644 index 0000000..59fad1f --- /dev/null +++ b/05-LLM/test2.txt @@ -0,0 +1,5 @@ +百宝箱:澳洲留学专有名词大汇总(图) 3 +土耳其总理决定取消访问瑞典 6 +同步A股首秀:港股缩量回调 2 +广东横扫东莞连续七年进决赛 27连胜刷新14年纪录 7 +天弘永定基金今起发行 0 \ No newline at end of file diff --git a/05-LLM/大模型生成提示词.txt b/05-LLM/大模型生成提示词.txt new file mode 100644 index 0000000..2a2ec14 --- /dev/null +++ b/05-LLM/大模型生成提示词.txt @@ -0,0 +1,26 @@ +我要做中文新闻文本分类的任务,大概数据如下: + +体验2D巅峰 倚天屠龙记十大创新概览 8 +60年铁树开花形状似玉米芯(组图) 5 +同步A股首秀:港股缩量回调 2 +中青宝sg现场抓拍 兔子舞热辣表演 8 +锌价难续去年辉煌 0 +2岁男童爬窗台不慎7楼坠下获救(图) 5 +布拉特:放球员一条生路吧 FIFA能消化俱乐部的攻击 7 +金科西府 名墅天成 1 + +最终要求对应的类别如下所示: +finance +realty +stocks +education +science +society +politics +sports +game +entertainment + + +请帮我写一下system的content提示词,实现输入新闻标题,返回新闻类别,注意:只能是上述的10个类别,谢谢! +