过滤, 也叫召回,需要用到一个三方的相似性搜索库, 叫做 FAISS.
FAISS 是 Facebook AI Similarity Search 的缩写,是Facebook 团队开源的针对聚类和相似性搜索库。
我们有很多文档需要分析, 可以通过将文档转化为高维向量, 然后再从中选择最相关的一些文档, 减少分析量。
# 过滤, 也叫召回,需要用到一个三方的相似性搜索库, 叫做 FAISS.
# FAISS 是 Facebook AI Similarity Search 的缩写,
# 是 Facebook 团队开源的针对聚类和相似性搜索库。
from langchain.chains import LLMChain, SequentialChain, ConversationChain, LLMRequestsChain
from langchain.chains.question_answering import load_qa_chain
from langchain_community.chat_models import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain.schema import Document
from langchain.vectorstores.faiss import FAISS
from langchain.embeddings import OpenAIEmbeddings
import tools
tools.init()
corpus = [
"青岛市(Qingdao),山东省辖地级市,简称'青',别名'岛城''琴岛',为副省级市、计划单列市。",
"青岛市地处山东半岛南部,东经119°30′~121°00′、北纬35°35′~37°09′,东南濒临黄海,东北与烟台市毗邻,全市总面积11293平方千米,截至2023年6月辖7区、代管3县级市。",
"截至2023年末,青岛市常住人口1037.15万人。",
"青岛市属温带季风气候,市区受海洋环境影响,具有显著海洋性气候特点。",
"青岛市为海滨丘陵城市,地势东高西低,南北两侧隆起,中间低凹,胶州湾自唐宋以来即为北方重要港口,因'一港一路'发展兴盛,1930年改称青岛市,1981年列为全国经济中心城市之一,1994年成为副省级城市。",
"青岛市是五四运动缘起地,2008北京奥运会与第13届残奥会帆船比赛举办城市,也是中国近现代文化名人故居分布集中的城市之一。",
"2024年,青岛市实现地区生产总值16719.46亿元,比上年增长5.7%。"
]
documents = [Document(page_content=cp) for cp in corpus]
# 文档向量化
llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106')
embedding = OpenAIEmbeddings(model='text-embedding-ada-002')
documents_db = FAISS.from_documents(documents, embedding)
# 文档过滤, 召回最相关的 3 条
question = '介绍一下青岛市'
retrieval_documents = documents_db.similarity_search(question, k=3)
print(retrieval_documents)
chain = load_qa_chain(llm=llm, chain_type='stuff', verbose=True)
result = chain.run(input_documents=documents, question=question)
print(result)
召回方法
- 相似性搜索,只返回最相关的k条数据:
db.similarity_search(query,k=3) - 相似性搜索,并返回相似度分数,分数越小越相关:
db.similarity_search_with_score(query,k=3) - 相似性搜索,并返回相似度分数,分数越大越相关:
db.similarity_search_with_relevance_scores(query,k=3) - 最大边际搜索,优化了与查询的相似性,和文档之间的多样性:
db.max_marginal_relevance_search(query,k=3)
另外, 还有 Milvus, Pinecone 等向量数据库, 都可以实现相似性搜索的功能。这些 Langchain 都做了集成,用法上都是类似的。