1.项目简介
本案例 ,通过skill赋予大模型摘要生成能力
2.skill目录结构

3.项目实践
.env
# .env
OLLAMA_MODEL=deepseek-r1:latest
OLLAMA_HOST=http://127.0.0.1:11434
OUTPUT_DIR=./output
注释:本地运行ollama服务,查询效果如下

main.py
# -*- coding:utf-8 -*-
import os
import sys
from dotenv import load_dotenv
from skill_loader import SkillLoader
load_dotenv()
def main():
print("=== 本地大模型 Skill 系统启动 ===")
print(f"当前模型: {os.getenv('OLLAMA_MODEL')}")
print(f"显存状态: 检测到 NVIDIA RTX 4090 D (假设环境正常)")
print("-" * 30)
# 初始化加载器
loader = SkillLoader()
loader.discover_skills()
if "text_summary" not in loader.available_skills:
print("错误:未找到 text_summary 技能,请检查目录结构。")
return
# 加载技能
try:
summary_module = loader.load_skill("text_summary")
print("\\n>>> 执行 text_summary 技能 (测试模式)…")
if hasattr(summary_module, "run"):
# 你可以替换这里的文本为实际想要摘要的长文本
long_text = """
(此处可以粘贴任何长文章,新闻,报告等)
随着 2026 年技术的进步,本地 AI 已成为主流。RTX 4090 D 凭借其强大的 24GB 显存,
能够轻松承载 DeepSeek-R1 等先进模型。这不仅降低了企业成本,更保障了数据安全。
在未来的办公场景中,本地摘要、本地翻译、本地代码审计将成为标配。
用户不再需要将敏感文档上传至公有云,一切计算均在本地完成。
这种范式转变正在重塑软件开发的格局,开发者需要更多地考虑本地资源的调度与优化。
"""
summary_module.run(long_text, style="detailed")
else:
print("错误:技能脚本中未找到 'run' 函数。")
except Exception as e:
print(f"执行出错: {e}")
if __name__ == "__main__":
main()
skill_loader.py
import os
import importlib.util
class SkillLoader:
def __init__(self, skills_dir="skills"):
self.skills_dir = skills_dir
self.available_skills = {}
def discover_skills(self):
if not os.path.exists(self.skills_dir):
print("未找到 skills 目录")
return
for skill_name in os.listdir(self.skills_dir):
skill_path = os.path.join(self.skills_dir, skill_name)
script_path = os.path.join(skill_path, "script.py")
if os.path.isdir(skill_path) and os.path.exists(script_path):
self.available_skills[skill_name] = script_path
print(f"[发现技能]: {skill_name}")
def load_skill(self, skill_name):
if skill_name not in self.available_skills:
raise ValueError(f"技能 '{skill_name}' 不存在")
script_path = self.available_skills[skill_name]
# 动态导入模块
spec = importlib.util.spec_from_file_location(f"skills.{skill_name}.script", script_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
skills/text_summary/script.py
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../')))
from tools import generate_completion, save_to_file
def run(text, style="concise"):
# 构建提示词
style_instructions = {
"concise": "请用简练的一句话概括核心内容。",
"bullet_points": "请提取关键信息,并以无序列表形式列出要点。",
"detailed": "请生成一份详细的摘要,保留主要论据和数据,篇幅约为原文的 20%。"
}
instruction = style_instructions.get(style, style_instructions["concise"])
system_prompt = "你是一个由 RTX 4090 驱动的高效 AI 助手,擅长快速阅读并提炼长文精华。"
user_prompt = f"""
任务:对以下文本进行摘要。
要求:{instruction}
原文内容:
{text}
"""
print(f"正在使用 {os.getenv('OLLAMA_MODEL')} 模型进行推理… (这可能需要几秒到几十秒)")
summary = generate_completion(user_prompt, system_prompt)
if "错误" in summary:
print(summary)
return None
filename = f"summary_{style}.txt"
saved_path = save_to_file(filename, summary, sub_dir="text_summary")
print("-" * 30)
print("【生成摘要】")
print(summary)
print("-" * 30)
print(f"结果已保存至: {saved_path}")
return summary
skills/text_summary/skill.md
# 技能名称:智能文本摘要 (Text Summary)
## 功能描述
利用本地部署的 DeepSeek-R1 大模型,对输入的长文本进行关键信息提取和摘要生成。
支持自定义摘要长度和风格(如:一句话总结、要点列表、详细摘要)。
## 输入参数
– `text`: 需要处理的原始文本字符串。
– `style`: 摘要风格 (可选: "concise", "bullet_points", "detailed"),默认为 "concise"。
## 输出
– 生成后的摘要文本。
– 自动保存至 `output/text_summary/` 目录下。
## 依赖模型
– deepseek-r1:latest (需本地 Ollama 运行中)
tools.py
# -*- coding:utf-8 -*-
import os
import requests
import json
from dotenv import load_dotenv
load_dotenv()
OLLAMA_HOST = os.getenv("OLLAMA_HOST", "http://127.0.0.1:11434")
MODEL_NAME = os.getenv("OLLAMA_MODEL", "deepseek-r1:latest")
def generate_completion(prompt, system_prompt="你是一个专业的文本摘要助手。"):
url = f"{OLLAMA_HOST}/api/generate"
payload = {
"model": MODEL_NAME,
"prompt": prompt,
"system": system_prompt,
"stream": False,
"options": {
"temperature": 0.3,
"num_predict": 1024,
}
}
try:
response = requests.post(url, json=payload, timeout=120)
response.raise_for_status()
result = response.json()
return result.get("response", "")
except requests.exceptions.ConnectionError:
return "错误:无法连接到 Ollama 服务。请确保 'ollama serve' 正在运行。"
except Exception as e:
return f"错误:{str(e)}"
def save_to_file(filename, content, sub_dir=""):
base_dir = os.getenv("OUTPUT_DIR", "./output")
if sub_dir:
full_path = os.path.join(base_dir, sub_dir)
os.makedirs(full_path, exist_ok=True)
file_path = os.path.join(full_path, filename)
else:
os.makedirs(base_dir, exist_ok=True)
file_path = os.path.join(base_dir, filename)
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
return file_path
运行效果





