first commit
This commit is contained in:
4
05-LLM/.env
Normal file
4
05-LLM/.env
Normal 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
|
||||
46
05-LLM/01_api_deepseek_v3.py
Normal file
46
05-LLM/01_api_deepseek_v3.py
Normal 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巅峰 倚天屠龙记十大创新概览")
|
||||
70
05-LLM/02_api_deepseek_v3_optimizer.py
Normal file
70
05-LLM/02_api_deepseek_v3_optimizer.py
Normal 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)
|
||||
112
05-LLM/03_api_deepseek_v3.py
Normal file
112
05-LLM/03_api_deepseek_v3.py
Normal 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()
|
||||
87
05-LLM/04_ollama_api_qwen.py
Normal file
87
05-LLM/04_ollama_api_qwen.py
Normal 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
10
05-LLM/class.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
finance
|
||||
realty
|
||||
stocks
|
||||
education
|
||||
science
|
||||
society
|
||||
politics
|
||||
sports
|
||||
game
|
||||
entertainment
|
||||
5
05-LLM/test2.txt
Normal file
5
05-LLM/test2.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
百宝箱:澳洲留学专有名词大汇总(图) 3
|
||||
土耳其总理决定取消访问瑞典 6
|
||||
同步A股首秀:港股缩量回调 2
|
||||
广东横扫东莞连续七年进决赛 27连胜刷新14年纪录 7
|
||||
天弘永定基金今起发行 0
|
||||
26
05-LLM/大模型生成提示词.txt
Normal file
26
05-LLM/大模型生成提示词.txt
Normal 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个类别,谢谢!
|
||||
|
||||
Reference in New Issue
Block a user