langchain 链式写法-使用本地 embedding 模型,Faiss 检索

2024-04-15 20:36

本文主要是介绍langchain 链式写法-使用本地 embedding 模型,Faiss 检索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

示例代码1

示例代码2


示例代码1

使用本地下载的 embedding 模型去做 embedding,然后从中查相似的

import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
load_dotenv('key.env')  # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY')  # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量
model = Tongyi(temperature=1)from langchain_core.prompts import ChatPromptTemplate, PromptTemplate, format_document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.vectorstores.faiss import FAISS
from langchain_community.document_loaders import ArxivLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings# 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
loader = ArxivLoader(query="2210.03629", load_max_docs=1)
docs = loader.load()# 把文本分割成 200 字一组的切片
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
chunks = text_splitter.split_documents(docs)embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')# 构建 FAISS 向量存储和对应的 retriever
vs = FAISS.from_documents(chunks[:10], embedding)
# vs.similarity_search("What is ReAct")
retriever = vs.as_retriever()# 构建 Document 转文本段落的工具函数
DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template="{page_content}")
def _combine_documents(docs, document_prompt=DEFAULT_DOCUMENT_PROMPT, document_separator="\n\n"
):doc_strings = [format_document(doc, document_prompt) for doc in docs]return document_separator.join(doc_strings)# 准备 Model I/O 三元组
template = """Answer the question based only on the following context:
{context}Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)# 构建 RAG 链
chain = ({"context": retriever | _combine_documents,"question": RunnablePassthrough()  # 直接作为 question 的值,不做任何操作}| prompt| model| StrOutputParser()
)
print(chain.invoke("什么是 ReAct?"))

示例代码2

txt 有多行,我的这份数据有 67 行,样例如下:

字段1\t值1\n

字段2\t值2\n

...

从中先检索最相似的,在传给大模型去选择,减少一次性传传入太多,不相关得到信息

import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate, format_document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter# 使用通义千问 api
load_dotenv('key.env')  # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY')  # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量
model = Tongyi(temperature=1)# 检索的文本
content = '采用强酸型阳离子树脂为交换剂的离子交换柱,和经组氨酸基团修饰的强碱型阴离子树脂为交换剂的离子交换层析柱串联,以氯化钠溶液为洗脱剂,对透明质酸粗品进行分离和纯化.得到的透明质酸精品的蛋白质含量低于0.075%,平均分子量大于9.41×105,纯化收率为58%~61%.并对洗脱剂的流速、浓度、pH等条件进行比较,确定了最佳洗脱条件.'# 加载外部数据
filepath = 'data/专业描述.txt'
raw_documents = TextLoader(filepath, encoding='utf8').load()# 按行分割块
text_splitter = CharacterTextSplitter(chunk_size=100,chunk_overlap=20,separator="\n",length_function=len,is_separator_regex=True,
)
documents = text_splitter.split_documents(raw_documents)# 加载本地 embedding 模型
embedding = HuggingFaceEmbeddings(model_name='bge-small-zh-v1.5')# 判断向量数据库是否已经创建,创建则加载,否则创建
embedding_db = "./faiss_index"
if os.path.exists(embedding_db):print('加载已存在向量数据库')db = FAISS.load_local(embedding_db, embedding, allow_dangerous_deserialization=True)
else:print('创建向量数据库')# 创建向量数据库,把外部数据向量化,保存为数据库到本地db = FAISS.from_documents(documents, embedding)# 保存db.save_local("./faiss_index")# 构建检索器检索,mmr 检索
retriever = db.as_retriever(search_type="mmr", search_kwargs={'k': 10})  # 构建检索器# 构建检索回来后的处理函数
# 构建 Document 转文本段落的工具函数
DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template="{page_content}")
def _combine_documents(docs, document_prompt=DEFAULT_DOCUMENT_PROMPT):doc_strings = [format_document(doc, document_prompt) for doc in docs]docs = [d.split('\t')[0] for d in doc_strings]return docs# 准备 Model I/O 三元组
template = """找最相关的专业。请根据以下已知条件:
- 描述:{content}
- 专业列表:{labels}请遵循以下决策规则:
- 给出的专业必须来自于专业列表中列出的专业。
- 仔细分析描述中出现的专业名词,判断它们是否指向特定的专业。
- 让我们一步一步来思考请直接回答你认为最相关的专业名称,无需解释说明。
请按照以下格式回答:
- 输出:[专业]注意:
- 您必须给出回答,不能拒绝回答问题。
- 回答必须简明扼要,不能超出问题所涉及的范围。
"""
prompt = ChatPromptTemplate.from_template(template)# 构建 RAG 链
chain = ({"labels": retriever | _combine_documents,  # 把检索回来结果给 _combine_documents 函数处理,提取内容"content": RunnablePassthrough()  # 直接作为 content 的值,不做任何操作}| prompt| model| StrOutputParser()
)
print(chain.invoke(content))

这篇关于langchain 链式写法-使用本地 embedding 模型,Faiss 检索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906854

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画