LangChain结合LLM做私有化文档搜索

news/2024/9/22 6:04:34

我们知道LLM(大语言模型)的底模是基于已经过期的公开数据训练出来的,对于新的知识或者私有化的数据LLM一般无法作答,此时LLM会出现“幻觉”。针对“幻觉”问题,一般的解决方案是采用RAG做检索增强。

但是我们不可能把所有数据都丢给LLM去学习,比如某个公司积累的某个行业的大量内部知识。此时就需要一个私有化的文档搜索工具了。

本文聊聊如何使用LangChain结合LLM快速做一个私有化的文档搜索工具。之前介绍过,LangChain几乎是LLM应用开发的第一选择,它的野心也比较大,它致力于将自己打造成LLM应用开发的最大社区。自然,它有这方面的成熟解决方案。

文末,还会向朋友们推荐一款非常好用的AI机器人和LLM API超市,价格实惠又稳定,还可以领一波福利。

1. RAG检索流程

使用 LangChain 实现私有化文档搜索的主要流程,如下图所示:

文档加载 → 文档分割 → 文档嵌入 → 向量化存储 → 文档检索 → 生成回答

2. 代码实践细节

2.1. 文档加载

首先,我们需要加载文档数据。文档可以是各种格式,比如文本文件、PDF、Word 等。使用 LangChain,可以轻松地加载这些文档。下面以PDF为例:

from langchain_community.document_loaders import PyPDFLoaderloader = PyPDFLoader("./GV2.pdf")
docs = loader.load()

2.2. 文档分割

加载的文档通常会比较大,为了更高效地处理和检索,我们需要将文档分割成更小的段落或句子。LangChain 提供了便捷的文本分割工具,可以按句子、块长度等方式分割文档。

from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=50,chunk_overlap=20,separators=["\n", "。", "!", "?", ",", "、", ""],add_start_index=True,
)
texts = text_splitter.split_documents(docs)

分割后的文档内容可以进一步用于生成向量。

2.3. 文档嵌入 Embeddings

文档分割后,我们需要将每一段文本转换成向量,这个过程称为文档嵌入。文档嵌入是将文本转换成高维向量,这是相似性搜索的关键。这里我们选择OpenAI的嵌入模型来生成文档的嵌入向量。

from langchain_openai import OpenAIEmbeddingsembeddings_model = OpenAIEmbeddings(openai_api_key="sk-xxxxxxxxxxx",openai_api_base="https://api.302.ai/v1",
)txts = [txt.page_content for txt in texts]embeddings = embeddings_model.embed_documents(txts)

2.4. 文档向量化存储

接下来,我们需要将生成的向量化的文档,存入向量数据库中。向量数据库主要用来做相似性搜索,可以高效地存储和检索高维向量。LangChain 支持与多种向量数据库的集成,比如 Pinecone、FAISS、Chroma 等。

本文以FAISS为例,首先需要安装FAISS,直接使用pip install faiss-cpu安装。

from langchain_community.vectorstores import FAISSdb = FAISS.from_documents(texts, embeddings_model)
FAISS.save_local(db, "faiss_db2")

2.5. 文档检索

当用户提出问题时,我们需要在向量数据库中检索最相关的文档。检索过程是计算用户问题的向量表示,然后在向量数据库中查找与之最相似的文档。最后将找到的文档内容,拼接成一个大的上下文。

向量数据库的检索支持多种模式,本文先用最简单的,后续再出文章继续介绍别的模式。

from langchain.retrievers.multi_query import MultiQueryRetrieverretriever = db.as_retriever()
# retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"score_threshold":.1,"k":5})
# retriever = db.as_retriever(search_type="mmr")
# retriever = MultiQueryRetriever.from_llm(
#             retriever = db.as_retriever(),
#             llm = model,
#         )context = retriever.get_relevant_documents(query="张学立是谁?")_content = ""
for i in context:_content += i.page_content

2.6. 将检索内容丢给LLM作答

最后,我们需要将检索到的文档内容丢入到 prompt 中,让LLM生成回答。LangChain 可以PromptTemplate模板的方式,将检索到的上下文动态嵌入到 prompt 中,然后丢给LLM,这样可以生成准确的回答。

from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParserquestion = "张学立是谁?"
template = [("system","你是一个处理文档的助手,你会根据下面提供<context>标签里的上下文内容来继续回答问题.\n 上下文内容\n <context>\n{context} \n</context>\n",),("human", "你好!"),("ai", "你好"),("human", "{question}"),
]
prompt = ChatPromptTemplate.from_messages(template)messages = prompt.format_messages(context=_content, question=question)
response = model.invoke(messages)output_parser = StrOutputParser()
output_parser.invoke(response)

2.7. 完整代码

最后,将以上所有代码串起来,整合到一起,如下:

from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParsermodel = ChatOpenAI(model_name="gpt-3.5-turbo",openai_api_key="sk-xxxxxxx",openai_api_base="https://api.302.ai/v1",
)loader = PyPDFLoader("./GV2.pdf")
docs = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=50,chunk_overlap=20,separators=["\n", "。", "!", "?", ",", "、", ""],add_start_index=True,
)
texts = text_splitter.split_documents(docs)embeddings_model = OpenAIEmbeddings(openai_api_key="sk-xxxxxxx",openai_api_base="https://api.302.ai/v1",
)
txts = [txt.page_content for txt in texts]
embeddings = embeddings_model.embed_documents(txts)db = FAISS.from_documents(texts, embeddings_model)
FAISS.save_local(db, "faiss_db2")retriever = db.as_retriever()template = [("system","你是一个处理文档的助手,你会根据下面提供<context>标签里的上下文内容来继续回答问题.\n 上下文内容\n <context>\n{context} \n</context>\n",),("human", "你好!"),("ai", "你好"),("human", "{question}"),
]
prompt = ChatPromptTemplate.from_messages(template)question = "张学立是谁?"
context = retriever.get_relevant_documents(query=question)
_content = ""
for i in context:_content += i.page_contentmessages = prompt.format_messages(context=_content, question=question)
response = model.invoke(messages)output_parser = StrOutputParser()
output_parser.invoke(response)

2.8. 总结、推荐

通过 LangChain可以轻松实现私有化文档搜索,充分利用LLM的能力来处理和检索文档信息。按照文中的步骤,你也可以轻松实现。

好的问答系统离不开优秀的LLM,根据我的个人经验,OpenAI的大模型能力排名是Top1的。但是使用OpenAI不方便,不但需要梯子而且还不稳定。

一款好的LLM摆在面前,却用不了,着实头疼。有没有方便稳定的方式呢?当然有啦,下面我来推荐一款AI自助平台,不但有问答机器人、文生图机器人、文生视频机器人,还有常见的LLM API,稳定又还便宜。

3. 推荐一款好用的AI平台 - 302.AI

3.1. 什么是302.AI

302.AI是一个汇集全球顶级AI的自助平台,汇集全球各类顶尖AI大模型,提供多种AI机器人,各种AI工具的使用和AI API接入。

这个平台太适合开发者了,一站式配齐了 支持各种模型的工具AI API,再也不用这个网站用一下,那个网站用一下了。

自由配置机器人、自由配置各种模型,每一款都很能打。

3.2. 302.AI的优势

我为什么愿意使用302.AI呢?主要还是有点比较多:

  • 功能全面:平台提供了各种机器人,其中包括不限于文字处理,图片处理,声音处理。 这一点就可以轻松应付我们平时的工作了,无需到处找AI工具网站。总之,平台提供的机器人,工具和API多种使用方法,可以满足从小白到开发者多种角色的需求。
  • 精选优质大模型:平台帮用户测试市面上众多的AI模型,挑出最好用的模型接入到平台,简化用户的挑选成本。而且再大模型的API调用处,还很贴心的集成了Apifox,在线调试,自动生成多种语言的代码。
  • 价格透明价格便宜:价格透明,token计算清晰,我对比过多个代理的价格,302.AI绝对是最便宜的,没有之一。
  • 按需付费,零门槛:302.AI另外一个特点是,不像大部分的AI工具网站按月收费或者按年收费,302.AI是按需付费,用多少付多少,价格便宜又透明,计费清晰,更无须担心跑路。这两年我见过的倒闭的AI工具站太多了。
  • 管理者和使用者分离:使用者无需关心复杂的AI设置,让懂AI的管理者来配置,配置完毕后分享给使用者,简化使用流程。小白也可简易使用。更无需使用梯子,方便又稳定。
  • 稳定性好:从我最近的使用感受来看,整体还是比较稳定的。不像有些API,时不时的给我冒一个配额不足的情况。

下面上几个截图,功能较多,我就不一一解说了,欢迎朋友们自行尝试。

总之,302.AI是一个可以满足从工具到API的聚合AI网站,也是一个可以满足从小白到开发者的需求的AI网站,同时,又兼顾了稳定性和性价比。更多功能,欢迎朋友们自行尝试解锁。

3.3. 粉丝福利

我这边创建了AI全能工具箱分享给大家体验,每天都会有 5美元额度,先到先用。

AI全能工具箱链接:https://aitoolbox1-all.tools302.com?pwd=0658 分享码0658,注册完填写个问卷会得到1美元的试用额度。

对于开发者朋友,可以私信我获取免费token,薅一波羊毛。

=====>>>>>> 关于我 <<<<<<=====

本篇完结!欢迎点赞 关注 收藏!!!

原文链接:https://mp.weixin.qq.com/s/idLmCB8OXwtJIqAqfgBxuQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/46760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

深入分析四层/七层网关

1 简要介绍 随着云计算、大数据和物联网技术的迅猛发展,网络通信的复杂性和需求日益增加。在这种背景下,网关技术作为网络通信中的重要组成部分,扮演着关键的角色。 作为连接不同网络或协议的桥梁,四层网关和七层网关是两种常见且重要的类型。本文将对这两种网关进行深入分…

dotnet C# 使用 using 关键字释放 IDisposable 的结构体是否会装箱

在 C# 里面的 using 关键字可以非常方便调用 IDisposable 接口的 Dispose 方法,进行一些资源的释放或实现有趣的逻辑的执行配合 using 关键字使用的类型需要继承 IDisposable 接口,根据基础的 C# 知识,大家都知道 using 关键字其实会自动在 IL 层拆开为在 finally 里面调用 …

VSCode修改扩展和用户文件夹目录位置(Windows)

原文链接:https://blog.csdn.net/weixin_53510183/article/details/126906182 文章目录`VSCode`便携版(不推荐)缺点`VSCode`安装版(推荐)终端使用`code .` 命令打开项目 问题解决办法终极解决办法!(强烈推荐)vscode的扩展和用户数据都是默认在C盘下的 extensions:C:\Users\.vs…

k8s resource的管理

NRI:下一代节点细粒度资源控制方案 There is a presentation from Alexander Kanevskiy and Krisztian Litkey (芬兰team)。https://github.com/containerd/nri/graphs/contributors Litkey 贡献第一。 但不是第一个贡献者。 https://kccnceu2021.sched.com/event/iE1Y/maxim…

第一阶段打分表和下一阶段目标

第一阶段打分表和下一阶段目标下一阶段目标:优化识别结,添加具体鱼类和原因,添加举报店家的拍照功能

windows中运行nicegui官网内容

内容受到bilibili视频nicegui官网访问不了?教你本地部署文档,我写python终于有界面启发,其余部分由chatgpt协助生成。 1. 在本地新建目录如 nicegui_web 2. 从gitee下载nicegui到 nicegui_web (因为github可能网络比较慢,所以用gitee上同步过来的代码) git clone https://g…

[JavaScript]何为变量提升?

本篇文章标题即摘要,就不赘述。 如果文中有不妥或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18252500 出自【进步*于辰的博客】关于编译与解释,详述可查阅博文《[Java]知识点》中的【编译…

第一章 递归问题 学习笔记

河内塔问题有 \(3\) 根柱子和 \(n\) 个圆盘,我们可以把最顶上的圆盘移到另外的柱子上,但不可以把大的圆盘放在小的圆盘上面 问,最少需要多少步才能把所有圆盘从一根柱子移到另外一跟柱子上 我们先命名一个状态 \(T_n\) 表示圆盘从一根柱子移动到另外一根柱子的最少次数 那么…