本指南将指导你使用开源工具,构建一个可量化、可迭代的档案制度建设个性化培训系统。该系统能自动分析员工档案知识短板,生成并推送定制化学习内容,全程无需人工干预。
系统由数据层、分析层、生成层和推送层构成。我们使用以下完全免费且开源的组件:
在Ubuntu 22.04 LTS服务器上执行以下命令,完成基础环境搭建。
打开终端,依次执行:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
切换到PostgreSQL,创建专用数据库和用户:
sudo -u postgres psql
CREATE DATABASE archive_training;
CREATE USER training_admin WITH PASSWORD 'YourSecurePassword123!';
GRANT ALL PRIVILEGES ON DATABASE archive_training TO training_admin;
\q
创建项目目录并安装Python依赖:
mkdir ~/archive_training_system && cd ~/archive_training_system
python3 -m venv venv
source venv/bin/activate
pip install langchain==0.1.0 langchain-community==0.0.10 sentence-transformers==2.2.2 psycopg2-binary==2.9.9 pandas==2.0.3
pip install apache-airflow==2.7.1 --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.1/constraints-3.8.txt"
此步骤将制度文档转化为可被AI理解的向量,用于后续的相似度匹配和缺口分析。
创建名为init_db.py的文件,写入以下完整SQL建表语句:
import psycopg2
conn = psycopg2.connect(
dbname="archive_training",
user="training_admin",
password="YourSecurePassword123!",
host="localhost"
)
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS archive_documents (
id SERIAL PRIMARY KEY,
doc_name VARCHAR(255) NOT NULL,
doc_type VARCHAR(50) CHECK (doc_type IN ('policy', 'procedure', 'standard', 'form')),
content_text TEXT NOT NULL,
embedding vector(384),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS employee_knowledge_gap (
id SERIAL PRIMARY KEY,
employee_id VARCHAR(50) NOT NULL,
gap_topic VARCHAR(200) NOT NULL,
gap_source_doc_id INT REFERENCES archive_documents(id),
confidence_score FLOAT,
detected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS training_materials (
id SERIAL PRIMARY KEY,
gap_id INT REFERENCES employee_knowledge_gap(id),
generated_content TEXT NOT NULL,
content_type VARCHAR(20) CHECK (content_type IN ('text_summary', 'qa_pairs', 'scenario')),
delivery_status VARCHAR(20) DEFAULT 'pending'
);
""")
conn.commit()
cur.close()
conn.close()
print("Database tables created successfully.")
运行该脚本:python init_db.py。
创建embed_documents.py文件,将所有制度文档(假设为PDF或TXT格式,存放在./docs/目录下)进行向量化处理:
from sentence_transformers import SentenceTransformer
import psycopg2
from psycopg2.extras import execute_values
import os
model = SentenceTransformer('all-MiniLM-L6-v2')
conn = psycopg2.connect(dbname="archive_training", user="training_admin", password="YourSecurePassword123!", host="localhost")
cur = conn.cursor()
docs_path = './docs/'
for filename in os.listdir(docs_path):
if filename.endswith('.txt'):
with open(os.path.join(docs_path, filename), 'r', encoding='utf-8') as f:
content = f.read()
embedding = model.encode(content).tolist()
cur.execute(
"INSERT INTO archive_documents (doc_name, doc_type, content_text, embedding) VALUES (%s, %s, %s, %s)",
(filename, 'procedure', content, embedding)
)
conn.commit()
cur.close()
conn.close()
print("Document embedding completed.")
执行前确保:./docs/目录已存在并包含你的制度文件,例如人事档案管理办法.txt。

在终端执行以下命令安装Ollama并拉取模型:
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3:8b
ollama serve &
创建generate_training.py,该脚本会查询知识缺口,并调用本地模型生成针对性学习材料:
import psycopg2
import requests
import json
def generate_with_ollama(prompt):
url = "http://localhost:11434/api/generate"
payload = {
"model": "llama3:8b",
"prompt": prompt,
"stream": False
}
response = requests.post(url, json=payload)
return response.json()['response']
conn = psycopg2.connect(dbname="archive_training", user="training_admin", password="YourSecurePassword123!", host="localhost")
cur = conn.cursor()
cur.execute("SELECT FROM employee_knowledge_gap WHERE id NOT IN (SELECT gap_id FROM training_materials) LIMIT 1;")
gap_record = cur.fetchone()
if gap_record:
gap_id, employee_id, gap_topic, doc_id, confidence = gap_record
prompt = f"""基于以下档案制度知识缺口,为员工{employee_id}生成一份简短(不超过300字)的实操指南。
知识缺口主题:{gap_topic}
要求:1. 直接给出3个具体操作步骤;2. 指出一个最常见的错误操作;3. 用一句话总结核心要点。"""
training_content = generate_with_ollama(prompt)
cur.execute(
"INSERT INTO training_materials (gap_id, generated_content, content_type) VALUES (%s, %s, 'text_summary')",
(gap_id, training_content)
)
conn.commit()
cur.close()
conn.close()
关键点:此脚本每次处理一个未生成材料的缺口,生成后自动标记,避免重复。
设置Airflow的家目录并启动:
export AIRFLOW_HOME=~/airflow
airflow db init
airflow users create --username admin --firstname Admin --lastname User --role Admin --email admin@example.com --password admin123
airflow webserver --port 8080 -D
airflow scheduler -D
访问http://你的服务器IP:8080,使用上述账号密码登录。
在~/airflow/dags/目录下创建archive_training_dag.py:
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.operators.email import EmailOperator
import sys
sys.path.insert(0, '/home/你的用户名/archive_training_system')
from generate_training import conn, cur
default_args = {
'owner': 'archive_team',
'depends_on_past': False,
'start_date': datetime(2024, 1, 1),
'email_on_failure': True,
'email': ['admin@yourcompany.com'],
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
def detect_knowledge_gap():
模拟检测逻辑:这里假设通过查询员工最近操作日志的错题来识别缺口
实际应接入你的业务系统API或日志数据库
mock_gap_data = ('EMP1001', '档案借阅审批流程', 5) (员工ID, 缺口主题, 相关文档ID)
cur.execute(
"INSERT INTO employee_knowledge_gap (employee_id, gap_topic, gap_source_doc_id) VALUES (%s, %s, %s)",
mock_gap_data
)
conn.commit()
print(f"Detected gap for {mock_gap_data[0]}")
def generate_content():
直接导入并调用generate_training.py的主逻辑
import generate_training
print("Training content generation triggered.")
with DAG(
'daily_archive_training',
default_args=default_args,
description='Daily personalized training pipeline',
schedule_interval='0 9 1-5', 工作日早上9点运行
catchup=False,
) as dag:
t1 = PythonOperator(
task_id='detect_knowledge_gaps',
python_callable=detect_knowledge_gap,
)
t2 = PythonOperator(
task_id='generate_training_materials',
python_callable=generate_content,
)
t3 = EmailOperator(
task_id='send_notification',
to='{{ var.value.training_manager_email }}', 在Airflow UI的Variables中设置
subject='今日个性化培训材料已生成',
html_content="""今日档案制度个性化培训材料已生成,请登录系统查看。
"""
)
t1 >> t2 >> t3
配置Airflow变量:在Web UI的Admin -> Variables中,添加Key为training_manager_email,Value为实际管理员的邮箱。
在Airflow Web UI中找到daily_archive_training DAG,点击Trigger DAG手动运行一次。观察任务日志,确保无报错。
连接到PostgreSQL数据库,验证数据流:
SELECT e.employee_id, e.gap_topic, t.generated_content
FROM employee_knowledge_gap e
JOIN training_materials t ON e.id = t.gap_id
WHERE t.delivery_status = 'pending';
安装Metabase并连接PostgreSQL数据库,创建看板监控以下核心指标:
至此,一个全自动的档案制度建设个性化培训系统已部署完成。系统将按计划每日运行,自动完成“缺口检测-内容生成-通知”的闭环。所有组件均运行在你的内部服务器,保障数据安全。后续迭代只需更新docs/目录下的制度文件,并优化生成提示词(prompt)即可。