尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RAG 从零搭建:8 步搞定知识库问答

RAG 从零搭建:8 步搞定知识库问答 后端转AI第一课RAG是面试重中之重也是第一个简历项目的核心。RAG是什么RAG 给模型查资料再答。模型不记得你的文档那就先检索相关片段拼进提示词再让模型回答——答案有依据、能溯源、不胡说。8步全链路① 文档解析 → ② 切片分块 → ③ Embedding → ④ 向量库存储→ ⑤ 语义检索 → ⑥ 召回重排 → ⑦ Prompt拼接 → ⑧ 大模型生成① 文档解析PDF/Word→文本from langchain_community.document_loaders import PyPDFLoaderdocuments.extend(PyPDFLoader(path).load())documents.extend(Docx2txtLoader(path).load())documents.extend(TextLoader(path, encodingutf-8).load())# 坑表格/图片里的字读不出需要OCR或多模态② 切片分块200-500字重叠from langchain_huggingface import HuggingFaceEmbeddingssplitter RecursiveCharacterTextSplitter(chunk_size300, # 块大小chunk_overlap50, # 重叠防切断语义separators[\n\n, \n, 。, , , , ])chunks splitter.split_documents(documents)# 坑块太大召回糙太小丢上下文③ Embedding中文用bgefrom langchain_community.embeddings import HuggingFaceBgeEmbeddingsembeddings HuggingFaceEmbeddings(model_nameembed_model_name,model_kwargs{device: cpu}, # 无显卡固定cpuencode_kwargs{normalize_embeddings: True} # BGE模型强制归一化向量)# 中文场景用bge/m3e比通用英文模型准④ 向量库存储Chroma最轻from langchain_chroma import Chromavectorstore Chroma(persist_directory./chroma_db,embedding_functionembeddings)⑤⑥ 语义检索 重排retriever vectorstore.as_retriever(search_kwargs{k: 5} # 初召回K块)# 重排Rerank用交叉编码器挑最相关Top-Nfrom langchain_community.cross_encoders import HuggingFaceCrossEncoderfrom langchain.retrievers import ContextualCompressionRetrieverfrom langchain.retrievers.document_compressors import CrossEncoderRerankerreranker CrossEncoderReranker(modelHuggingFaceCrossEncoder(model_nameBAAI/bge-reranker-base),top_n3)compression_retriever ContextualCompressionRetriever(base_compressorreranker, base_retrieverretriever)⑦⑧ Prompt拼接 生成from langchain_community.document_loaders import (PyPDFLoader,TextLoader,Docx2txtLoader,)prompt ChatPromptTemplate.from_messages([(system, 你是一个知识库问答助手。只根据提供的资料回答资料里没有的明确说不知道。回答末尾标注引用来源。),(user, 资料\n{context}\n\n问题{question})])llm ChatOpenAI(modelqwen-max, temperature0.2)def ask(question: str):docs compression_retriever.invoke(question)context \n.join(f[{i1}] {d.page_content} for i, d in enumerate(docs))chain prompt | llmreturn chain.invoke({context: context, question: question})完整示例question 什么是RAGanswer ask(question)print(answer.content)关键认知RAG的稳靠检索质量不是模型多强。召回差模型再强也胡说。过关清单☐ 上传PDF能解析出文本☐ 分块有重叠参数可配置☐ 中文Embeddingbge检索语义相关☐ 回答带引用来源☐ 知识库无答案时明确说不知道 配套Demo代码Star支持backend-to-ai-guide/rag-demo/README.md at main · cxy-ai-gongfang/backend-to-ai-guide · GitHub下一篇RAG优化实战——去幻觉/提召回/成本控制。欢迎关注专栏持续更新。
返回列表