如何使用Python + LangChain为我的HR系统构建一个AI Agent
·
一、引言:为什么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提供服务
实际部署建议:
-
先从非核心业务开始试点(如政策咨询)
-
逐步增加功能复杂度和系统集成
-
建立人工审核和干预机制
-
定期更新知识和优化模型
这个AI Agent可以显著提升HR部门的效率,让HR专业人员从重复性工作中解放出来,专注于更有价值的战略工作。
更多推荐


所有评论(0)