当前位置:首页 > AI > 正文内容

RAG 企业应用实战

廖万里12小时前AI1

# RAG 企业应用实战 - 构建企业知识库问答系统

---

一、RAG 原理

什么是 RAG

RAG = Retrieval + Augmented + Generation

1. 检索:从知识库中检索相关文档 2. 增强:将检索结果作为上下文 3. 生成:基于上下文生成回答

为什么需要 RAG

解决大模型知识时效性问题
  • 保护企业私有数据
  • 减少 AI 幻觉
  • 降低 Token 成本
  • ---

    二、技术架构

    核心组件

    文档 → 切分 → 向量化 → 向量数据库
                        ↓
    用户提问 → 向量化 → 相似度检索 → 上下文组装 → LLM → 回答
    

    技术选型

    | 组件 | 推荐方案 | |------|----------| | Embedding | OpenAI / BGE / M3E | | 向量数据库 | Chroma / FAISS / Milvus | | 框架 | LangChain / LlamaIndex | | LLM | GPT-4 / Claude / DeepSeek |

    ---

    三、代码实现

    安装依赖

    pip install langchain langchain-openai chromadb
    

    加载文档

    from langchain.document_loaders import TextLoader, PDFLoader

    # 加载文本文件 loader = TextLoader('company_policy.txt') documents = loader.load()

    # 加载 PDF loader = PDFLoader('employee_handbook.pdf') documents.extend(loader.load())

    文档切分

    from langchain.text_splitter import RecursiveCharacterTextSplitter

    text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50 )

    chunks = text_splitter.split_documents(documents) print(f"切分后共 {len(chunks)} 个文本块")

    向量化存储

    from langchain.embeddings import OpenAIEmbeddings
    from langchain.vectorstores import Chroma

    embeddings = OpenAIEmbeddings() vectorstore = Chroma.from_documents( chunks, embeddings, persist_directory='./chroma_db' )

    检索问答

    from langchain.chains import RetrievalQA
    from langchain.chat_models import ChatOpenAI

    llm = ChatOpenAI(model='gpt-4o-mini') qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type='stuff', retriever=vectorstore.as_retriever(search_kwargs={'k': 3}) )

    # 提问 question = "公司的年假政策是什么?" answer = qa_chain.run(question) print(answer)

    ---

    四、优化技巧

    1. 合理设置 Chunk 大小

    太小:信息碎片化
  • 太大:检索精度下降
  • 推荐:300-800 字符
  • 2. 使用重排序

    from langchain.retrievers import ContextualCompressionRetriever
    from langchain.retrievers.document_compressors import CohereRerank

    compressor = CohereRerank() compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=vectorstore.as_retriever() )

    3. 添加元数据过滤

    retriever = vectorstore.as_retriever(
        search_kwargs={
            'k': 5,
            'filter': {'department': 'HR'}
        }
    )
    

    ---

    五、企业部署

    API 服务

    from fastapi import FastAPI

    app = FastAPI()

    @app.post('/ask') async def ask(question: str): answer = qa_chain.run(question) return {'answer': answer}

    Docker 部署

    FROM python:3.11
    WORKDIR /app
    COPY . .
    RUN pip install -r requirements.txt
    CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
    

    ---

    六、常见问题

    Q1:检索结果不准确?

    检查 Embedding 模型是否适合中文
  • 调整 chunk_size 和 overlap
  • 使用重排序模型
  • Q2:回答有幻觉?

    在提示词中明确要求"只根据提供的信息回答"
  • 降低 temperature 参数
  • 添加引用来源
  • ---

    >
    作者:廖万里

    本文链接:https://www.kkkliao.cn/?id=669 转载需授权!

    分享到:

    版权声明:本文由廖万里的博客发布,如需转载请注明出处。


    发表评论

    访客

    看不清,换一张

    ◎欢迎参与讨论,请在这里发表您的看法和观点。