微信扫码
添加专属顾问
我要投稿
快速搭建信息检索系统,特别是在处理大量非结构化文本数据时。
通过文本嵌入来计算文档之间的相似度,提升检索的准确性和效率。
1.2、工作原理
文本嵌入:将文本数据转换为向量表示(嵌入),通常使用预训练的语言模型(如 OpenAI 的 Embeddings API)。
向量存储:将生成的嵌入存储在高效的向量数据库中,如 FAISS。
相似度搜索:根据用户的查询文本生成查询向量,并在向量存储中查找与查询向量最相似的文档。
1.3、处理流程
文本预处理:对输入的文本进行清洗和标准化处理。
生成嵌入:使用嵌入模型将文本转换为高维向量。
存储嵌入:将生成的嵌入存储在向量数据库中,每个嵌入对应一个文档。
查询处理:用户输入查询文本后,同样使用嵌入模型将其转换为查询向量。
相似度搜索:在向量数据库中查找与查询向量最相似的嵌入,并返回对应的文档。
构建简单的问答系统:例如,企业内部的员工知识库,通过查询获取相关的文档或信息。
搜索引擎:为大规模的文档或商品数据库提供精准的搜索服务。
内容推荐系统:根据用户的历史行为和查询进行个性化推荐。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建商品列表(模拟文档)
products = [
Document(page_content="这款智能手机拥有强大的处理器和高清摄像头。"),
Document(page_content="这款笔记本电脑轻薄便携,适合商务旅行。"),
Document(page_content="这款智能手表支持健康监测和消息提醒。")
]
# 创建向量存储
vectorstore = FAISS.from_documents(products, embeddings)
# 查询向量存储
query = "最好的智能手机"
results = vectorstore.similarity_search(query, k=2)
# 打印结果
for doc in results:
print(doc.page_content)
当原始文档非常庞大时,可以检索完整的原始文档或较大的信息块,保持信息的上下文和完整性。
避免仅返回文档的部分内容,确保信息完整性。
2.2、工作原理
文档分割:将大文档分割成多个小段落,并为每个段落生成嵌入。
存储嵌入和元数据:存储这些嵌入及其所属的父文档信息(如文档ID)。
相似度搜索:根据查询文本生成查询向量,在向量存储中查找最相似的段落,并返回其父文档。
2.3、处理流程
文档分割:将长文档分割成多个段落,每个段落作为一个独立的文档单元。
生成嵌入:使用嵌入模型将每个段落转换为嵌入。
存储嵌入和元数据:将嵌入及其所属的父文档ID存储在向量数据库中。
查询处理:用户输入查询文本后,使用嵌入模型将其转换为查询向量。
相似度搜索:在向量数据库中查找与查询向量最相似的嵌入,并返回对应的父文档。
法律文档检索:在法律行业中,用户经常需要查找一条法律条文的所有相关内容,包括子条款、解释等。
研究报告检索:在科研领域,用户常常需要通过检索找到与特定研究方向相关的多篇论文或报告。
大型文档的信息提取:例如,针对大量的企业文件或合同,检索系统需要返回与查询条件最相关的完整文档。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
from langchain.retrievers import ParentDocumentRetriever
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建法律文档列表(模拟文档)
legal_documents = [
Document(page_content="《公司法》第5条规定了公司设立的条件。",
metadata={"parent_doc_id": "doc1"}),
Document(page_content="《公司法》第10条规定了公司董事会的职能。",
metadata={"parent_doc_id": "doc1"})
]
# 创建向量存储
vectorstore = FAISS.from_documents(legal_documents, embeddings)
# 创建父文档检索器
retriever = ParentDocumentRetriever(vectorstore=vectorstore, docstore=vectorstore.docstore)
# 查询父文档检索器
query = "公司法的设立条件"
results = retriever.get_relevant_documents(query)
# 打印结果
for doc in results:
print(doc.page_content)
精确提取特定信息,特别是在文档内部存在多个具有不同重要性的内容时。
在索引阶段对文档的不同方面进行区分,提高检索的精准度。
3.2、工作原理
多嵌入生成:为每个文档生成多个嵌入,每个嵌入代表文档的一个方面(如摘要、关键词等)。
存储嵌入和元数据:存储这些嵌入及其对应的文档信息。
相似度搜索:根据查询文本生成查询向量,在向量存储中查找最相似的嵌入,并返回对应的文档。
3.3、处理流程
多嵌入生成:为每个文档生成多个嵌入,每个嵌入代表文档的一个方面(如摘要、关键词等)。
存储嵌入和元数据:将生成的嵌入及其对应的文档信息存储在向量数据库中。
查询处理:用户输入查询文本后,使用嵌入模型将其转换为查询向量。
相似度搜索:在向量数据库中查找与查询向量最相似的嵌入,并返回对应的文档。
金融报告分析:分析复杂的财务报表,提取不同类型的信息(如收入、支出、税务等)。
科技文献检索:针对多领域、多种类的文献进行检索,提取特定领域的研究成果。
复杂文档的信息提取:例如,结合不同类型的数据(如文本、图表、财务数据等)进行分析和检索。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
from langchain.retrievers import MultiVectorRetriever
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建财务报告文档列表(模拟文档)
reports = [
Document(page_content="公司2022年净收入达到5亿,市场份额稳步增长。",
metadata={"category": "financial"}),
Document(page_content="2022年公司战略重点是拓展海外市场。",
metadata={"category": "strategy"})
]
# 创建向量存储
vectorstore = FAISS.from_documents(reports, embeddings)
# 创建多向量检索器
retriever = MultiVectorRetriever(vectorstore=vectorstore)
# 查询多向量检索器
query = "2022年财务报告"
results = retriever.get_relevant_documents(query)
# 打印结果
for doc in results:
print(doc.page_content)
用户查询不仅关注文档内容,还可能关注文档的元数据(如时间、作者等)。
通过语言模型转化自然语言查询为具体的检索条件,包括元数据过滤规则。
4.2、工作原理
查询构造:使用语言模型将用户的自然语言查询转化为具体的检索条件。
条件生成:生成的条件包括要搜索的文本内容和元数据过滤规则。
相似度搜索:根据生成的检索条件在向量存储中查找符合条件的文档。
4.3、处理流程
查询构造:用户输入自然语言查询,使用语言模型将其转化为具体的检索条件。
条件生成:生成的检索条件包括要搜索的文本内容和元数据过滤规则。
存储嵌入和元数据:将文档及其元数据存储在向量数据库中。
相似度搜索:根据生成的检索条件在向量数据库中查找符合条件的文档。
社交媒体分析:分析来自社交平台的用户评论、帖子等内容,并根据元数据(如标签、发布时间等)进行筛选。
用户行为追踪:在电商平台上,根据用户的购买历史、搜索记录等数据进行个性化推荐和查询。
元数据驱动的检索:例如,基于文档的创建者、创建时间、文档类型等元数据进行更精确的检索。
4.5、示例代码
from langchain.retrievers.self_query import SelfQueryRetriever
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains.query_constructor.base import StructuredQueryOutputParser, get_query_constructor_prompt
from langchain.llms import OpenAI
# 初始化嵌入模型和语言模型
embeddings = OpenAIEmbeddings()
llm = OpenAI()
# 创建文档列表(模拟文档)
documents = [
Document(page_content="作者:张三,发布于2022年1月,内容是关于金融的研究。",
metadata={"author": "张三", "date": "2022-01-01"}),
Document(page_content="作者:李四,发布于2022年3月,内容是关于税务的报告。",
metadata={"author": "李四", "date": "2022-03-01"})
]
# 创建向量存储
vectorstore = FAISS.from_documents(documents, embeddings)
# 创建自查询检索器
retriever = SelfQueryRetriever(
vectorstore=vectorstore,
llm=llm,
output_parser=StructuredQueryOutputParser(query_constructor_prompt=get_query_constructor_prompt())
)
# 查询自查询检索器
query = "关于税务的报告,李四作者"
results = retriever.get_relevant_documents(query)
# 打印结果
for doc in results:
print(doc.page_content)
高效的查询处理:关键词匹配检索器适用于较为简单、直接的查询任务,能够快速返回匹配的文档。
提供简单、快速的检索功能,避免了复杂模型推理的计算开销。
5.2、工作原理
初步检索:首先使用常规的向量存储检索器获取初步的检索结果。
文档压缩:在初步检索结果中进一步筛选,确保只保留最相关的部分。
相似度计算:使用嵌入模型计算文档片段的相似度,去除无关信息。
5.3、处理流程
初步检索:使用常规的向量存储检索器获取初步的检索结果。
文档压缩:在初步检索结果中进一步筛选,确保只保留最相关的部分。
相似度计算:使用嵌入模型计算文档片段的相似度,去除无关信息。
最终结果:返回经过压缩后的最相关文档片段。
文章摘要提取:例如,在新闻聚合网站中,用户可以通过关键词搜索找到相关的新闻报道。
常见问题解答(FAQ)系统:通过关键词匹配,用户可以快速检索到常见问题的答案。
客户服务自动化:客户支持系统可以通过关键词匹配检索到相关问题的解决方案。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
from langchain.retrievers import KeywordMatcherRetriever
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建新闻文档列表(模拟文档)
news_articles = [
Document(page_content="近日,全球股市下跌,原因是各国经济放缓。",
metadata={"category": "finance"}),
Document(page_content="科技行业迎来突破性发展,人工智能成为焦点。",
metadata={"category": "technology"})
]
# 创建向量存储
vectorstore = FAISS.from_documents(news_articles, embeddings)
# 创建关键词匹配检索器
retriever = KeywordMatcherRetriever(vectorstore=vectorstore)
# 查询关键词匹配检索器
query = "股市"
results = retriever.get_relevant_documents(query)
# 打印结果
for doc in results:
print(doc.page_content)
自动化合规检查和合同审查,提高效率。
通过设定明确的规则,筛选出符合条件的文档,减少人工操作的时间和成本。
6.2、工作原理
时间权重:对不同时间的文档赋予不同的权重,较新的文档权重更高,较旧的文档权重逐渐衰减。
相似度搜索:根据查询文本生成查询向量,在加权的向量存储中查找最相似的文档。
6.3、处理流程
时间权重:为每个文档分配一个时间戳,并根据时间戳计算权重。
生成嵌入:使用嵌入模型将文档转换为嵌入。
存储嵌入和时间戳:将生成的嵌入及其时间戳存储在向量数据库中。
查询处理:用户输入查询文本后,使用嵌入模型将其转换为查询向量。
相似度搜索:在加权的向量数据库中查找与查询向量最相似的嵌入,并返回对应的文档。
合规检查:例如,在银行系统中,根据合规要求,系统可以检索符合特定条件的文档,如符合反洗钱法规的交易记录。
合同审查:通过规则检索器,自动化检查合同条款是否符合公司政策或法律要求。
招聘信息筛选:基于规则筛选符合特定要求的简历或职位描述。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
from langchain.retrievers import RuleBasedRetriever
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建合同文档列表(模拟文档)
contracts = [
Document(page_content="合同1:金额100万,签约方甲方是公司A。",
metadata={"contract_value": "100万", "party": "公司A"}),
Document(page_content="合同2:金额50万,签约方甲方是公司B。",
metadata={"contract_value": "50万", "party": "公司B"})
]
# 创建向量存储
vectorstore = FAISS.from_documents(contracts, embeddings)
# 定义筛选规则:金额大于等于100万,甲方是公司A
def filter_rule(doc):
return doc.metadata['contract_value'] == "100万" and doc.metadata['party'] == "公司A"
# 创建基于规则的检索器
retriever = RuleBasedRetriever(vectorstore=vectorstore, filter_func=filter_rule)
# 查询基于规则的检索器
query = "金额100万,甲方公司A"
results = retriever.get_relevant_documents(query)
# 打印结果
for doc in results:
print(doc.page_content)
处理带有明确层级关系的文档,帮助用户快速查找到所需的具体文档或信息。
在多层级的文档管理系统中,提高检索效率,避免检索混乱。
7.2、工作原理
子查询生成:从初始查询出发,生成多个相关的子查询。
多检索:分别检索每个子查询的结果。
结果综合:综合所有子查询的结果,返回最相关的文档。
7.3、处理流程
子查询生成:从用户的初始查询出发,使用语言模型生成多个相关的子查询。
多检索:分别使用每个子查询在向量存储中进行检索。
结果综合:综合所有子查询的结果,根据相似度评分返回最相关的文档。
文档管理系统:在企业的文档管理系统中,层级检索器可以根据文档的类别或子类别进行精确检索。
项目管理:在项目管理工具中,通过层级检索可以精确找到项目中的子任务、报告或文档。
FAQ 系统:通过层级结构来管理问题和答案,用户可以按问题类别检索。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
from langchain.retrievers import HierarchicalRetriever
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建项目阶段文档列表(模拟文档)
project_documents = [
Document(page_content="设计阶段文档:项目规划和设计图纸。",
metadata={"phase": "设计"}),
Document(page_content="施工阶段文档:施工进度报告。",
metadata={"phase": "施工"})
]
# 创建向量存储
vectorstore = FAISS.from_documents(project_documents, embeddings)
# 创建层级检索器
retriever = HierarchicalRetriever(vectorstore=vectorstore, hierarchy_field="phase")
# 查询层级检索器
query = "设计阶段文档"
results = retriever.get_relevant_documents(query)
# 打印结果
for doc in results:
print(doc.page_content)
图谱检索器使用图谱数据结构来进行信息检索。文档与文档之间、文档与查询之间的关系通过图的结构来表示。通过图的连接,检索器可以高效地发现和利用文档之间的相关性。
假设你在开发一个医学信息检索系统,用户可以根据症状或疾病查询相关的药物和治疗方法。通过构建一个包含疾病、症状和药物之间关系的图谱,你可以使用图谱检索器来快速定位相关的医学信息,并给出精确的查询结果。
通过关系和结构化数据提供更为精准的检索。
适用于知识图谱的场景,在复杂的知识库中提取有价值的信息。
8.2、工作原理
多检索器组合:结合多个检索器的优点,采用混合搜索的方式。
多策略检索:可以同时使用关键词匹配和语义相似度等多种策略。
结果综合:根据查询文本,从多个检索器中获取结果,并综合所有结果。
8.3、处理流程
多检索器组合:结合多个检索器的优点,如向量存储检索器、父文档检索器等。
多策略检索:可以同时使用关键词匹配和语义相似度等多种策略。
结果综合:根据查询文本,从多个检索器中获取结果,并综合所有结果,返回最相关的文档。
知识图谱构建:在企业中,通过知识图谱整合不同的业务模块和信息流,构建企业的知识库。
关系型数据检索:例如,在医学领域,基于疾病、症状、药物之间的关系进行精准检索。
社交网络分析:在社交网络平台中,通过用户关系图谱来进行精准的内容推荐和社交推荐。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.schema import Document
from langchain.retrievers import GraphRetriever
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建医学知识文档列表(模拟文档)
medical_knowledge = [
Document(page_content="心脏病的常见症状包括胸痛、呼吸急促。",
metadata={"disease": "心脏病", "symptoms": "胸痛, 呼吸急促"}),
Document(page_content="高血压的治疗方法包括改变饮食和药物治疗。",
metadata={"disease": "高血压", "treatment": "饮食调整, 药物治疗"})
]
# 创建向量存储
vectorstore = FAISS.from_documents(medical_knowledge, embeddings)
# 创建图谱检索器
retriever = GraphRetriever(vectorstore=vectorstore, graph_structure={"disease": "treatment"})
# 查询图谱检索器
query = "高血压的治疗方法"
results = retriever.get_relevant_documents(query)
# 打印结果
for doc in results:
print(doc.page_content)
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-27
AI 写代码总是翻车?Upstash 创始人怒推 Context7:给 LLM 喂上最新鲜的官方文档。
2025-04-26
葵花宝典之「知识库」调优秘籍!RAG优化指南!
2025-04-26
RagFlow文档解析过程分析
2025-04-26
深度学习!构建基于LangGraph的RAG多智能体研究工具。
2025-04-26
用RAG与Agent提升企业问答效率:我的AI实践之路
2025-04-26
理解 RAG 第一部分:为什么需要它
2025-04-26
理解 RAG 第三部分:融合检索与重新排序
2025-04-26
理解 RAG 第四部分:检索增强生成评估框架
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-04-26
2025-04-25
2025-04-22
2025-04-22
2025-04-20
2025-04-19
2025-04-18
2025-04-16