<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>知识库 on 图灵派对</title><link>https://turingparty-ai.pages.dev/tags/%E7%9F%A5%E8%AF%86%E5%BA%93/</link><description>Recent content in 知识库 on 图灵派对</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://turingparty-ai.pages.dev/tags/%E7%9F%A5%E8%AF%86%E5%BA%93/index.xml" rel="self" type="application/rss+xml"/><item><title>RAG 实战：从零搭建企业知识库问答系统</title><link>https://turingparty-ai.pages.dev/posts/20260405/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://turingparty-ai.pages.dev/posts/20260405/</guid><description>&lt;p&gt;RAG（Retrieval-Augmented Generation，检索增强生成）是目前让大模型落地企业场景最实用的技术方案之一。本文将带你从零开始，构建一套生产级的 RAG 知识库问答系统。&lt;/p&gt;
&lt;h2 id="为什么需要-rag"&gt;为什么需要 RAG？&lt;/h2&gt;
&lt;p&gt;大模型虽然强大，但存在几个核心问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;知识截止&lt;/strong&gt;：训练数据有时间限制，无法获取最新信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;幻觉问题&lt;/strong&gt;：模型可能&amp;quot;一本正经地胡说八道&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;私有数据&lt;/strong&gt;：企业内部知识不在模型训练集中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RAG 通过&lt;strong&gt;先检索、再生成&lt;/strong&gt;的方式，让大模型基于真实文档来回答问题，有效解决以上问题。&lt;/p&gt;
&lt;h2 id="整体架构"&gt;整体架构&lt;/h2&gt;
&lt;p&gt;一个标准的 RAG 系统包含以下流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;文档加载&lt;/strong&gt;：读取 PDF、Word、网页等多种格式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文本分块&lt;/strong&gt;：将长文档切分为合适大小的 Chunk&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向量化&lt;/strong&gt;：使用 Embedding 模型将文本转为向量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;索引存储&lt;/strong&gt;：存入向量数据库（ChromaDB / Milvus / Pinecone）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索&lt;/strong&gt;：根据用户 Query 检索最相关的 Chunk&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成&lt;/strong&gt;：将检索结果作为上下文，交给 LLM 生成答案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="代码实战"&gt;代码实战&lt;/h2&gt;
&lt;h3 id="环境准备"&gt;环境准备&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install langchain chromadb openai tiktoken
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="文档加载与分块"&gt;文档加载与分块&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#94e2d5"&gt;from&lt;/span&gt; &lt;span style="color:#fab387"&gt;langchain.document_loaders&lt;/span&gt; &lt;span style="color:#94e2d5"&gt;import&lt;/span&gt; DirectoryLoader
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#94e2d5"&gt;from&lt;/span&gt; &lt;span style="color:#fab387"&gt;langchain.text_splitter&lt;/span&gt; &lt;span style="color:#94e2d5"&gt;import&lt;/span&gt; RecursiveCharacterTextSplitter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;# 加载文档&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;loader &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; DirectoryLoader(&lt;span style="color:#a6e3a1"&gt;&amp;#34;./docs&amp;#34;&lt;/span&gt;, glob&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;**/*.md&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;documents &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; loader&lt;span style="color:#89dceb;font-weight:bold"&gt;.&lt;/span&gt;load()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6c7086;font-style:italic"&gt;# 分块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;splitter &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; RecursiveCharacterTextSplitter(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; chunk_size&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#fab387"&gt;500&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; chunk_overlap&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#fab387"&gt;50&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; separators&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;[&lt;span style="color:#a6e3a1"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#89b4fa"&gt;\n\n&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#89b4fa"&gt;\n&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;。&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;！&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;？&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e3a1"&gt;&amp;#34; &amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chunks &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; splitter&lt;span style="color:#89dceb;font-weight:bold"&gt;.&lt;/span&gt;split_documents(documents)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#89dceb"&gt;print&lt;/span&gt;(&lt;span style="color:#f38ba8"&gt;f&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;共生成 &lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;{&lt;/span&gt;&lt;span style="color:#89dceb"&gt;len&lt;/span&gt;(chunks)&lt;span style="color:#a6e3a1"&gt;}&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt; 个文本块&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="向量化与存储"&gt;向量化与存储&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#94e2d5"&gt;from&lt;/span&gt; &lt;span style="color:#fab387"&gt;langchain.embeddings&lt;/span&gt; &lt;span style="color:#94e2d5"&gt;import&lt;/span&gt; OpenAIEmbeddings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#94e2d5"&gt;from&lt;/span&gt; &lt;span style="color:#fab387"&gt;langchain.vectorstores&lt;/span&gt; &lt;span style="color:#94e2d5"&gt;import&lt;/span&gt; Chroma
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;embedding &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; OpenAIEmbeddings(model&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;text-embedding-3-small&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vectordb &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; Chroma&lt;span style="color:#89dceb;font-weight:bold"&gt;.&lt;/span&gt;from_documents(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; documents&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;chunks,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; embedding&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;embedding,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; persist_directory&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;./chroma_db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="检索与问答"&gt;检索与问答&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#cdd6f4;background-color:#1e1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#94e2d5"&gt;from&lt;/span&gt; &lt;span style="color:#fab387"&gt;langchain.chat_models&lt;/span&gt; &lt;span style="color:#94e2d5"&gt;import&lt;/span&gt; ChatOpenAI
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#94e2d5"&gt;from&lt;/span&gt; &lt;span style="color:#fab387"&gt;langchain.chains&lt;/span&gt; &lt;span style="color:#94e2d5"&gt;import&lt;/span&gt; RetrievalQA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;llm &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; ChatOpenAI(model&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6e3a1"&gt;&amp;#34;gpt-4o&amp;#34;&lt;/span&gt;, temperature&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#fab387"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qa_chain &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; RetrievalQA&lt;span style="color:#89dceb;font-weight:bold"&gt;.&lt;/span&gt;from_chain_type(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; llm&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;llm,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; retriever&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;vectordb&lt;span style="color:#89dceb;font-weight:bold"&gt;.&lt;/span&gt;as_retriever(search_kwargs&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e3a1"&gt;&amp;#34;k&amp;#34;&lt;/span&gt;: &lt;span style="color:#fab387"&gt;4&lt;/span&gt;}),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; return_source_documents&lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#fab387"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#89dceb;font-weight:bold"&gt;=&lt;/span&gt; qa_chain({&lt;span style="color:#a6e3a1"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;: &lt;span style="color:#a6e3a1"&gt;&amp;#34;我们的退款政策是什么？&amp;#34;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#89dceb"&gt;print&lt;/span&gt;(result[&lt;span style="color:#a6e3a1"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="优化策略"&gt;优化策略&lt;/h2&gt;
&lt;p&gt;基础 RAG 搭建完后，以下是几个关键优化方向：&lt;/p&gt;</description></item></channel></rss>