一、引言:为什么HR系统需要AI Agent?

在现代企业中,HR部门每天都要处理大量重复性咨询:员工请假流程、薪资查询、福利政策、入职手续等。传统的方式需要HR人员花费大量时间回答类似问题,效率低下且易出错。

通过构建一个AI Agent,我们可以实现:

  • 7x24小时自动处理员工常见咨询

  • 智能检索HR知识库,提供准确政策解读

  • 自动化处理简单HR流程(如请假申请)

  • 与现有HR系统无缝集成


二、技术栈准备

# requirements.txt
langchain==0.1.0
langchain-community==0.0.10
openai==1.6.0
chromadb==0.4.22
fastapi==0.104.0
uvicorn==0.24.0
pydantic==2.5.0
python-dotenv==1.0.0

三、构建步骤详解

步骤1:设计HR智能助理的功能架构

HR-AI-Agent
├── 自然语言理解模块
├── 知识库检索模块
├── 工作流执行模块
├── 外部系统集成模块
└── 对话管理模块

步骤2:创建HR知识库向量存储

# hr_knowledge_base.py
import os
from langchain_community.document_loaders import TextLoader, DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.docstore.document import Document

class HRKnowledgeBase:
    def __init__(self, persist_directory="./hr_chroma_db"):
        self.embeddings = OpenAIEmbeddings(
            model="text-embedding-3-small",
            openai_api_key=os.getenv("OPENAI_API_KEY")
        )
        self.persist_directory = persist_directory
        self.vectorstore = None
        
    def load_hr_documents(self, docs_directory):
        """加载HR政策文档"""
        loader = DirectoryLoader(
            docs_directory,
            glob="**/*.txt",
            loader_cls=TextLoader,
            show_progress=True
        )
        documents = loader.load()
        
        # 文档分割
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=1000,
            chunk_overlap=200,
            separators=["\n\n", "\n", "。", "!", "?", ";"]
        )
        splits = text_splitter.split_documents(documents)
        
        # 创建向量存储
        self.vectorstore = Chroma.from_documents(
            documents=splits,
            embedding=self.embeddings,
            persist_directory=self.persist_directory
        )
        self.vectorstore.persist()
        print(f"已加载 {len(splits)} 个文档片段到知识库")
        return self.vectorstore
    
    def query_knowledge(self, question, k=3):
        """查询相关知识"""
        if not self.vectorstore:
            raise ValueError("请先加载知识库文档")
        
        docs = self.vectorstore.similarity_search(question, k=k)
        context = "\n\n".join([doc.page_content for doc in docs])
        return context

步骤3:构建HR智能体核心逻辑

# hr_agent.py
from typing import Dict, Any, List, Optional
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.tools import BaseTool, StructuredTool
from langchain.memory import ConversationBufferMemory
from langchain_core.messages import AIMessage, HumanMessage
from pydantic import BaseModel, Field
import json
import datetime

# 定义工具输入模型
class LeaveRequestInput(BaseModel):
    employee_id: str = Field(description="员工工号")
    leave_type: str = Field(description="请假类型:年假、病假、事假、调休")
    start_date: str = Field(description="开始日期,格式:YYYY-MM-DD")
    end_date: str = Field(description="结束日期,格式:YYYY-MM-DD")
    reason: Optional[str] = Field(description="请假原因")

class SalaryQueryInput(BaseModel):
    employee_id: str = Field(description="员工工号")
    month: str = Field(description="查询月份,格式:YYYY-MM")

class HRAgent:
    def __init__(self, knowledge_base: HRKnowledgeBase):
        # 初始化大语言模型
        self.llm = ChatOpenAI(
            model="gpt-4-turbo-preview",
            temperature=0.1,
            openai_api_key=os.getenv("OPENAI_API_KEY")
        )
        
        self.knowledge_base = knowledge_base
        self.tools = self._initialize_tools()
        self.memory = ConversationBufferMemory(
            memory_key="chat_history",
            return_messages=True
        )
        
        # 创建智能体
        self.agent = self._create_agent()
    
    def _initialize_tools(self) -> List[BaseTool]:
        """初始化工具集"""
        
        def query_hr_policy(question: str) -> str:
            """查询HR政策知识库"""
            context = self.knowledge_base.query_knowledge(question)
            return f"根据HR政策文档,相关信息如下:\n\n{context}"
        
        def submit_leave_request(
            employee_id: str,
            leave_type: str,
            start_date: str,
            end_date: str,
            reason: Optional[str] = None
        ) -> str:
            """提交请假申请"""
            # 这里应该连接到实际的HR系统API
            try:
                # 模拟请假申请逻辑
                leave_days = self._calculate_leave_days(start_date, end_date)
                return f"✅ 请假申请已提交成功!\n员工:{employee_id}\n类型:{leave_type}\n时间:{start_date} 至 {end_date}\n天数:{leave_days}天\n状态:待审批"
            except Exception as e:
                return f"❌ 提交失败:{str(e)}"
        
        def get_salary_info(employee_id: str, month: str) -> str:
            """查询薪资信息(模拟)"""
            # 实际应用中应连接薪资系统
            salary_data = {
                "employee_id": employee_id,
                "month": month,
                "base_salary": 15000.00,
                "bonus": 3000.00,
                "deductions": 1800.00,
                "net_salary": 16200.00,
                "currency": "CNY"
            }
            return json.dumps(salary_data, ensure_ascii=False, indent=2)
        
        def get_employee_info(employee_id: str) -> str:
            """查询员工基本信息"""
            # 模拟员工数据
            employees = {
                "E001": {"name": "张三", "department": "技术部", "position": "高级工程师"},
                "E002": {"name": "李四", "department": "人事部", "position": "HR专员"},
                "E003": {"name": "王五", "department": "市场部", "position": "市场经理"}
            }
            if employee_id in employees:
                return json.dumps(employees[employee_id], ensure_ascii=False)
            return f"未找到员工 {employee_id} 的信息"
        
        # 创建工具
        tools = [
            StructuredTool.from_function(
                func=query_hr_policy,
                name="query_hr_policy",
                description="查询HR政策知识库,包括考勤、休假、福利、报销等政策"
            ),
            StructuredTool.from_function(
                func=submit_leave_request,
                name="submit_leave_request",
                description="提交请假申请",
                args_schema=LeaveRequestInput
            ),
            StructuredTool.from_function(
                func=get_salary_info,
                name="get_salary_info",
                description="查询指定月份的薪资明细",
                args_schema=SalaryQueryInput
            ),
            StructuredTool.from_function(
                func=get_employee_info,
                name="get_employee_info",
                description="查询员工基本信息"
            )
        ]
        
        return tools
    
    def _create_agent(self) -> AgentExecutor:
        """创建智能体执行器"""
        
        # 系统提示词
        system_prompt = """你是一个专业的HR智能助理,帮助员工解答HR相关问题并处理HR流程。

        你的能力包括:
        1. 回答HR政策相关问题(考勤、休假、福利、报销等)
        2. 处理请假申请
        3. 查询薪资信息(需要员工工号)
        4. 查询员工基本信息
        
        请遵守以下原则:
        1. 对于薪资等敏感信息,必须验证员工身份
        2. 如果问题超出HR范畴,请礼貌拒绝
        3. 回答要专业、准确、友好
        4. 如果信息不确定,请明确说明
        
        当前日期:{current_date}"""
        
        prompt = ChatPromptTemplate.from_messages([
            ("system", system_prompt),
            MessagesPlaceholder(variable_name="chat_history"),
            ("human", "{input}"),
            MessagesPlaceholder(variable_name="agent_scratchpad")
        ])
        
        # 创建智能体
        agent = create_openai_tools_agent(
            llm=self.llm,
            tools=self.tools,
            prompt=prompt
        )
        
        return AgentExecutor(
            agent=agent,
            tools=self.tools,
            memory=self.memory,
            verbose=True,
            handle_parsing_errors=True,
            max_iterations=3
        )
    
    def _calculate_leave_days(self, start_date: str, end_date: str) -> int:
        """计算请假天数(简化版)"""
        from datetime import datetime
        start = datetime.strptime(start_date, "%Y-%m-%d")
        end = datetime.strptime(end_date, "%Y-%m-%d")
        return (end - start).days + 1
    
    def process_query(self, query: str, employee_context: Optional[Dict] = None) -> str:
        """处理用户查询"""
        current_date = datetime.datetime.now().strftime("%Y-%m-%d")
        
        # 添加上下文信息
        if employee_context:
            context_str = f"\n当前用户信息:{json.dumps(employee_context, ensure_ascii=False)}"
            query_with_context = f"{context_str}\n\n员工询问:{query}"
        else:
            query_with_context = query
        
        try:
            result = self.agent.invoke({
                "input": query_with_context,
                "current_date": current_date
            })
            return result["output"]
        except Exception as e:
            return f"抱歉,处理您的请求时出现错误:{str(e)}"

步骤4:创建Web API接口

# app.py
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import Optional
import uvicorn
import os
from dotenv import load_dotenv

load_dotenv()

app = FastAPI(title="HR AI Assistant API", version="1.0.0")

# 配置CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 请求模型
class ChatRequest(BaseModel):
    message: str
    employee_id: Optional[str] = None
    session_id: Optional[str] = None

class ChatResponse(BaseModel):
    response: str
    session_id: str
    timestamp: str

# 全局变量
hr_knowledge_base = None
hr_agent = None

@app.on_event("startup")
async def startup_event():
    """服务启动时初始化"""
    global hr_knowledge_base, hr_agent
    
    # 初始化知识库
    hr_knowledge_base = HRKnowledgeBase()
    
    # 如果存在文档目录,则加载文档
    if os.path.exists("./hr_docs"):
        hr_knowledge_base.load_hr_documents("./hr_docs")
    
    # 初始化智能体
    hr_agent = HRAgent(hr_knowledge_base)
    print("HR AI Agent 初始化完成!")

@app.post("/chat", response_model=ChatResponse)
async def chat_with_hr_agent(request: ChatRequest):
    """与HR智能助理对话"""
    if hr_agent is None:
        raise HTTPException(status_code=503, detail="服务正在初始化,请稍后重试")
    
    # 获取员工上下文(模拟)
    employee_context = None
    if request.employee_id:
        employee_context = {
            "employee_id": request.employee_id,
            "name": f"员工{request.employee_id}",
            "department": "技术部"
        }
    
    # 处理查询
    response = hr_agent.process_query(
        query=request.message,
        employee_context=employee_context
    )
    
    return ChatResponse(
        response=response,
        session_id=request.session_id or "default_session",
        timestamp=datetime.datetime.now().isoformat()
    )

@app.get("/health")
async def health_check():
    """健康检查"""
    return {"status": "healthy", "service": "HR AI Assistant"}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

步骤5:准备HR知识库文档

创建 hr_docs目录,添加HR政策文档:

# 请假政策.txt
1. 年假:入职满一年后享受10天年假,逐年增加1天,最高15天
2. 病假:需提供医院证明,每年最多15天带薪病假
3. 事假:提前3个工作日申请,审批通过后方可休假
4. 请假流程:在HR系统中提交申请 → 直属领导审批 → HR备案

# 考勤制度.txt
1. 工作时间:周一至周五 9:00-18:00,午休12:00-13:00
2. 迟到早退:月累计超过3次将影响全勤奖
3. 加班:需提前申请,加班可兑换调休或加班费
4. 远程办公:每周最多申请2天远程办公,需提前报备

# 福利政策.txt
1. 五险一金:按实际工资基数缴纳
2. 年度体检:每年一次免费全面体检
3. 节日福利:春节、中秋等传统节日发放礼品或礼金
4. 培训发展:每年5000元培训基金,用于技能提升

四、部署与测试

1. 环境配置

# 安装依赖
pip install -r requirements.txt

# 设置OpenAI API密钥
export OPENAI_API_KEY="your-api-key-here"
# 或在 .env 文件中配置

2. 启动服务

python app.py

3. 测试智能体

# test_agent.py
import requests
import json

# 测试查询
test_cases = [
    {"message": "请问年假有多少天?", "employee_id": "E001"},
    {"message": "我想申请3月20日到3月22日的年假", "employee_id": "E001"},
    {"message": "查询我2月份的工资明细", "employee_id": "E001"},
    {"message": "病假需要什么手续?", "employee_id": "E002"}
]

for test in test_cases:
    response = requests.post(
        "http://localhost:8000/chat",
        json=test
    )
    result = response.json()
    print(f"问题:{test['message']}")
    print(f"回答:{result['response']}")
    print("-" * 50)

五、扩展功能建议

1. 集成现有HR系统

# 实际应用中应该集成
# 1. 单点登录(SSO)认证
# 2. 连接HR数据库
# 3. 调用现有HR系统API
# 4. 消息推送(企业微信/钉钉集成)

2. 多轮对话优化

  • 添加对话状态管理

  • 支持上下文记忆

  • 实现意图识别和槽位填充

3. 安全增强

# 增加安全措施
# 1. API请求限流
# 2. 敏感信息过滤
# 3. 操作日志审计
# 4. 数据访问权限控制

4. 监控与优化

  • 收集用户反馈

  • 分析常见问题

  • 持续更新知识库

  • 优化提示词工程

六、总结

通过本文的步骤,你已成功构建了一个基本的HR AI Agent,它可以:

回答HR政策咨询​ - 基于向量知识库提供准确信息

处理请假申请​ - 自动化简单工作流

查询薪资信息​ - 安全获取个人数据

7x24小时服务​ - 通过Web API提供服务

实际部署建议

  1. 先从非核心业务开始试点(如政策咨询)

  2. 逐步增加功能复杂度和系统集成

  3. 建立人工审核和干预机制

  4. 定期更新知识和优化模型

这个AI Agent可以显著提升HR部门的效率,让HR专业人员从重复性工作中解放出来,专注于更有价值的战略工作。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐