节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.
针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。
汇总合集:《大模型实战宝典》(2024版)正式发布!
喜欢本文记得收藏、关注、点赞,文末可参与技术交流
你知道吗?MongoDB Atlas 现在提供了强大的向量搜索功能。现在你可以对数据进行语义搜索,并为大型语言模型(LLM)应用实现检索增强生成(RAG)。
通过将 Atlas 向量搜索与 LangChain、LlamaIndex 和客户端库等流行框架集成,你可以轻松构建高级自然语言处理(NLP)解决方案。
本文将探讨如何利用 MongoDB Atlas 向量搜索进行语义搜索和 RAG。
学习目标
- 理解向量搜索的概念及其在自然语言处理和信息检索中的应用。
- 学习如何将 MongoDB Atlas Vector Search 与 LangChain 框架集成,以构建检索增强生成(RAG)应用。
- 掌握构建 RAG 链的能力,结合向量搜索检索、提示模板和大型语言模型(LLM)生成上下文感知的响应。
- 了解使用 MongoDB Atlas Vector Search 作为向量存储的好处,包括效率、一致性、可扩展性和简易性。
- 探索 LangChain 的灵活性和可扩展性,学习有关检索过程、LLM 提供者等的自定义选项。
什么是向量搜索?
向量搜索,也称为语义搜索,是一种超越传统基于关键词搜索的技术。它利用机器学习模型将文本、音频或图像等数据转换为称为嵌入的高维向量表示。这些嵌入捕捉数据的语义意义,使您能够根据向量空间中的接近度找到相似的内容,即使具体的词语不匹配。
向量搜索的核心优势在于它能够理解查询背后的意图和上下文,使其在搜索引擎、推荐系统和语言模型等各种应用中非常有用。
集成 MongoDB Atlas 向量搜索
MongoDB Atlas 是一种完全托管的云数据库服务,现在原生支持向量搜索。通过将向量嵌入与您的数据一起存储在 MongoDB 中,您可以在不需要单独的向量存储的情况下执行高效的语义搜索,从而确保数据一致性并简化应用程序架构。
通常过程包括:
- 将您的数据加载到 MongoDB Atlas 集群中。
- 使用预训练模型(如 OpenAI 的 text-embedding-ada-002)为您的数据生成向量嵌入。
- 将嵌入与您的数据一起存储在 MongoDB 中。
- 在嵌入字段上创建 Atlas 向量搜索索引。
- 使用 Atlas 强大的 $vectorSearch 聚合管道阶段运行向量搜索查询。
前提条件: 要将 Atlas 向量搜索与 LangChain 集成,您需要一个运行 MongoDB 6.0.11、7.0.2 或更高版本的 Atlas 集群,一个 OpenAI API 密钥(或替代的 LLM 提供商),以及一个运行项目的 Python 环境。
LangChain 集成
LangChain 是一个用 Python 编写的开源框架,旨在简化由大型语言模型(LLM)驱动的应用程序的开发。它提供了模块化和可扩展的架构,使开发者可以通过组合称为“链”的可重用组件来构建复杂的工作流。
LangChain 的一个关键特性是其对检索增强生成(RAG)的支持,这是一种将 LLM 的强大功能与外部数据源相结合的技术。通过将 MongoDB Atlas 向量搜索与 LangChain 集成,开发者可以利用 MongoDB 作为高性能的向量数据库,实现高效的语义搜索和 RAG 实现。
这种集成允许开发者:
- 使用 LangChain 的模块化架构轻松构建和管理复杂的 NLP 应用。
- 通过 Atlas 向量搜索实现高效的语义搜索,利用向量嵌入来增强 LLM 的生成能力。
- 在构建 RAG 应用时,结合向量搜索、提示模板和 LLM,以生成上下文感知的响应。
集成过程通常包括以下步骤:
第一步:设置环境
安装所需的 Python 包,包括 langchain
、langchain-mongodb
和 langchain-openai
。
定义环境变量,例如 OpenAI API 密钥和 Atlas 集群连接字符串。
import os
import getpass
from langchain_mongodb import MongoDBAtlasVectorSearch
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
ATLAS_CONNECTION_STRING = getpass.getpass("MongoDB Atlas SRV Connection String:")
第二步:使用 Atlas 作为向量存储
使用提供的连接字符串连接到 Atlas 集群。
将数据加载到 Atlas 中,可以直接插入文档或使用 LangChain 的内置数据加载器加载各种文件格式(如 PDF、CSV、JSON)。
使用 LangChain 的文本拆分器将数据拆分成较小的块或文档。
使用 MongoDBAtlasVectorSearch
类实例化 Atlas 作为向量存储,指定集合和索引名称。
使用预训练模型(如 OpenAI 的 text-embedding-ada-002
)为数据生成向量嵌入。
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 从 PDF 加载数据
loader = PyPDFLoader("https://example.com/document.pdf")
data = loader.load()
# 将数据拆分成文档
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
docs = text_splitter.split_documents(data)
第三步:创建 Atlas 向量搜索索引
定义 Atlas 向量搜索索引架构,指定向量字段(例如 “embedding”)和任何附加的过滤字段。
使用 Atlas UI 或 MongoDB Atlas Search API 在 Atlas 集合上创建索引。
# 实例化 Atlas 作为向量存储
from pymongo import MongoClient
client = MongoClient(ATLAS_CONNECTION_STRING)
atlas_collection = client["langchain_db"]["documents"]
vector_search = MongoDBAtlasVectorSearch.from_documents(
documents=docs,
embedding=OpenAIEmbeddings(),
collection=atlas_collection,
index_name="vector_index"
)
第四步:运行向量搜索查询
使用 LangChain 的 MongoDBAtlasVectorSearch.as_retriever
方法将 Atlas 向量搜索实例化为语义搜索的检索器。
执行各种类型的向量搜索查询,例如基本语义搜索、带相关性评分的搜索或带元数据过滤的搜索。
query = "MongoDB Atlas security"
results = vector_search.similarity_search(query)
第五步:实现 RAG
定义一个提示模板,指示 LLM 使用检索到的文档作为生成响应的上下文。
通过结合 Atlas 向量搜索检索器、提示模板和 LLM(如 OpenAI 的 ChatGPT)构建 RAG 链。
使用查询提示 RAG 链,它将从 Atlas 中检索相关文档,将它们传递给 LLM,并生成上下文感知的响应。
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
# 定义提示模板
template = """Use the following context to answer the question:
Context: {context}
Question: {question}"""
prompt = PromptTemplate(template=template, input_variables=["context", "question"])
# 创建 RAG 链
rag = RetrievalQA.from_chain_type(
llm=ChatOpenAI(),
chain_type="stuff",
retriever=vector_search.as_retriever(),
prompt=prompt)
# 提问
query = "How can I secure my MongoDB Atlas cluster?"
result = rag({"query": query})
print(result['result'])
LangChain 提供了高度的灵活性和可扩展性,允许开发者根据具体需求自定义与 Atlas 向量搜索的集成。例如,您可以通过调整检索文档的数量、相关性评分阈值或用于排名的相似性度量来优化检索过程。
虽然这种集成主要关注 MongoDB Atlas 向量搜索,LangChain 还支持各种向量数据库和搜索引擎,包括 Chroma、Weaviate 和 Pinecone 等。此外,LangChain 支持多种 LLM 提供商,如 OpenAI、Anthropic、Cohere 等,使您可以轻松利用不同的语言模型进行 RAG 实现。
通过结合 LangChain 的模块化架构和 MongoDB Atlas 向量搜索的高效语义搜索功能,开发者可以构建复杂的自然语言处理应用,这些应用能够理解上下文、检索相关信息并生成有信息的响应,同时利用 MongoDB 文档数据库的可扩展性和一致性。
LlamaIndex 集成
LlamaIndex 是另一个开源框架,旨在简化自定义数据源与 LLM 的集成。它提供了加载和准备向量嵌入的工具,支持 RAG 实现。通过将 Atlas 向量搜索与 LlamaIndex 集成,您可以使用 MongoDB 作为向量存储,检索语义相似的文档以增强 LLM 的知识。
该过程包括设置 Atlas 集群,将数据加载到 LlamaIndex 索引中,并使用 MongoDBAtlasVectorSearch 向量存储将向量嵌入存储在 MongoDB 中。然后,您可以使用 LlamaIndex 的 VectorIndexRetriever 运行语义搜索,并利用查询引擎根据检索到的文档生成上下文感知的响应。
客户端库集成
除了流行的框架之外,您还可以使用 MongoDB 的官方客户端库将 Atlas 向量搜索直接集成到您的应用程序中。这种方法包括为您的数据生成向量嵌入(例如,使用 OpenAI API),将它们存储在 MongoDB 中,创建向量搜索索引,并从应用程序代码中运行 $vectorSearch 查询。
例如,使用 Node.js 客户端库,您可以设置一个 Atlas 触发器,使用 OpenAI API 自动为新文档生成嵌入。然后,它可以创建一个向量搜索索引,并使用 $vectorSearch 聚合管道阶段执行语义搜索。
使用 MongoDB 进行向量搜索的好处
集成向量搜索功能与 MongoDB Atlas 提供了几个关键好处:
效率:通过将向量与数据一起存储,您避免了在应用程序数据库和单独的向量存储之间进行同步的需要。这提高了性能并简化了架构。
一致性:将嵌入与原始数据一起存储,确保即使向量生成过程随时间变化,向量也始终与正确的数据关联。
可扩展性:MongoDB Atlas 提供水平和垂直可扩展性,使您能够无缝处理高要求的向量搜索工作负载。
简易性:使用单个数据库存储数据和向量嵌入,减少了应用程序的复杂性和潜在的故障点。
托管服务:MongoDB Atlas 是一种完全托管的云数据库服务,因此它减轻了操作负担,使您能够专注于构建应用程序。
向量搜索和 RAG 的应用场景
向量搜索和 RAG 在各个行业和领域都有广泛的应用,包括:
智能搜索引擎:提供更相关和上下文感知的搜索结果,即使用户的查询含糊不清或不精确。
客户支持:构建能够理解自然语言查询并利用相关知识库提供准确、上下文感知响应的聊天机器人和虚拟助手。
电子商务和推荐系统:通过理解用户偏好和查找语义相似的商品来改进产品推荐。
内容分析:在大数据集中识别相似内容,这有助于完成如剽窃检测、内容重复删除和主题聚类等任务。
生物医学研究:通过基于语义相似性查找相关的科学文献和数据,加速药物发现和医学研究。
结论
MongoDB Atlas 向量搜索为构建能够理解上下文和意图的高级 NLP 应用程序开辟了令人兴奋的可能性。通过与 LangChain 和 LlamaIndex 等流行框架集成,或利用客户端库,您可以轻松实现语义搜索和 RAG 功能。试试看,解锁应用程序中智能和相关性的新层次!
技术交流群
前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
我们建了算法岗技术与面试交流群, 想要获取最新面试题、了解最新面试动态的、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。
方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:技术交流
用通俗易懂方式讲解系列
-
《大模型面试宝典》(2024版) 正式发布!
-
《大模型实战宝典》(2024版)正式发布!
-
用通俗易懂的方式讲解:自然语言处理初学者指南(附1000页的PPT讲解)
-
用通俗易懂的方式讲解:1.6万字全面掌握 BERT
-
用通俗易懂的方式讲解:NLP 这样学习才是正确路线
-
用通俗易懂的方式讲解:28张图全解深度学习知识!
-
用通俗易懂的方式讲解:不用再找了,这就是 NLP 方向最全面试题库
-
用通俗易懂的方式讲解:实体关系抽取入门教程
-
用通俗易懂的方式讲解:灵魂 20 问帮你彻底搞定Transformer
-
用通俗易懂的方式讲解:图解 Transformer 架构
-
用通俗易懂的方式讲解:大模型算法面经指南(附答案)
-
用通俗易懂的方式讲解:十分钟部署清华 ChatGLM-6B,实测效果超预期
-
用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain
-
用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统
-
用通俗易懂的方式讲解:最全的大模型 RAG 技术概览
-
用通俗易懂的方式讲解:利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序
-
用通俗易懂的方式讲解:使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA
-
用通俗易懂的方式讲解:面了 5 家知名企业的NLP算法岗(大模型方向),被考倒了。。。。。
-
用通俗易懂的方式讲解:NLP 算法实习岗,对我后续找工作太重要了!。
-
用通俗易懂的方式讲解:理想汽车大模型算法工程师面试,被问的瑟瑟发抖。。。。
-
用通俗易懂的方式讲解:基于 Langchain-Chatchat,我搭建了一个本地知识库问答系统
-
用通俗易懂的方式讲解:面试字节大模型算法岗(实习)
-
用通俗易懂的方式讲解:大模型算法岗(含实习)最走心的总结
-
用通俗易懂的方式讲解:大模型微调方法汇总