langchain介绍以及简单实用

news2024/9/24 12:40:19

1,介绍

LangChain是一个用于开发由大语言模型支持的应用程序的框架。它提供了大量组件来帮助我们构建LLM支持的应用程序。
其主要是有六大功能组成。
LLMs(大语言模型(生成式语言模型)),Prompts(提示词),Memory(记忆力),chains,Document Loaders(各种格式文件的加载器),Vector Stores(向量的存储)
在这里插入图片描述

LLMs

LLMs,即大型语言模型,是具有数十亿个参数的强大深度学习模型,在各种自然语言处理任务中表现出色。它们可以执行诸如翻译、情感分析和聊天机器人对话等任务,而无需进行特定训练。LLMs由多个神经网络层组成,包括前馈、嵌入和注意力层,共同处理输入文本并生成预测。 虽然LLMs有改变行业的潜力,但应考虑它们的限制和伦理影响。开发人员应优化这些模型,以最大程度地减少偏见并增强其实用性。LLMs可以处理的最大标记数取决于具体的实现。在LangChain中,最大标记数由所使用的底层OpenAI模型确定。为了处理超过标记限制的输入文本,可以将其拆分为较小的块并单独处理,然后再将结果组合起来。

Prompts

是在使用大型语言模型时必须掌握的关键方面。通过精心设计适当的提示,即使使用较弱或开源模型,也可以达到可比较的准确性水平。

角色提示(Role prompting)涉及指示LLM在执行任务时扮演特定的角色或身份。例如,可以要求它扮演一个文案撰稿人的角色。这种方法通过提供上下文或观点来引导模型的回应。为了有效地利用角色提示,可以按照以下迭代步骤进行操作:

1.在提示中明确指定所需的角色,例如:“作为一个文案撰稿人,为AWS服务生成引人注目的口号。”
2.利用提示从LLM生成输出。
3.分析生成的回应,并根据需要改进提示以提升结果的质量。

Memory

第三个重要功能模块就是Memory,实现记忆历史对话内容。大多数LLM应用都具有对话界面。对话的一个重要组成部分是能够引用先前在对话中介绍过的信息。至少,一个对话系统应该能够直接访问一些过去消息的窗口。更复杂的系统将需要拥有一个不断更新的世界模型,使其能够保持关于实体及其关系的信息。大模型本身是概率模型,基于前置条件,即输入和分布,即可得出对应输出。但是整个流程是一次性的,对于初始的且没有经过任何处理的大模型,是不具备记忆存储功能,这个功能模块是需要应用开发者进行开发的。

Chains

处理业务流
Chain 作为 LangChain 的核心模块之一,重要性不言而喻,它相当于是所有复杂逻辑的基础,用来将每个零散的逻辑串联成一整个业务流程,Chain 的设计非常巧妙,可以说是大模型应用的最佳实践之一。
在这里插入图片描述
Chains主要包含以下几个模块,接下来的实践演练,会分别演示这几个模块的使用。
在这里插入图片描述

Document loader

Document loader(文档加载器),使用文档加载器将数据从数据源加载为 Document 对象的数据。

Document 是 LangChain 提供的一个类,包含一段文本和与文本关联的元数据。我们读取数据后就会转换成 Document 对象。

例如,有一些文档加载器用于加载简单的 .txt 文件、加载任何网页的文本内容,甚至用于加载 YouTube 视频。文档加载器提供了“ load ”方法,用于从配置的源加载数据,转换为 Document。它们还可以选择实现“延迟加载”,以便将数据延迟加载到内存中。

基于 LLM 的应用程序经常需要从数据库或文件(如 PDF)中提取数据,并将其转换为 LLM 可以使用的格式。在LangChain中,这通常涉及创建 Document 对象,这些对象封装了提取的文本(page_content)以及元数据(metadata 包含文档详细信息的字典),例如作者姓名或出版日期。

Document 对象通常被格式化为提示,这些提示被输入到 LLM 中,允许 LLM 使用 Document 中的信息来生成所需的响应(例如,总结文档)。Documents 既可以立即使用,也可以索引到向量存储中,以备将来检索和使用。

Vector Stores

Vector Stores在LangChain框架中是连接语言模型与实际应用数据的关键桥梁,为构建智能化、高效的语言处理应用提供了强大的基础设施支持。

理解向量存储前需了解向量嵌入(Embeddings)。文本向量化是将文本转换成数值向量的过程,这些向量能够在多维空间中捕捉词语或文档之间的语义相似性。常见的嵌入模型如Word2Vec、BERT、Sentence Transformers等,可以被用来生成这样的向量。

Vector Stores 的用途
高效检索:Vector Stores主要用于存储这些嵌入向量,并支持高效的相似性搜索,使得用户能够根据输入的查询(也是一个向量)快速找到最相关的文档、段落或信息。
语义搜索:由于向量能够表达语义关系,Vector Stores使得基于内容而非关键词的搜索成为可能,大大提高了搜索的准确性和相关性。
Vector Stores 实现方式
LangChain支持多种向量存储后端,包括但不限于:

FAISS:Facebook AI Similarity Search,一个高效的相似性搜索库,特别适合大规模的向量数据集。
Pinecone、Qdrant:云原生的向量数据库服务,提供了API接口,便于管理和检索向量数据。(这里插一嘴,我们项目用的就是 Qdrant,好用就完事了~😊)
Weaviate:一个语义搜索引擎,支持向量搜索和知识图谱管理。
Chroma:一个开源的向量数据库,专为机器学习和NLP应用设计。
Vector Stores 功能特性
索引构建:可以为文档集合创建索引,这个过程涉及将文档转换为向量并存储起来,以便后续快速检索。
更新与删除:支持对向量数据的动态管理,包括源文档更新时的向量重计算以及删除不再需要的向量。
检索优化:通过近似最近邻(Approximate Nearest Neighbor, ANN)算法,在保证较高精度的同时,实现了对大规模数据集的高效检索。
Vector Stores 应用场景
问答系统:快速从大量文档中找到与问题最相关的答案。
个性化推荐:基于用户历史行为和偏好生成的向量,来推荐相似或相关的内容。
知识图谱增强:结合向量搜索提高知识图谱节点间链接的发现和查询效率。
文档检索系统:企业内部文档、网页内容的快速语义搜索。

2,实例

import os.path
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.chat_models import QianfanChatEndpoint


def load_documents():
    # 读取文本数据
    loader = TextLoader("./book/xiyouji.txt")
    documents = loader.load()
    text_splitter = CharacterTextSplitter(
        separator="\n",
        chunk_size=10000,
        chunk_overlap=10,
        length_function=len,
        is_separator_regex=False,
    )
    texts = text_splitter.split_documents(documents)
    print("========---"+texts[99].page_content)
    return texts;

def load_embedding_mode(model_names="ernie-tiny"):
    return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',
                                   model_kwargs={'device': 'cpu'})


def store_chrome(docs,embeddings):
    # 使用FAISS模块将文档转换为向量,并将向量存储到vector_store_local对象中。然后将向量存储保存到本地。
    vector_store = FAISS.from_documents(docs, embeddings)
    vector_store.save_local('vector_store_local')
    return vector_store


embeddings = load_embedding_mode('text2vec3')
chatBot = QianfanChatEndpoint(
    streaming=True,
    model="ERNIE-Bot",
)

if not os.path.exists('vector_store_local'):
    documents = load_documents()
    db = store_chrome(documents, embeddings)
else:
    new_db = FAISS.load_local("vector_store_local", embeddings)
    docs = new_db.similarity_search("唐僧是谁的师傅")
    print("结果:"+docs[0].page_content)


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

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

相关文章

电器行业文件加密怎么做?防泄密哪种方法实用?

管控需求 1.电子文档(源代码、设计图纸、设计方案等)数据不同应用场景下如何有效保护; 2.发给第三方或外部单位的成果数据没有任何限制,对方可拷贝、篡改、截屏、盗用,严重损害单位的利益; 3.对员工出差…

基于单片机巡迹避障智能小车系统

文章目录 前言资料获取设计介绍设计程序具体实现截图设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…

[Python学习日记-28] 开发基础练习1——股票查询程序

[Python学习日记-28] 开发基础练习1——股票查询程序 简介 题目及效果参考 源码与解析 简介 该练习使用了列表、字典、字符串等之前学到的数据类型,用于巩固实践之前学习的内容,题目当中使用到的数据均摘录与东方财富网,最好在学习完前面的…

【论文阅读】Grounding Language with Visual Affordances over Unstructured Data

Abstract 最近的研究表明,大型语言模型(llms)可以应用于将自然语言应用于各种各样的机器人技能。然而,在实践中,学习多任务、语言条件机器人技能通常需要大规模的数据收集和频繁的人为干预来重置环境或帮助纠正当前的…

USB总线同步数据采集卡6路高速模拟量采集带DIO功能USB2884/2885/2886

USB2884/2885/2886 数据采集卡 概述: 系统框图: 规格参数: 板卡外形图: 尺寸图及元器件功能说明:

图像识别OCR(Tess4J)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

ZBrush入门使用介绍——16、ArrayMesh

大家好,我是阿赵。   继续介绍ZBrush的用法。这次看看ArrayMesh功能。   简单来说,ArrayMesh功能是可以复制很多个模型,然后根据路径排列。 一、 从阵列预设生成ArrayMesh 先把模型转换成多边形网格体 这时候,ArrayMesh的选…

jupyter安装与使用——Ubuntu服务器

jupyter安装与使用——Ubuntu服务器 一、安装miniconda3/anaconda31. 下载miniconda32. 安装miniconda33. 切换到bin文件夹4. 输入pwd获取路径5. 打开用户环境编辑页面6. 重新加载用户环境变量7. 初始化conda8.验证是否安装成功9.conda配置 二、安装jupyter2.1 conda安装2.2 配…

Java调用数据库 笔记05(查询篇)

一. 数据库(通过各种驱动来实现调用): (应用程序通过接口控制的各种数据库驱动来调用数据库-->jdbc方法) 1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类…

C++_23_STL容器

文章目录 STL容器概念常用容器A string作用构造函数基本赋值操作获取字符串长度存取字符操作拼接操作查找和替换注意:查找是不存在返回-1比较操作截取操作插入与删除string与char * 转换 B vector概述与数组区别迭代器构造函数赋值操作插入与删除取值操作大小相关存储自定义类型…

linux 安装 tomcat9、java环境

一、安装 Java环境 1. 下载文件 https://repo.huaweicloud.com/java/jdk/ 或者网盘:通过网盘分享的文件:jdk-8u192-linux-x64.tar.gz 链接: https://pan.baidu.com/s/1V3pQWzgSLJxdrUdmmKueRA 提取码: qspw 2. 查看Linux系统是否有自带的jdk&#xf…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展,水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员,针对取得河道采砂许可证的采砂公司及采砂船,实施在线自动监控,旨在提高监管效率…

评论表设计与实现(多级评论)

首先分析评论的类型 对文章的回复(也称根回复或一级回复)对根评论的回复 (二级回复,被回复的评论id和根评论相同)对回复的回复(二级回复,被回复的评论id和根评论不同) 抽象出数据库…

if __name__ == ‘__main__‘: 在 Python 中的作用

Python Python 是一种广泛使用的高级编程语言,它以其易读性和简洁的语法而闻名。Python 支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。它由 Guido van Rossum 创建,并在 1991 年首次发布。 Python 的一些关键特性包括&#…

MacOS Catalina 从源码构建Qt6.2开发库之02: 配置QtCreator

安装Qt-creator-5.0.2 在option命令中配置Qt Versions指向 /usr/local/bin/qmake6 Kits选入CLang

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题 💖The Begin💖点点关注,收藏不迷路💖 遇到SSH连接银河麒麟V10SP1时“connection reset by ip地址 port 22”的错误,可以尝试以下步…

GNU链接器(LD):设置入口点(ENTRY命令)的用法及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…

#嵌入式笔面经分享#科大讯飞公司嵌入式硬件面经(第1面)

DNS是什么 DNS(Domain Name System)是一种用于将域名转换为IP地址的分布式命名系统。它充当 7.12 440 一个组产出最 7.12 440 一个组产出最多的是组长,是管理,这个组不正常。​出一个小学数学应用题:在 OSI七层模型?…

基于二自由度汽车模型的汽车质心侧偏角估计

一、质心侧偏角介绍 在车辆坐标系中,质心侧偏角通常定义为质心速度方向与车辆前进方向的夹角。如下图所示,u为车辆前进方向,v为质心速度方向,u和v之间的夹角便是质心侧偏角。 质心侧偏角的作用有如下三点: 1、稳定性…

什么是反射,反射用途,spring哪些地方用到了反射,我们项目中哪些地方用到了反射

3分钟搞懂Java反射 一、反射是什么 在Java中,反射(Reflection)是一种强大的工具,它允许程序在运行时获取和操作类、接口、构造器、方法和字段等。反射是Java语言的一个重要特性,它为开发人员提供了许多灵活性&#xf…