first commit

This commit is contained in:
2026-02-26 16:49:19 +08:00
commit 4ead2c1f9f
8 changed files with 360 additions and 0 deletions

4
05-LLM/.env Normal file
View File

@@ -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

View File

@@ -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巅峰 倚天屠龙记十大创新概览")

View File

@@ -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)

View File

@@ -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()

View File

@@ -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()

10
05-LLM/class.txt Normal file
View File

@@ -0,0 +1,10 @@
finance
realty
stocks
education
science
society
politics
sports
game
entertainment

5
05-LLM/test2.txt Normal file
View File

@@ -0,0 +1,5 @@
百宝箱:澳洲留学专有名词大汇总(图) 3
土耳其总理决定取消访问瑞典 6
同步A股首秀港股缩量回调 2
广东横扫东莞连续七年进决赛 27连胜刷新14年纪录 7
天弘永定基金今起发行 0

View File

@@ -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个类别谢谢