<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 3 章 文档标准化与语义检索 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/agent/chapter03/</link>
		<description>Recent content in 第 3 章 文档标准化与语义检索 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/agent/chapter03/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>3.1 文档加载与标准化</title>
				<link>https://mlwithme.github.io/agent/chapter03/7f4af6d48c5b425c/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/agent/chapter03/7f4af6d48c5b425c/</guid>
				<description>&lt;h1 id=&#34;第-3-章-文档标准化与语义检索&#34;&gt;第 3 章 文档标准化与语义检索&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%ac-3-%e7%ab%a0-%e6%96%87%e6%a1%a3%e6%a0%87%e5%87%86%e5%8c%96%e4%b8%8e%e8%af%ad%e4%b9%89%e6%a3%80%e7%b4%a2&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;RAG 的核心思想是在大模型生成答案之前，先从外部知识库中检索与当前问题最相关的内容，再将检索结果作为上下文提供给模型。要实现这一过程，首先需要将原始文档整理为可被程序统一处理、切分、向量化和检索的标准化数据。&lt;/p&gt;&#xA;&lt;p&gt;本章将围绕文档标准化与语义检索的构建过程展开介绍。本节首先介绍文档在进入 RAG 系统之前所需经历的预处理流程，以及如何借助 LangChain 完成不同类型文档的加载与标准化。&lt;/p&gt;&#xA;&lt;h1 id=&#34;31-文档加载与标准化&#34;&gt;3.1 文档加载与标准化&lt;a class=&#34;anchor&#34; href=&#34;#31-%e6%96%87%e6%a1%a3%e5%8a%a0%e8%bd%bd%e4%b8%8e%e6%a0%87%e5%87%86%e5%8c%96&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;311-语义检索的基本构建流程&#34;&gt;3.1.1 语义检索的基本构建流程&lt;a class=&#34;anchor&#34; href=&#34;#311-%e8%af%ad%e4%b9%89%e6%a3%80%e7%b4%a2%e7%9a%84%e5%9f%ba%e6%9c%ac%e6%9e%84%e5%bb%ba%e6%b5%81%e7%a8%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从工程实现角度看，一个基础语义检索系统的构建过程通常可以分为 4 个步骤：① 文档加载；② 文本切分；③ 向量化表示；④ 存储与检索。其整体流程如图 3-1 所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/agent/202602141015358.png&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 3-1. 语义检索构建流程&lt;/center&gt;&#xA;&lt;p&gt;由图3-1可以看出，这 4 个步骤虽然在概念上相对清晰，但在实际实现中都包含了大量细节，其中，文档加载与文本切分尤其关键，因为原始资料的来源往往并不统一，既可能是 PDF、TXT、HTML，也可能是 Word、CSV 或数据库导出文件。如果不能先将这些异构数据统一转换为标准结构，后续的切分、向量化和检索流程就难以稳定开展。&lt;/p&gt;&#xA;&lt;p&gt;因此，在进入文本切分策略之前，首先需要解决的问题并不是如何切块，而是如何让不同来源、不同格式的原始文档，以统一的数据结构进入后续处理流程。这正是文档加载与标准化的核心任务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;312-langchain-中的标准化文档对象&#34;&gt;3.1.2 LangChain 中的标准化文档对象&lt;a class=&#34;anchor&#34; href=&#34;#312-langchain-%e4%b8%ad%e7%9a%84%e6%a0%87%e5%87%86%e5%8c%96%e6%96%87%e6%a1%a3%e5%af%b9%e8%b1%a1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;为了统一后续处理流程，LangChain 在文档加载阶段引入了 &lt;code&gt;Document&lt;/code&gt; 对象。无论文档原始格式如何，只要经过加载器处理，最终都可以被转换为统一的 &lt;code&gt;Document&lt;/code&gt; 实例列表。&lt;/p&gt;&#xA;&lt;p&gt;一个 &lt;code&gt;Document&lt;/code&gt; 对象通常包含以下 3 个核心字段：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;page_content&lt;/code&gt;：文档正文内容；&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;metadata&lt;/code&gt;：元数据，例如文件来源、页码、章节信息等；&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;id&lt;/code&gt;：可选标识，用于在特定场景中标记文档对象。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这种设计的意义在于，后续的文本切分器、向量化模型、向量数据库以及检索器，并不需要关心输入最初是 PDF 还是 HTML，而只需要面向统一的 &lt;code&gt;Document&lt;/code&gt; 结构进行处理。换言之，文档标准化完成之后，后续流程面对的将不再是“文件”，而是一组具备统一接口的文本对象。&lt;/p&gt;&#xA;&lt;p&gt;例如，在加载 PDF 文件时，LangChain 通常会自动完成如下处理：&lt;/p&gt;&#xA;&lt;p&gt;① 将 PDF 的每一页转换为一个 &lt;code&gt;Document&lt;/code&gt; 对象；&lt;/p&gt;&#xA;&lt;p&gt;② 将页码、来源文件等信息写入 &lt;code&gt;metadata&lt;/code&gt;；&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.2 常见文本切分策略</title>
				<link>https://mlwithme.github.io/agent/chapter03/572ba4c9cb114677/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/agent/chapter03/572ba4c9cb114677/</guid>
				<description>&lt;h1 id=&#34;32-常见文本切分策略&#34;&gt;3.2 常见文本切分策略&lt;a class=&#34;anchor&#34; href=&#34;#32-%e5%b8%b8%e8%a7%81%e6%96%87%e6%9c%ac%e5%88%87%e5%88%86%e7%ad%96%e7%95%a5&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在上一节内容中我们已经介绍了如何将不同来源、不同格式的原始文档统一转换为 &lt;code&gt;Document&lt;/code&gt; 对象。完成这一步后，文档虽然已经具备了标准化结构，但通常仍然不能直接进入向量化与检索流程，还需要在文档加载之后增加一个关键步骤，文本切分。&lt;/p&gt;&#xA;&lt;h2 id=&#34;321-文本切分&#34;&gt;3.2.1 文本切分&lt;a class=&#34;anchor&#34; href=&#34;#321-%e6%96%87%e6%9c%ac%e5%88%87%e5%88%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;文本切分是指按照一定规则将原始文档拆分为若干相对独立、长度适中且语义尽可能完整的文本块（Chunk），以便后续完成向量化、入库与检索。&lt;/p&gt;&#xA;&lt;p&gt;从工程角度看，文本切分并不是简单地将长文本“截短”，而是在长度约束与语义完整性之间寻找平衡。若不经过切分而直接对整页或整篇文档进行向量化，通常会带来下面两个问题：&lt;/p&gt;&#xA;&lt;p&gt;① 输入长度超限；词嵌入模型通常存在最大输入长度限制，超出部分可能被截断，从而导致部分语义信息丢失。&lt;/p&gt;&#xA;&lt;p&gt;② 语义粒度过粗；若单个文本块包含过多主题，其向量表示往往会混合多个语义方向，进而降低检索阶段的匹配精度。&lt;/p&gt;&#xA;&lt;p&gt;因此，一个可用的文本切分策略通常需要同时考虑以下 3 个因素：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;长度是否可控；&lt;/li&gt;&#xA;&lt;li&gt;语义边界是否尽可能完整；&lt;/li&gt;&#xA;&lt;li&gt;是否适合后续检索与溯源。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;本节将结合 LangChain 中常见的实现方式，介绍 5 类常见文本切分策略，并分析它们各自的适用场景与局限性。&lt;/p&gt;&#xA;&lt;h2 id=&#34;322-按字符长度切分&#34;&gt;3.2.2 按字符长度切分&lt;a class=&#34;anchor&#34; href=&#34;#322-%e6%8c%89%e5%ad%97%e7%ac%a6%e9%95%bf%e5%ba%a6%e5%88%87%e5%88%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;按字符长度切分是最直接、也是最容易实现的一种策略。其基本思路是：将原始文本按照固定字符数划分为多个文本块，并在相邻文本块之间保留一定长度的重叠部分（Overlap），以降低语义在边界处被直接截断的风险。&lt;/p&gt;&#xA;&lt;p&gt;例如，若设定每个文本块长度为 500 个字符，并设置 100 个字符的重叠区，则系统会生成一系列长度近似的文本块，其中相邻块之间共享部分上下文。&lt;/p&gt;&#xA;&lt;p&gt;这种方法的主要优点是实现简单、长度可控，适合快速构建原型系统；其缺点则在于切分边界完全由长度决定，容易破坏句子、段落或章节的自然语义结构。&lt;/p&gt;&#xA;&lt;p&gt;具体地，严格按照字符长度切分的代码实现如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;text_splitter&lt;/span&gt;(docs):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     text_splitter &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; CharacterTextSplitter(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;         separator&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, chunk_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;500&lt;/span&gt;, chunk_overlap&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;100&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         add_start_index&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     all_splits &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; text_splitter&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;split_documents(docs)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;len&lt;/span&gt;(all_splits)):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;===============&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;         page &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; all_splits[i]&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;metadata[&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;page&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;         s_index &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; all_splits[i]&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;metadata[&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;start_index&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;划分后的文本块：&lt;/span&gt;&lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;{&lt;/span&gt;all_splits[i]&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;page_content&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;11&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;文本块长度：&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#007020&#34;&gt;len&lt;/span&gt;(all_splits[i]&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;page_content)&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;原始文档对应片段：&lt;/span&gt;&lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;{&lt;/span&gt;docs[page]&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;page_content[s_index:s_index &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;500&lt;/span&gt;]&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第3行 &lt;code&gt;separator=&amp;quot;&amp;quot;&lt;/code&gt; 表示忽略默认分隔符，将整段文本视为连续字符串；&lt;code&gt;chunk_size&lt;/code&gt; 表示每个文本块的目标长度；&lt;code&gt;chunk_overlap&lt;/code&gt; 表示相邻文本块之间保留的重叠字符数；&lt;code&gt;add_start_index=True&lt;/code&gt; 则用于记录当前文本块在原始文档中的起始位置，便于后续定位与验证。&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是，字符级重叠仅在同一个 &lt;code&gt;Document&lt;/code&gt; 对象内部生效。对于多页 PDF 而言，不同页面在加载后往往是不同的 &lt;code&gt;Document&lt;/code&gt; 实例，因此页与页之间默认不会自动生成重叠区。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.3 向量数据库选择</title>
				<link>https://mlwithme.github.io/agent/chapter03/06e588cd33fa4454/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/agent/chapter03/06e588cd33fa4454/</guid>
				<description>&lt;h1 id=&#34;33-向量数据库选择&#34;&gt;3.3 向量数据库选择&lt;a class=&#34;anchor&#34; href=&#34;#33-%e5%90%91%e9%87%8f%e6%95%b0%e6%8d%ae%e5%ba%93%e9%80%89%e6%8b%a9&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;当我们载入文本并且进行分块以后就需要通过词嵌入模型来把这些分块好的文本统一都转换成一个固定维度的向量化表示，并存储到向量数据库中，以供后续进行语义检索。&lt;/p&gt;&#xA;&lt;h2 id=&#34;331-milvus-介绍&#34;&gt;3.3.1 Milvus 介绍&lt;a class=&#34;anchor&#34; href=&#34;#331-milvus-%e4%bb%8b%e7%bb%8d&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;对于向量数据库的选择有很多，例如 Chroma、Milvus、MongoDB、pgvector、Qdrant 等等，它们本质上分成两大类：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;专门的向量数据库：Milvus、Qdrant、Chroma&lt;/li&gt;&#xA;&lt;li&gt;通用数据库 + 向量扩展能力：MongoDB、PostgreSQL + pgvector&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这里我们以使用最为广泛之一的 Milvus /ˈmɪl.vəs/（米尔沃斯）向量数据库。Milvus 这个词原意是鹰科中的一种猛禽，以飞行速度快、视力敏锐、适应性强而著称，而这也恰好能够凸显它作为向量数据库时的优秀性能 [1]。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;800&#34; src=&#34;https://mlwithme.github.io/images/agent/202602221609702.png&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 3-3. Milvus 采用者&lt;/center&gt;&#xA;&lt;p&gt;Milvus 是一个开源的向量数据库，用于管理、索引和搜索高维向量数据。它在机器学习、推荐系统和生成式 AI 应用中广泛使用，以支持快速的相似度语义检索与嵌入数据存储。同时，Milvus 还提供了丰富的 SDK（Python、Java、Go 等），方便与 AI 框架（如 PyTorch、TensorFlow、OpenAI Embeddings API）快速集成。&lt;/p&gt;&#xA;&lt;h2 id=&#34;332-milvus-部署模式选择&#34;&gt;3.3.2 Milvus 部署模式选择&lt;a class=&#34;anchor&#34; href=&#34;#332-milvus-%e9%83%a8%e7%bd%b2%e6%a8%a1%e5%bc%8f%e9%80%89%e6%8b%a9&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;同时，Milvus 提供了三种部署模式，涵盖从 Jupyter Notebooks 中的本地原型到管理数百亿向量的大规模 Kubernetes 集群的各种数据规模 [2]。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Milvus Lite 是一个 Python 库，可以轻松集成到您的应用程序中。作为 Milvus 的轻量级版本，它非常适合在 Jupyter Notebooks 中进行快速原型开发，或在资源有限的边缘设备上运行。&lt;/li&gt;&#xA;&lt;li&gt;Milvus Standalone 是单机服务器部署，所有组件都捆绑在一个 Docker 镜像中，方便部署。&lt;/li&gt;&#xA;&lt;li&gt;Milvus Distributed 可部署在 Kubernetes 集群上，采用云原生架构，专为十亿规模甚至更大的场景而设计。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;对于 Milvus 部署模式的选择，可以取决于项目的阶段和规模。简单地，可以通过图3-4这张规模图来进行选择。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.4 Qwen3 Embedding 模型介绍</title>
				<link>https://mlwithme.github.io/agent/chapter03/ff27306c0d7b4387/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/agent/chapter03/ff27306c0d7b4387/</guid>
				<description>&lt;h1 id=&#34;34-qwen3-embedding-模型介绍&#34;&gt;3.4 Qwen3 Embedding 模型介绍&lt;a class=&#34;anchor&#34; href=&#34;#34-qwen3-embedding-%e6%a8%a1%e5%9e%8b%e4%bb%8b%e7%bb%8d&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在完成 Milvus 向量数据库的安装以后，下一步我们将开始介绍如何使用千问 Qwen3 Embedding 系列词嵌入模型来对文本进行向量化。下面先直接介绍其使用方法，然后再对其中的原理做一个简单地介绍，以便更好地设置相关参数获得合适的词向量结果。&lt;/p&gt;&#xA;&lt;h2 id=&#34;341-dashscopeembeddings-使用示例&#34;&gt;3.4.1 DashScopeEmbeddings 使用示例&lt;a class=&#34;anchor&#34; href=&#34;#341-dashscopeembeddings-%e4%bd%bf%e7%94%a8%e7%a4%ba%e4%be%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在第2.4节内容中，我们已经简单介绍了通过 dashscope 原生 SDK、OpenAI SDK 以及 &lt;code&gt;langchain_community &lt;/code&gt; 的方式来使用 Qwen3 Embedding 模型的使用方法。总结起来就是，直接使用 dashscope 原生 SDK 这种方式能够获得 Embedding 完整的能力， &lt;code&gt;langchain_community &lt;/code&gt; 其次，OpenAI SDK  则最差只能使用基本功能。&lt;/p&gt;&#xA;&lt;p&gt;之所以会有不同的途径来使用 Qwen3 Embedding 模型，本质原因还是我们在上一章提到的先入为主，以及为了适配其它集成框架，如 LangChain 生态。&lt;/p&gt;&#xA;&lt;p&gt;在后续介绍中，我们也将使用 &lt;code&gt;langchain_community.embeddings&lt;/code&gt; 模块中的 &lt;code&gt;DashScopeEmbeddings&lt;/code&gt; 模块来完成文本的向量化过程，这是千问专门为适配 LangChain 生态所开发的。同时，整个向量化过程已经被 LangChain 高度集成，不用我们手动去转换每一篇文档，这也是使用 LangChain 开发 RAG 的便携之处。&lt;/p&gt;&#xA;&lt;p&gt;通过 LangChain 访问 dashscope 访问方式如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;test_LangChain_dashscope_embedding&lt;/span&gt;(input_text):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;langchain_community.embeddings&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; DashScopeEmbeddings&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     embeddings &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; DashScopeEmbeddings(model&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;text-embedding-v4&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;test_LangChain_dashscope_embedding&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     query_result &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; embeddings&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;embed_query(input_text[&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(query_result)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;     doc_results &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; embeddings&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;embed_documents(input_text)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(doc_results)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第3行是实例化一个类对象，并且指定 Embedding 模型为 &lt;code&gt;text-embedding-v4&lt;/code&gt;，它是属于Qwen3-Embedding 系列，也是目前千问最好的文本向量模型，支持维度有 2048、1536、1024（默认）、768、512、256、128、64这些。不过通过 &lt;code&gt;DashScopeEmbeddings&lt;/code&gt; 只能使用默认的 1024 维度，这也就是我们之前所说的非官方 SDK 的限制。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.5 语义搜索引擎构建</title>
				<link>https://mlwithme.github.io/agent/chapter03/303035851c5e42f2/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/agent/chapter03/303035851c5e42f2/</guid>
				<description>&lt;h1 id=&#34;35-语义搜索引擎构建&#34;&gt;3.5 语义搜索引擎构建&lt;a class=&#34;anchor&#34; href=&#34;#35-%e8%af%ad%e4%b9%89%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e6%9e%84%e5%bb%ba&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在完成 Milvus 向量数据库的安装以后，下一步将开始介绍如何使用千问 Qwen3 Embedding 系列词嵌入模型来对文本进行向量化，并构建我们自己的文本语义检索系统。&lt;/p&gt;&#xA;&lt;p&gt;由第3.1节内容可知，构建语义检索系统整体可分为读取文档、文档切块、文本向量化、存储与检索这四步，并且前三步我们已经进行了详细介绍。下面我们将以金庸先生的武侠小说作为原始文档，重点讲解最后一步：如何将文本向量存入 Milvus，并构建完整的语义检索系统。&lt;/p&gt;&#xA;&lt;h2 id=&#34;351-读取文档并切块&#34;&gt;3.5.1 读取文档并切块&lt;a class=&#34;anchor&#34; href=&#34;#351-%e8%af%bb%e5%8f%96%e6%96%87%e6%a1%a3%e5%b9%b6%e5%88%87%e5%9d%97&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在对文档进行向量化之前，首先需要将原始文本读取到程序中，并按照一定规则进行切分。这一步的核心目标是将长文本拆分为适合 embedding 模型处理的文本块。在实际工程中，一般需要先确定两个问题：① 文档的类型（txt / pdf / markdown / html 等）；② 对应的加载方式与切块策略。不同的文档类型通常需要使用不同的 &lt;code&gt;Document Loader&lt;/code&gt;，同时还要选择合适的文本切分方式。&lt;/p&gt;&#xA;&lt;p&gt;当然，最为复杂的便是如果原始文档是较为复杂的 PDF，或者干脆是扫描件的 PDF，那这部分的工作量相对来说就更大了，甚至可以专门部署一些 OCR 模型（例如最近大火的DeepSeek-OCR2、GLM-OCR、PaddleOCR-VL-1.5等）来做这件事。不过这并不属于本书的核心内容，所以假定拿到的文档相对来说是比较标准的。&lt;/p&gt;&#xA;&lt;p&gt;在本示例中，我们选择了金庸先生武侠小说 TXT 文本 （一部小说一个文本）作为原始语料。这类文本的特点是：纯文本格式、体量较大、整体按章节组织（部分做了手动调整），因此可以直接使用 LangChain 中的 &lt;code&gt;TextLoader&lt;/code&gt; 来进行加载。&lt;/p&gt;&#xA;&lt;p&gt;如下所示便是语料的示例格式：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;“金庸作品集”新序&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　小说是写给人看的。小说的内容是人。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;第一回 天涯思君不可忘&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　春游浩荡，是年年寒食，梨花时节。白锦无纹香烂漫，玉树琼苞堆雪。静夜沉沉，浮光霭霭，冷浸溶溶月。人间天上，烂银霞照通彻。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　浑似姑射真人，天姿灵秀，意气殊高洁。万蕊参差谁信道，不与群芳同列。浩气清英，仙才卓荦，下土难分别。瑶台归去，洞天方看清绝。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;第二回 武当山顶松柏长&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　两人缓步上山，直走到寺门外，竟不见一个人影。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;附录 陈世骧先生书函&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　一九六六·四·廿二&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;后记&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;　　《倚天屠龙记》是“射雕三部曲”的第三部。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从上述示例内容可以看出，每部小说的章节标题都是换行后以“第XX回”、“附录”、“后记”等关键词开头，因此我们也可以通过正则表达式来按章节内容匹配。&lt;/p&gt;&#xA;&lt;p&gt;对于原始 TXT 文本的载入，直接使用第3.1节中介绍的 &lt;code&gt;TextLoader&lt;/code&gt; 即可，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_txt_file&lt;/span&gt;(file_path&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     loader &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; TextLoader(file_path)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     docs &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; loader&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;load() &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; docs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后，第4行代码返回的 &lt;code&gt;docs&lt;/code&gt; 便是一个仅包含一个 &lt;code&gt;Document&lt;/code&gt; 类对象的列表，代表对应的一部小说。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3.6  Milvus 模块解析</title>
				<link>https://mlwithme.github.io/agent/chapter03/e1328cb23e8c412b/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/agent/chapter03/e1328cb23e8c412b/</guid>
				<description>&lt;h1 id=&#34;36--milvus-模块解析&#34;&gt;3.6  Milvus 模块解析&lt;a class=&#34;anchor&#34; href=&#34;#36--milvus-%e6%a8%a1%e5%9d%97%e8%a7%a3%e6%9e%90&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在上一节内容中，我们详细介绍了如何从零来构建一个语义检索系统，包括读取文档、文档切块、文本向量化和存储与检索这四步。不过细心的读者可能会发现，我们在使用 LangChain 中的 &lt;code&gt;Milvus&lt;/code&gt; 创建向量数据库的时候，除了指定集合名称（其实这个也可以不用指定）外，其它例如 Schema 创建、索引创建、集合创建等操作我们都没执行，但最终看到的结果却是一切都能正常使用。&lt;/p&gt;&#xA;&lt;p&gt;虽然说起来我们可以用一句话——因为框架都帮我们做了——来解释，但是为了能够更加清晰地掌握 LangChain 框架的使用，这篇文章我们带着大家来简单看一下整个内部的处理流程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;361-milvus-类初始化&#34;&gt;3.6.1 &lt;code&gt;Milvus&lt;/code&gt; 类初始化&lt;a class=&#34;anchor&#34; href=&#34;#361-milvus-%e7%b1%bb%e5%88%9d%e5%a7%8b%e5%8c%96&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;首先，我们先通过 LangChain 中 &lt;code&gt;Milvus&lt;/code&gt; 类初始化方法中的常见参数来一窥整个全貌，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;Milvus&lt;/span&gt;(VectorStore):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;__init__&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;         &lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         embedding_function: Optional[Union[EmbeddingType, List[EmbeddingType]]],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;         collection_name: &lt;span style=&#34;color:#007020&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;LangChainCollection&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;         collection_description: &lt;span style=&#34;color:#007020&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;         text_field: &lt;span style=&#34;color:#007020&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; TEXT_FIELD,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;         vector_field: Union[&lt;span style=&#34;color:#007020&#34;&gt;str&lt;/span&gt;, List[&lt;span style=&#34;color:#007020&#34;&gt;str&lt;/span&gt;]] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; VECTOR_FIELD,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;         primary_field: &lt;span style=&#34;color:#007020&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; PRIMARY_FIELD,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;         auto_id: &lt;span style=&#34;color:#007020&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;11&lt;/span&gt;         drop_old: Optional[&lt;span style=&#34;color:#007020&#34;&gt;bool&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt;         enable_dynamic_field: &lt;span style=&#34;color:#007020&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;13&lt;/span&gt;         index_params: Optional[Union[&lt;span style=&#34;color:#007020&#34;&gt;dict&lt;/span&gt;, List[&lt;span style=&#34;color:#007020&#34;&gt;dict&lt;/span&gt;]]] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第4行指定使用的词嵌入模型，例如 &lt;code&gt;DashScopeEmbeddings()&lt;/code&gt; 对应的实例化对象。第5~6行分别指定集合的名称和对应集合的描述信息，其中 &lt;code&gt;collection_name&lt;/code&gt; 的默认值便是 &lt;code&gt;&amp;quot;LangChainCollection&amp;quot;&lt;/code&gt;。第7行指定指定原始文本的字段名，默认为 &lt;code&gt;&amp;quot;text&amp;quot;&lt;/code&gt;。第8行 &lt;code&gt;vector_field&lt;/code&gt; 表示指定向量字段的名称，默认值为 &lt;code&gt;&amp;quot;vector&amp;quot;&lt;/code&gt;；同时可以指定为一个列表是 LangChain 为多字段 Embedding 场景预留的接口。第9~10行是指定主键名称字段，默认为&lt;code&gt;&amp;quot;pk&amp;quot;&lt;/code&gt;，以及是否设定为自增。第11行是判断数据库存在时是否删除。第12行是指定是否启用动态字段，详见本章第3.3节内容。第13行指定构建索引时的参数，例如 &lt;code&gt;{&#39;index_type&#39;: &#39;FLAT&#39;, &#39;metric_type&#39;: &#39;L2&#39;, &#39;dim&#39;: &#39;2048&#39;, &#39;field_name&#39;: &#39;vector&#39;, &#39;index_name&#39;: &#39;vector&#39;}&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
