chapter1 向量究竟是什么?

本文探讨了不同学科背景下的向量理解方式,包括物理、数学及计算机专业的视角,并介绍了向量的基本运算如向量加法与数乘等概念。

接下来的一段时间,我都是以线性代数为内容

这只是学习记录,记录而已。

想看原视频,请点击原文。


向量究竟是什么?

在不同的学生眼里
(1)物理专业学生:就是一个箭头啊,有方向有长度。↑↓←→

(2)数学专业学生:一个坐标系中的箭头。这里写图片描述 =(p1,p2,p3)

(3)计算机专业学生:不就是数组么?这里写图片描述

向量的加法:向量的移动,可以看做数轴上加法的拓展。

向量的数乘:对向量进行拉伸或者压缩,称为缩放。


是哦,虽然表现形式不一样,但都是向量,大家高中都学过吧?

那么,很多关于向量的性质就不言而喻了吧?例如向量的加法与向量的数乘什么的。

好吧,大家下去感受感受。

还是继续推3Blue1Brown的《线性代数的本质》(微信用户请点击阅读原文)


<think>好的,我现在要解决用户的问题:如何使用LangChain将按章节分块的文档嵌入到向量数据库的具体实现方法。用户之前已经询问过按章节分块的方法,现在想进一步了解嵌入到向量数据库的步骤。 首先,我需要回顾之前的对话。用户之前得到了一个使用RecursiveCharacterTextSplitter按章节分块的代码示例,现在需要将分块后的内容进行嵌入并存储到向量数据库。根据用户提供的引用内容,特别是引用[2]和引用[3],用户可能需要一个完整的流程,包括加载文档、分块、嵌入、存储到向量数据库,以及查询的示例。 接下来,我需要确定用户的具体需求。他们可能希望有一个端到端的代码示例,涵盖从分块到存储的每一步,可能还涉及不同向量数据库的选择,比如FAISS或Chroma。用户还可能关心如何保留章节的元数据,这在检索时可能有帮助。 然后,考虑用户可能遇到的潜在问题。例如,如何处理不同格式的章节标题,如何调整分块大小,或者如何选择合适的嵌入模型。引用[2]提到使用本地模型(m3e-base),所以可能需要展示如何配置本地嵌入模型,比如HuggingFaceEmbeddings。 另外,用户可能需要了解如何将分块后的文档与向量数据库集成,确保每个块都被正确嵌入和存储。需要确保代码示例中的每一步都清晰,包括加载文档、分块、初始化嵌入模型、创建向量库,以及保存和加载向量库的方法。 还需要考虑用户提到的引用内容中的信息,比如离线运行、支持本地存储,这些可能在代码中需要体现,比如使用本地嵌入模型和本地向量数据库存储路径。 最后,确保回答的结构清晰,分步骤说明,并提供相关问题以帮助用户深入理解可能遇到的扩展问题,比如如何处理分块后的元数据,如何优化检索结果等。需要验证代码示例的正确性,比如导入的模块是否正确,参数是否合理,以及是否包含必要的注释帮助用户理解。</think>以下是使用LangChain实现按章节分块的文档嵌入向量数据库的完整代码示例,包含分块、嵌入、存储全流程: ```python from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_loaders import TextLoader from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS # 1. 加载文档 loader = TextLoader("legal_doc.txt", encoding="utf-8") documents = loader.load() # 2. 按章节分块(增强正则表达式) chapter_splitter = RecursiveCharacterTextSplitter( separators=[ r'\n第[一二三四五六七八九十百零]+章\s+[\u4e00-\u9fa5]+', # 匹配"第X章 标题" r'\n\d+\.\d+\.?\d*\s+[\u4e00-\u9fa5]+', # 匹配"1.1.1 标题" r'\n(?:附录|附件)\s+[A-Za-z0-9]+' # 匹配附录/附件 ], chunk_size=1500, # 根据实际章节长度调整 chunk_overlap=50, # 章节间保留少量重叠 keep_separator=True, add_start_index=True # 保留原始位置信息[^2] ) chunks = chapter_splitter.split_documents(documents) # 3. 初始化嵌入模型(使用本地模型) embed_model = HuggingFaceEmbeddings( model_name="m3e-base", model_kwargs={'device': 'cpu'}, # GPU可用时改为'cuda' cache_folder="./models" # 本地模型存储路径[^2] ) # 4. 创建向量库 vector_db = FAISS.from_documents( documents=chunks, embedding=embed_model, metadatas=[{"source": "法律文档", "chapter": f"第{i+1}章"} for i in range(len(chunks))] # 添加元数据[^1] ) # 5. 持久化存储 vector_db.save_local( folder_path="./vector_db/legal_doc", index_name="legal_index" ) # 6. 加载测试 loaded_db = FAISS.load_local( folder_path="./vector_db/legal_doc", embeddings=embed_model, index_name="legal_index" ) # 示例查询 query = "合同法中对违约责任的认定标准是什么?" results = loaded_db.similarity_search(query, k=3) print(f"=== 相关章节检索结果 ===") for doc in results: print(f"章节位置:{doc.metadata['chapter']}") print(f"内容摘要:{doc.page_content[:150]}...\n") ``` 关键实现要点: 1. **分块增强**:正则表达式支持多级标题(如1.1.2),添加`add_start_index`保留原始位置 2. **元数据保留**:为每个分块添加章节编号和文档来源信息[^1] 3. **本地化部署**:使用m3e-base中文嵌入模型和FAISS向量库实现完全离线运行[^2] 4. **检索优化**:相似度搜索返回前3个最相关结果,展示章节元数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值