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))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ansible创建用户账户和更新ansible库的密钥

1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表,并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook ,从⽽…

探索顶级短视频素材库:多样化选择助力创作

在数字创作的浪潮中,寻找优质的短视频素材库是每位视频制作者的必经之路。多种短视频素材库有哪些?这里为您介绍一系列精选的素材库,它们不仅丰富多样,而且高质量,能极大地提升您的视频创作效率和质量。 1.蛙学网 蛙学…

python内置函数delattr(),dict()详解

Python 内置函数 delattr() 1. 功能和用途 delattr() 函数用于删除对象的属性。它相当于执行 del x.foobar,其中 x 是对象,foobar 是要删除的属性名。 2. 语法 以下是 delattr() 方法的语法: delattr(object, name)3. 参数说明 object:…

VsCode无法使用nvm

问题: zsh: command not found nvm 初级的解决办法在vsCode控制台使用 source ~/.nvm/nvm.sh 存在问题:每次重新打开控制台都需要重新使用 参考文档: ​​​​​​BUG解决:nvm安装后提示没有-CSDN博客 升级办法: 来…

springboot+Vue项目部署到云服务器上

一、下载配置ngnix 1.压缩包下载并上传 链接: https://pan.baidu.com/s/1m2LKV8ci4WXkAWdJXIeUFQ 提取码: 0415 2.解压 tar -xzvf 压缩包名 3.编译nginx 在解压好的文件夹下,依次执行: ./configure 来到nginx默认安装路径/usr/local/nginx 依次执行命令 mak…

【鸿蒙开发】饿了么页面练习

0. 整体结构 整体划分3部分。店铺部分,购物车部分,金额统计部分。使用 Stack 把3部分堆叠 0.1 整体页面 Index.ets 修改 Index.ets ,使用堆叠布局,并居底部对齐 import { ElShop } from ../components/ElShop import { ElShopp…

Linux下的文件权限

Linux下的文件权限 一、Linux下的文件权限 文件权限是指不同的用户、用户组或者其他组对某个文件操作时所拥有的权限。在linux下文件的权限分为三种: 读权限、写权限、可执行权限。 当我们使用ls -l命令查看文件信息时可以得到如下内容: -rw-rw-r…

Golang连接操作MongoDB基础处理

目录 一、各步骤操作连接数据库插入数据查询多条数据删除数据分组查询数据 二、总代码 一、各步骤操作 下面查询使用到的bson.M和bson.D差不多,只要区别在于M内部元素是无序的map,D是有序的切片 连接数据库 func connectDB(ctx context.Context) {clien…

Linux之防火墙命令

1、查看防火墙状态 systemctl status firewalld1.1、开启防火墙 service firewalld start1.2、重启防火墙 service firewalld restart1.3、关闭防火墙 service firewalld stop2、查看防火墙规则 firewall-cmd --list-all # 查看全部信息 firewall-cmd --list-ports # …

C#版Facefusion ,换脸器和增强器

C#版Facefusion ,换脸器和增强器 目录 说明 效果 项目 调用代码 说明 Facefusion是一款最新的开源AI视频/图片换脸项目。是原来ROOP的项目的延续。项目官方介绍只有一句话,下一代换脸器和增强器。 代码实现参考 https://github.com/facefusion/f…

软件工程及开发模型

根据希赛相关视频课程汇总整理而成,个人笔记,仅供参考。 软件工程的基本要素包括方法、工具和(过程) 方法:完成软件开发的各项任务的技术方法; 工具:运用方法而提供的软件工程支撑环境&#xff…

基于STM32的RFID智能门锁系统

本文针对RFID技术,着重研究了基于单片机的智能门锁系统设计。首先,通过链接4*4按键模块与主控STM32,实现了多种模式,包括刷卡开锁、卡号权限管理、密码开锁、修改密码、显示实时时间等功能。其次,采用RC522模块与主控S…

【学习笔记十四】EWM发货流程概述及相关配置

一、EWM发货流程与ERP集成配置 1.将凭证类型从 ERP 系统映射至 EWM ERP交货单凭证类型LF映射到EWM凭证类型OUTB 2.从 ERP 系统映射项目类型至 EWM ERP交货单凭证类型+ERP交货单项目类型TAN映射到EWM项目类型是ODLV 3.定义出库交货的参数文件 ①定义外向交货处理的凭证类型OUT…

Opentelemetry——Instrumentation-Code-based

Code-based Learn the essential steps in setting up code-based instrumentation 了解设置基于代码的测量装置的基本步骤 Import the OpenTelemetry API and SDK 导入 OpenTelemetry API 和 SDK You’ll first need to import OpenTelemetry to your service code. If you…

Mamba论文笔记

Mamba论文 结合序列建模任务通俗地解释什么是状态空间模型?创新点和贡献 为什么Mamba模型擅长捕获long range dependencies? 结合序列建模任务通俗地解释什么是状态空间模型? 状态空间模型(State Space Model, SSM)是…

举个栗子!Tableau 技巧(270):用 Lookup 函数创建多 KPI 文本表

在 Tableau 中,文本表常用于呈现明细数据。但其实,数据粉如果想在同一视图中查看多个数据指标,也可以用到文本表。 如下示例,是不是很直观的就可以查看:不同区域随时间推移的数据指标情况呢? 如何在 Tablea…

vue3 pinia本地存储

vue3 pinia本地存储 1.安装pinia和本地存储插件 npm install pinia npm i pinia-plugin-persistedstate2.在main中全局配置 import { createPinia } from pinia import { createPersistedState } from pinia-plugin-persistedstateconst pinia createPinia() pinia.use(cre…

app证书在设置在哪

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》,相信不少要进行IOS平台App备案的朋友遇到了一个问题,就是apple不提供云管理式证书的下载,也就无法获取公钥及证书SHA-1指纹。 已经上架的应用不想重…

Langchain入门到实战-第二弹

Langchain入门到实战 Langchain快速入门官网地址Langchain概述Langchain调用大模型更新计划 Langchain快速入门 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://python.langchain.com/Langchain概述 LangChain是一个…

Awaited,Promise

下面是一个简单的示例&#xff0c;展示了如何使用 Awaited<T>&#xff1a; 假设有一个 getInitialState 函数&#xff0c;它返回一个 Promise&#xff0c;解析后的值是一个对象&#xff0c;结构如下&#xff1a; // app.ts export async function getInitialState(): P…