在企业级应用中,如何高效管理和检索海量文档知识(如员工手册、政策文件、岗位信息等)是一个常见需求。本文将介绍一个基于检索增强生成(RAG) 和大语言模型(LLM) 的后端系统,该系统通过FastAPI提供服务,结合向量数据库、文本分块、工具调用等技术,实现企业知识的智能检索与问答。
一、技术栈概览
本系统主要依赖以下技术组件:
编程语言:Python 3.8+
Web框架:FastAPI(提供RESTful API)
向量数据库:ChromaDB(存储文本向量,支持高效相似性检索)
RAG框架:LlamaIndex(文档处理、索引构建、查询引擎)
LLM/Embedding模型:阿里云Qwen系列(qwen-plus、qwen3.7-text-embedding)、DeepSeek(备选LLM)
缓存:Redis(缓存学历验证结果,提升性能)
文档处理:python-docx(解析Word文档)
ORM:Tortoise(异步数据库操作,查询岗位信息
二、核心功能模块详解
2.1 文档处理与文本分块
文档处理是RAG系统的基础,需将原始文档(如Word、TXT)转换为可向量化的文本片段。系统通过以下步骤实现:
文档加载:使用python-docx读取Word文档内容,或通过LlamaIndex的SimpleDirectoryReader批量加载目录下的文档(支持递归读取)。
文本分块:将长文本按固定长度(如200-500 token)拆分,同时保留重叠部分(如50-150 token),避免语义断裂。例如:
def split_text(all_text):
chunks = []
# 按200字符拆分,可根据token长度调整
for i in range(0, len(all_text), 200):
chunks.append(all_text[i:i+200])
return chunks
或使用LlamaIndex的SentenceSplitter(更智能的token级分块):
Settings.text_splitter = SentenceSplitter(
chunk_size=500, # 每块约500 token
chunk_overlap=150 # 重叠150 token
)
2.2 文本向量化与向量存储
文本分块后,需通过Embedding模型转换为向量,并存储到向量数据库中,以便后续检索。
向量化:使用Qwen3.7-text-embedding模型生成文本向量,支持批量处理以提升效率:
def text_embedding(chunks):
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://ws-wj4y279gkc4bd0x9.cn-beijing.maas.aliyuncs.com/compatible-mode/v1"
)
embeddings = []
batch_size = 20 # 批量处理20个文本块
for i in range(0, len(chunks), batch_size):
batch_chunks = chunks[i:i+batch_size]
completion = client.embeddings.create(
model="qwen3.7-text-embedding",
input=batch_chunks
)
batch_embeddings = [item.embedding for item in completion.data]
embeddings.extend(batch_embeddings)
return embeddings
向量存储:使用ChromaDB持久化存储向量,支持创建/加载集合(Collection):
def build_and_save_index(documents, persist_dir="./storage"):
# 连接ChromaDB
chroma_client = chromadb.PersistentClient(path=persist_dir)
chroma_collection = chroma_client.get_or_create_collection(name="bank_policy_collection")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
# 构建索引并持久化
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
index.storage_context.persist(persist_dir=persist_dir)
print(f"✅ 索引已保存,向量数: {chroma_collection.count()}")
return index
2.3 LLM集成与查询引擎
查询时,系统先将用户问题向量化,从ChromaDB检索相似文本片段,再将片段作为上下文输入LLM生成答案。
索引加载:从ChromaDB加载已构建的索引:
def load_index(persist_dir="./storage"):
chroma_client = chromadb.PersistentClient(path=persist_dir)
chroma_collection = chroma_client.get_collection("bank_policy_collection")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store, persist_dir=persist_dir)
index = load_index_from_storage(storage_context)
return index
查询执行:通过LlamaIndex的查询引擎实现检索增强生成:
def query_policy(index, user_query, top_k=3):
query_engine = index.as_query_engine(similarity_top_k=top_k) # 检索top 3相似片段
response = query_engine.query(user_query)
# 打印检索到的片段(用于调试)
for i, node in enumerate(response.source_nodes, 1):
print(f"[{i}] 相似度: {node.score:.4f} | 来源: {node.metadata.get('source')}")
return response.response
2.4 FastAPI服务与工具调用
系统通过FastAPI提供对外接口,并支持LLM工具调用(如学历验证、岗位查询、知识库检索),实现多能力集成。
工具定义:按OpenAI函数调用格式定义工具,例如岗位查询工具:
async def query_job_tool(arguments):
job_id = arguments["job_id"]
job = await Job.get_or_none(id=job_id) # 异步查询数据库
if job is None:
return "岗位不存在"
return f"岗位名称: {job.job_name}\\n职责: {job.job_desc}"
工具调用流程:LLM根据用户问题自动选择工具,执行后将结果作为上下文继续生成答案:
@llm_day05_router.post("/llm_chat")
async def llm_chat(request: LLMCase3):
messages = [{"role": "system", "content": system_prompt}] # 系统提示:指定工具调用规则
messages.append({"role": "user", "content": request.user_query})
completion = get_ai_response(messages) # 调用LLM,获取工具调用指令
if completion.choices[0].message.tool_calls:
# 执行工具调用
for tool in completion.choices[0].message.tool_calls:
func_name = tool.function.name
func_args = json.loads(tool.function.arguments)
tool_result = func_mapping[func_name](func_args) # 调用对应工具函数
if hasattr(tool_result, "__await__"): # 处理异步工具
tool_result = await tool_result
messages.append({"role": "tool", "content": tool_result})
# 二次调用LLM,生成最终答案
completion = get_ai_response(messages)
return {"code": 1, "data": completion.choices[0].message.content}
三、系统工作流程
数据准备:通过case7.py或build_index.py加载文档→分块→向量化→存储到ChromaDB。
用户查询:用户通过FastAPI接口(/llm_chat)提交问题。
工具调用判断:LLM根据系统提示判断是否需要调用工具(如学历验证、岗位查询)。
知识检索:如需查询企业知识库,调用query_knowledge_tool从ChromaDB检索相关文本片段。
答案生成:LLM结合工具返回结果或检索到的知识,生成最终答案并返回。
四、总结与展望
本系统通过RAG技术解决了企业知识检索的准确性问题,结合LLM工具调用实现了多能力集成(数据库查询、第三方API调用等)。未来可进一步优化:
分块策略:使用语义感知分块(如基于文档结构)提升检索精度。
多模态支持:扩展至PDF、图片等非文本格式文档处理。
性能优化:通过向量索引优化(如FAISS)提升检索速度,增加缓存层减少重复计算。
通过该系统,企业可快速构建智能化知识管理平台,提升员工查询效率与决策准确性
网硕互联帮助中心





评论前必须登录!
注册