本文详细介绍了如何构建一个HR制度智能问答系统,主要涵盖整体流程图、架构图及核心代码解析。通过读取PDF和Word文档,提取文本内容,并利用向量数据库进行存储和检索。结合千问模型进行向量化处理,最终通过LLM模型生成准确回答。文章提供了完整的代码示例,包括文档读取、向量数据库操作和LLM接口调用,适合AI和HR领域开发者参考学习。


一、整体流程图及代码解析

二、整体架构图及核心代码解析流程图

三、核心代码

#RAG
实现公司
HR
制度智能问答系统
.py

#
需要

#pip install python-docx

#pip install pdfminer.six

from 
pdfminer.high_level 
import 
extract_pages

from 
pdfminer.layout 
import 
LTTextContainer

import 
chromadb

from 
chromadb.config 
import 
Settings

from 
docx 
import 
Document

from 
models 
import 
get_normal_client, Constants

client = get_normal_client()

# 
读取
PDF
文本内容的函数,供参考,本示例中没有用到

def 
extract_text_from_pdf
(filename, page_numbers=
None
, min_line_length=
1
):

'''
从
 PDF 
文件中(按指定页码)提取文字
'''

paragraphs = []

    buffer = 
''

full_text = 
''

# 
提取全部文本

for 
i, page_layout 
in 
enumerate
(extract_pages(filename)):

# 
如果指定了页码范围,跳过范围外的页

if 
page_numbers 
is not None and 
i 
not in 
page_numbers:

continue

        for 
element 
in 
page_layout:

if 
isinstance
(element, LTTextContainer):

                full_text += element.get_text() + 
'
\n
'

# 
按空行分隔,将文本重新组织成段落

lines = full_text.split(
'
\n
'
)

for 
text 
in 
lines:

if 
len
(text) >= min_line_length:

            buffer += (
' ' 
+ text) 
if not 
text.endswith(
'-'
) 
else 
text.strip(
'-'
)

elif 
buffer:

            paragraphs.append(buffer)

            buffer = 
''

if 
buffer:

        paragraphs.append(buffer)

return 
paragraphs

# 
读取
Word
文档

def 
extract_text_from_docx
(filename, min_line_length=
1
):

'''
从
 DOCX 
文件中提取文字
'''

paragraphs = []

    buffer = 
''

full_text = 
''

# 
打开并读取文档

doc = Document(filename)

# 
提取全部文本

for 
para 
in 
doc.paragraphs:

        full_text += para.text + 
'
\n
'

# 
按空行分隔,将文本重新组织成段落

lines = full_text.split(
'
\n
'
)

for 
line 
in 
lines:

# 
这里其实起到一个分块的作用,原文中的标题往往字数小于
10
个,

#
如果当前行的长度小于
10
,认为是标题,不加到
paragraphs
中进行后续处理

#
这里的分块是比较粗糙的

if 
len
(line) >= min_line_length:

            buffer += (
' ' 
+ line) 
if not 
line.endswith(
'-'
) 
else 
line.strip(
'-'
)

elif 
buffer:

            paragraphs.append(buffer)

            buffer = 
''

if 
buffer:

        paragraphs.append(buffer)

return 
paragraphs

# 
使用示例

docx_filename = 
"
人事管理流程
.docx"

# 
读取
Word
文件

paragraphs = extract_text_from_docx(docx_filename, 
min_line_length
=
10
)

# paragraphs = extract_text_from_pdf("
人事管理流程
.pdf", page_numbers=[

#                                    2, 3], min_line_length=10)

# 
向量数据库类

class 
MyVectorDBConnector:

def 
__init__
(
self
, collection_name, embedding_fn):

        chroma_client = chromadb.Client(Settings(
allow_reset
=
True
))

# 
为了演示,实际不需要每次
 reset()

        # chroma_client.reset()

        # 
创建一个
 collection

self
.collection = chroma_client.get_or_create_collection(
name
=collection_name)

self
.embedding_fn = embedding_fn

def 
add_documents
(
self
, documents):

'''
向
 collection 
中添加文档与向量
'''

batch_size = 
10

for 
i 
in 
range
(
0
, 
len
(documents), batch_size):

            batch_docs = documents[i:i + batch_size]

self
.collection.add(

embeddings
=
self
.embedding_fn(batch_docs),  
# 
每个文档的向量

documents
=batch_docs,  
# 
文档的原文

ids
=[
f"id
{
i
}
" 
for 
i 
in 
range
(i, i + 
len
(batch_docs))]  
# 
每个文档的
 id

)

def 
search
(
self
, query, top_n):

'''
检索向量数据库
'''

results = 
self
.collection.query(

query_embeddings
=
self
.embedding_fn([query]),

n_results
=top_n

        )

return 
results

# 
使用千问的模型进行向量化

def 
get_embeddings
(texts, model=Constants.EMBEDDING_MODEL.value):

    data = client.embeddings.create(
input
=texts, 
model
=model).data

return 
[x.embedding 
for 
x 
in 
data]

# 
创建一个向量数据库对象

vector_db = MyVectorDBConnector(
"demo"
, get_embeddings)

# 
向向量数据库中添加文档
1

vector_db.add_documents(paragraphs)

# llm
模型

def 
get_completion
(prompt, model=Constants.LLM_MODEL.value):

'''
封装
 openai 
接口
'''

messages = [{
"role"
: 
"user"
, 
"content"
: prompt}]

    response = client.chat.completions.create(

model
=model,

messages
=messages,

temperature
=
0
,  
# 
模型输出的随机性,
0 
表示随机性最小

)

return 
response.choices[
0
].message.content

prompt_template = 
"""

你是一个问答机器人。

你的任务是根据下述给定的已知信息回答用户问题。

确保你的回复完全依据下述已知信息。不要编造答案。

如果下述已知信息不足以回答用户的问题,请直接回复
"
我无法回答您的问题
"
。

已知信息
:

__INFO__

用户问:

__QUERY__

请用中文回答用户问题。

"""

# 
给
Prompt 
模板赋值

def 
build_prompt
(prompt_template, **kwargs):

'''
将
 Prompt 
模板赋值
'''

prompt = prompt_template

for 
k, v 
in 
kwargs.items():

if 
isinstance
(v, 
str
):

            val = v

elif 
isinstance
(v, 
list
) 
and 
all
(
isinstance
(elem, 
str
) 
for 
elem 
in 
v):

            val = 
'
\n
'
.join(v)

else
:

            val = 
str
(v)

# 
返回转换为大写的字符串副本

prompt = prompt.replace(
f"__
{
k.upper()
}
__"
, val)

return 
prompt

# 
定义
 chat 
函数

def 
rag_chat
(vector_db,llm_api,user_query,n_results=
2
):

# 1.
检索

search_results = vector_db.search(user_query, n_results)

print
(
"search_results:"
,search_results)

# 2.
构建提示词模板
build_prompt

prompt =  build_prompt(prompt_template,
info
=search_results[
'documents'
][
0
],
query
=user_query)

print
(
"prompt:"
, prompt)

# 3,
调用
LLM
模型方法生成回答

response=llm_api(prompt)

return 
response

user_query =  
'
视为不符合录用条件的情形有哪些?
'

response =  rag_chat(vector_db,get_completion,user_query)

print
(response)

最后唠两句

为什么AI大模型成为越来越多程序员转行就业、升职加薪的首选

很简单,这些岗位缺人且高薪

智联招聘的最新数据给出了最直观的印证:2025年2月,AI领域求职人数同比增幅突破200% ,远超其他行业平均水平;整个人工智能行业的求职增速达到33.4%,位居各行业榜首,其中人工智能工程师岗位的求职热度更是飙升69.6%。

AI产业的快速扩张,也让人才供需矛盾愈发突出。麦肯锡报告明确预测,到2030年中国AI专业人才需求将达600万人,人才缺口可能高达400万人,这一缺口不仅存在于核心技术领域,更蔓延至产业应用的各个环节。

那0基础普通人如何学习大模型 ?

深耕科技一线十二载,亲历技术浪潮变迁。我见证那些率先拥抱AI的同行,如何建立起效率与薪资的代际优势。如今,我将积累的大模型面试真题、独家资料、技术报告与实战路线系统整理,分享于此,为你扫清学习困惑,共赴AI时代新程。

我整理出这套 AI 大模型突围资料包【允许白嫖】:

  • ✅从入门到精通的全套视频教程
  • ✅AI大模型学习路线图(0基础到项目实战仅需90天)
  • ✅大模型书籍与技术文档PDF
  • ✅各大厂大模型面试题目详解
  • ✅640套AI大模型报告合集
  • ✅大模型入门实战训练

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

①从入门到精通的全套视频教程

包含提示词工程、RAG、Agent等技术点

② AI大模型学习路线图(0基础到项目实战仅需90天)

全过程AI大模型学习路线

③学习电子书籍和技术文档

市面上的大模型书籍确实太多了,这些是我精选出来的

④各大厂大模型面试题目详解

⑤640套AI大模型报告合集

⑥大模型入门实战训练

如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能 ‌突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

👉获取方式:
有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐