云计算百科
云计算领域专业知识百科平台

基于RAG与LLM的企业知识库后端系统设计与实现

        在企业级应用中,如何高效管理和检索海量文档知识(如员工手册、政策文件、岗位信息等)是一个常见需求。本文将介绍一个基于检索增强生成(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)提升检索速度,增加缓存层减少重复计算。
通过该系统,企业可快速构建智能化知识管理平台,提升员工查询效率与决策准确性

赞(0)
未经允许不得转载:网硕互联帮助中心 » 基于RAG与LLM的企业知识库后端系统设计与实现
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!