太原网站怎么做seowordpress英文显示改中文

张小明 2025/12/26 12:18:54
太原网站怎么做seo,wordpress英文显示改中文,电子商务专业可以从事什么工作,湘潭免费网站建设一、为什么 RAG 是当前 AI 落地的最佳路径#xff1f; 1.1 大模型的三大痛点 问题说明RAG 如何解决幻觉#xff08;Hallucination#xff09;模型编造不存在的事实仅基于检索到的真实文档回答知识滞后训练数据截止 2024 年可注入最新企业文档#xff08;如 2025 年财报1.1 大模型的三大痛点问题说明RAG 如何解决幻觉Hallucination模型编造不存在的事实仅基于检索到的真实文档回答知识滞后训练数据截止 2024 年可注入最新企业文档如 2025 年财报私有数据无法使用不能上传敏感数据到公有云本地向量库 私有部署模型✅RAG Retrieval检索 Augmentation增强 Generation生成1.2 典型企业场景HR 部门员工问“年假怎么休” → 自动从《员工手册》找答案IT 支持问“如何重置密码” → 返回内部 Wiki 步骤销售团队问“竞品 A 的定价策略” → 检索市场分析报告核心价值把沉睡的企业文档变成可对话的知识资产二、整体架构设计关键设计多租户每个部门tenant_id有独立 collection流式响应避免长时间等待模块解耦文档处理、检索、生成分离三、环境准备3.1 安装依赖# 创建虚拟环境 python -m venv rag-env source rag-env/bin/activate # Linux/Mac # rag-env\Scripts\activate # Windows # 安装核心包 pip install langchain0.2.0 \ langchain-community0.2.0 \ langchain-core0.2.0 \ chromadb0.4.24 \ unstructured[local-inference]0.14.9 \ # PDF/Word 解析 python-dotenv \ fastapi \ uvicorn \ qwen-agent \ # 阿里官方 SDK httpx \ sse-starlette⚠️注意unstructured需要额外安装libmagicMac:brew install libmagic中文分块推荐使用ChineseRecursiveTextSplitter后文详解3.2 获取 Qwen API Key访问 阿里云百炼平台创建应用选择qwen-max模型获取API_KEY写入.env文件# .env QWEN_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxx QWEN_MODELqwen-max四、文档加载与向量化核心4.1 支持多种格式PDF/Word/TXT# document_loader.py from langchain_community.document_loaders import ( PyPDFLoader, UnstructuredWordDocumentLoader, TextLoader ) from pathlib import Path def load_documents(file_path: str) - list: 根据文件后缀加载文档 path Path(file_path) if path.suffix.lower() .pdf: loader PyPDFLoader(str(path)) elif path.suffix.lower() in [.docx, .doc]: loader UnstructuredWordDocumentLoader(str(path)) elif path.suffix.lower() .txt: loader TextLoader(str(path), encodingutf-8) else: raise ValueError(fUnsupported file type: {path.suffix}) return loader.load()✅Unstructured库能较好保留 Word/PDF 的段落结构4.2 中文文本分块避免语义断裂通用RecursiveCharacterTextSplitter对中文效果差改用# text_splitter.py from langchain_text_splitters import RecursiveCharacterTextSplitter import re class ChineseRecursiveTextSplitter(RecursiveCharacterTextSplitter): def __init__(self, *args, **kwargs): separators [ \n\n, \n, 。||, …, ”, ’, 】, ), ], }, , ] super().__init__(*args, separatorsseparators, **kwargs) # 使用示例 splitter ChineseRecursiveTextSplitter( chunk_size500, # 每块约 500 字符 chunk_overlap50, # 重叠 50 字符避免断句 length_functionlen ) chunks splitter.split_documents(documents)经验技术文档chunk_size300合同/法律chunk_size800需完整条款重叠部分能显著提升检索召回率4.3 向量化并存入 Chroma带租户隔离# vector_store.py import chromadb from chromadb.utils import embedding_functions from langchain_community.vectorstores import Chroma from langchain_community.embeddings import HuggingFaceEmbeddings class TenantAwareChroma: def __init__(self, persist_directory: str ./chroma_db): self.client chromadb.PersistentClient(pathpersist_directory) # 使用中文 Embedding 模型无需 API Key self.embedding_func HuggingFaceEmbeddings( model_nameGanymedeNil/text2vec-large-chinese ) def add_documents(self, tenant_id: str, documents: list): 为指定租户添加文档 collection_name fkb_{tenant_id} # 创建或获取 collection collection self.client.get_or_create_collection( namecollection_name, embedding_functionself._get_embedding_func() ) # LangChain 封装便于后续检索 vectorstore Chroma( clientself.client, collection_namecollection_name, embedding_functionself.embedding_func ) vectorstore.add_documents(documents) return vectorstore def get_retriever(self, tenant_id: str, top_k: int 4): 获取指定租户的检索器 collection_name fkb_{tenant_id} vectorstore Chroma( clientself.client, collection_namecollection_name, embedding_functionself.embedding_func ) return vectorstore.as_retriever(search_kwargs{k: top_k})✅优势使用开源中文 Embedding 模型无调用成本每个租户独立 collection天然隔离PersistentClient支持持久化到磁盘。五、构建 LangChain RAG Pipeline5.1 核心链检索 生成# rag_chain.py from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser from qwen_agent.llm import get_chat_model def create_rag_chain(retriever, model_name: str qwen-max): # 1. 定义 Prompt中文优化 prompt ChatPromptTemplate.from_template( 你是一个专业的企业知识助手请根据以下上下文回答问题。 如果不知道答案请说“根据现有资料无法回答”不要编造。 上下文 {context} 问题{question} ) # 2. 初始化 Qwen 模型通过阿里百炼 llm get_chat_model({ model: model_name, api_key: os.getenv(QWEN_API_KEY), model_server: dashscope # 阿里 DashScope }) # 3. 构建链 rag_chain ( {context: retriever, question: RunnablePassthrough()} | prompt | llm | StrOutputParser() ) return rag_chainPrompt 设计要点明确禁止幻觉“不要编造”强调“根据上下文”约束模型行为中文指令更符合 Qwen 训练偏好。5.2 支持流式响应SSE# stream_rag.py from sse_starlette.sse import EventSourceResponse import asyncio async def stream_rag_answer(rag_chain, question: str): 异步流式生成答案 loop asyncio.get_event_loop() # 使用迭代器逐步获取 token async def event_generator(): full_response async for chunk in rag_chain.astream(question): full_response chunk yield {data: chunk} # 最后发送结束标记 yield {data: [DONE]} return EventSourceResponse(event_generator())✅ 前端可通过EventSource接收流式数据实现“打字机”效果。六、FastAPI 后端服务6.1 核心接口# main.py from fastapi import FastAPI, HTTPException, Depends from pydantic import BaseModel from typing import Optional app FastAPI(title企业知识库问答系统) class QueryRequest(BaseModel): tenant_id: str # 部门ID如 hr, it question: str stream: Optional[bool] False app.post(/query) async def query_knowledge_base(request: QueryRequest): try: # 1. 获取租户专属检索器 retriever vector_store.get_retriever(request.tenant_id) # 2. 构建 RAG 链 rag_chain create_rag_chain(retriever) # 3. 流式 or 非流式 if request.stream: return await stream_rag_answer(rag_chain, request.question) else: answer await rag_chain.ainvoke(request.question) return {answer: answer} except Exception as e: raise HTTPException(status_code500, detailstr(e))6.2 文档上传接口支持多文件from fastapi import File, UploadFile import tempfile import os app.post(/upload/{tenant_id}) async def upload_documents(tenant_id: str, files: list[UploadFile] File(...)): with tempfile.TemporaryDirectory() as tmpdir: documents [] for file in files: # 保存临时文件 file_path os.path.join(tmpdir, file.filename) with open(file_path, wb) as f: f.write(await file.read()) # 加载并分块 docs load_documents(file_path) chunks chinese_splitter.split_documents(docs) documents.extend(chunks) # 向量化存储 vector_store.add_documents(tenant_id, documents) return {message: f成功上传 {len(files)} 个文件到 {tenant_id} 知识库}七、前端简易界面Vue3 SSE!-- App.vue -- template div h1企业知识库问答/h1 select v-modeltenantId option valuehr人力资源部/option option valueitIT支持/option /select input v-modelquestion keyup.enterask placeholder输入问题... / button clickask提问/button div classanswer{{ answer }}/div /div /template script setup import { ref } from vue const tenantId ref(hr) const question ref() const answer ref() const ask () { answer.value const eventSource new EventSource( /query?tenant_id${tenantId.value}question${encodeURIComponent(question.value)}streamtrue ) eventSource.onmessage (event) { if (event.data [DONE]) { eventSource.close() } else { answer.value event.data } } } /script✅ 实现实时流式输出用户体验接近 ChatGPT。八、企业级增强功能8.1 权限控制JWT 验证# auth.py from fastapi.security import HTTPBearer from jose import jwt security HTTPBearer() def verify_token(token: str Depends(security)): try: payload jwt.decode(token.credentials, SECRET_KEY, algorithms[HS256]) return payload[tenant_id] # 从 token 提取租户ID except: raise HTTPException(status_code401, detailInvalid token)前端登录后获取 JWT确保用户只能访问授权租户。8.2 性能优化重排序Rerank初始检索可能召回不相关片段用bge-reranker二次排序from FlagEmbedding import FlagReranker reranker FlagReranker(BAAI/bge-reranker-large, use_fp16True) def rerank_docs(query: str, docs: list, top_k: int 3): scores reranker.compute_score([[query, doc.page_content] for doc in docs]) sorted_docs [doc for _, doc in sorted(zip(scores, docs), reverseTrue)] return sorted_docs[:top_k] 实测Rerank 可将问答准确率提升15–30%8.3 缓存高频问题from functools import lru_cache lru_cache(maxsize1000) def cached_rag_answer(tenant_id: str, question: str): retriever vector_store.get_retriever(tenant_id) rag_chain create_rag_chain(retriever) return rag_chain.invoke(question)对“年假政策”等高频问题响应速度从 2s → 50ms。九、Docker 一键部署# Dockerfile FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000]# docker-compose.yml version: 3 services: rag-app: build: . ports: - 8000:8000 environment: - QWEN_API_KEYyour_key_here volumes: - ./chroma_db:/app/chroma_db # 持久化向量库执行docker-compose up -d即可启动完整服务十、避坑指南血泪经验问题解决方案PDF 表格识别乱码改用pdfplumber替代PyPDFLoaderQwen 返回 JSON 格式错误在 Prompt 中明确要求“纯文本回答”Chroma 内存占用高使用PersistentClient 定期清理旧 collection中文分块丢失标题在ChineseRecursiveTextSplitter中加入\n#分隔符流式响应卡顿增加asyncio.sleep(0.01)避免事件循环阻塞十一、效果演示用户提问“实习生转正需要满足哪些条件”系统返回来自《HR 手册.pdf》根据《员工转正管理办法》第3.2条实习生需同时满足试用期满3个月月度考核平均分≥80通过部门转正答辩。详细流程请参考 HR 系统 入职管理 转正申请。✅全程无需人工干预答案可追溯到原文位置AI 工程化的本质不是取代人而是把人从重复劳动中解放出来。你不需要成为算法科学家只需掌握LangChain 向量数据库 大模型 API这一组合拳就能在 2025 年的技术浪潮中占据先机。 如果你觉得有帮助欢迎点赞、收藏 你打算用 RAG 解决什么业务问题欢迎评论区交流
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

凡科建站案例自助建站原理

清华镜像加速下载:Miniconda轻量级Python环境一键部署 在人工智能项目频繁迭代的今天,你是否经历过这样的场景?刚接手一个开源模型代码,requirements.txt 一打开,几十个依赖项版本各不相同;本地安装时 pip …

张小明 2025/12/23 7:59:40 网站建设

广州短视频网站开发一套企业vi设计需要多少钱

Matlab 永磁同步风力发电机 并网故障 低电压穿越策略 可以设计串电阻Bar策略 也可以增加三相故障先看简单粗暴的串电阻方案。在Matlab里建模时,关键要拿捏故障发生时直流母线电压的动态平衡。上代码: function R_calc dynamic_resistor(Vdc_nominal, …

张小明 2025/12/22 3:18:08 网站建设

怎么把百度到自己的网站廊坊做网站厂商定制

SmartAdmin企业级安全系统快速部署实战指南 【免费下载链接】smart-admin SmartAdmin国内首个以「高质量代码」为核心,「简洁、高效、安全」中后台快速开发平台;基于SpringBoot2/3 Sa-Token Mybatis-Plus 和 Vue3 Vite5 Ant Design Vue 4.x (同时支持…

张小明 2025/12/22 3:16:06 网站建设

买完域名后如何建设网站一个人做网站现实吗

Wan2.2-T2V-A14B如何应对极端天气条件下的场景生成?你有没有想过,一条“台风登陆、巨浪拍岸”的新闻短片,根本不用去海边冒险拍摄,也不需要花几周做动画——输入一句话,几十秒后高清视频就出来了?&#x1f…

张小明 2025/12/23 17:38:41 网站建设

网站模块建设企业网站导航一般做多高

前言 我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务…

张小明 2025/12/23 16:46:33 网站建设

怎样做网站国外wordpress如何重置后台密码

5大创新应用:文档预览工具如何彻底改变你的工作流 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 你是否曾经在浏览器中打开技术文档,却只能面对密密麻麻的…

张小明 2025/12/23 16:11:52 网站建设