【LangChain概念】了解语言链️:第2部分
一、说明
在LangChain的帮助下创建LLM应用程序可以帮助我们轻松地链接所有内容。LangChain 是一个创新的框架,它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则,LangChain正在重新定义通过传统API可以实现的极限。
在上一篇博客中,我们详细讨论了 LangChain 中存在的模块,对其进行了修改。
实际实施 LangChain 以构建自定义数据机器人涉及合并内存、提示模板和链,以及创建基于 Web 的应用程序。
钦迈·巴勒劳
二、让我们从导入开始
导入 LangChain 和 OpenAI for LLM 部分。如果您没有任何这些,请安装它。
# IMPORTS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains import ConversationalRetrievalChain
from langchain.vectorstores import ElasticVectorSearch, Pinecone, Weaviate, FAISS
from PyPDF2 import PdfReader
from langchain import OpenAI, VectorDBQA
from langchain.vectorstores import Chroma
from langchain.prompts import PromptTemplate
from langchain.chains import ConversationChainfrom langchain.document_loaders import TextLoader
# from langchain import ConversationalRetrievalChain
from langchain.chains.question_answering import load_qa_chain
from langchain import LLMChain
# from langchain import retrievers
import langchain
from langchain.chains.conversation.memory import ConversationBufferMemory py2PDF 用于阅读和处理 PDF。此外,还有不同类型的记忆,它们具有特定的功能要执行。我正在写这个系列的下一个博客,专门讨论记忆,所以我将在那里详细说明所有内容。ConversationBufferMemory, ConversationBufferWindowMemory
三、让我们设置环境。
我想你知道如何获得OpenAI API密钥。但以防万一,
- 转到 OpenAI API 页面,
- 单击创建新的密钥
- 这将是您的 API 密钥。粘贴到下面
import os
os.environ["OPENAI_API_KEY"] = "sk-YOUR API KEY" 使用哪种模型?达芬奇、巴贝奇、居里还是艾达?基于 GPT 3?基于 GPT 3.5 还是基于 GPT 4?关于模型有很多问题,所有模型都适用于不同的任务。很少有便宜的,很少有更准确的。我们还将在本系列的第 4 篇博客中详细介绍所有模型。
为简单起见,我们将使用最便宜的型号“gpt-3.5-turbo”。温度是一个参数,它让我们了解答案的随机性。温度值越大,我们得到的随机答案就越多。
llm = ChatOpenAI(temperature=0,model_name="gpt-3.5-turbo") 您可以在此处添加自己的数据。您可以添加任何格式,如PDF,文本,文档,CSV。根据您的数据格式,您可以注释/取消注释以下代码。
# Custom data
from langchain.document_loaders import DirectoryLoader
pdf_loader = PdfReader(r'Your PDF location')# excel_loader = DirectoryLoader('./Reports/', glob="**/*.txt")
# word_loader = DirectoryLoader('./Reports/', glob="**/*.docx") 我们不能一次添加所有数据。我们将数据拆分为块并发送它以创建数据的嵌入。如果你不知道什么是嵌入,那么
嵌入以数值向量或数组的形式捕获模型操作和生成的令牌的本质和上下文信息。这些嵌入派生自模型的参数或权重,用于编码和解码输入和输出文本。


这就是创建嵌入的方式。我从CODEBASIC截取了这些截图,这是一个学习LLM的好渠道,[来源:这里]
简单来说,
嵌入LLM是一种将文本表示为数字向量的方法。这允许语言模型理解单词和短语的含义,并执行文本分类、摘要和翻译等任务。通俗地说,嵌入是一种将单词转换为数字的方式。这是通过在大型文本语料库上训练机器学习模型来完成的。该模型学习将每个单词与唯一的数字向量相关联。这个向量表示单词的含义,以及它与其他单词的关系。

来源:官方语言链博客
让我们做与上图中表示完全相同的事情。
#Preprocessing of fileraw_text = ''
for i, page in enumerate(pdf_loader.pages):text = page.extract_text()if text:raw_text += text# print(raw_text[:100])text_splitter = CharacterTextSplitter( separator = "\n",chunk_size = 1000,chunk_overlap = 200,length_function = len,
)
texts = text_splitter.split_text(raw_text) 实际上,当用户启动查询时,将在向量存储中进行搜索,并检索最合适的索引并将其传递给LLM。然后,LLM 对索引中找到的内容进行改革,以向用户提供格式化的响应。
我建议进一步深入研究向量存储和嵌入的概念,以增强您的理解。
embeddings = OpenAIEmbeddings()
# vectorstore = Chroma.from_documents(documents, embeddings)
vectorstore = FAISS.from_texts(texts, embeddings) 嵌入直接存储在向量数据库中。有许多矢量数据库为我们工作,如松果、FAISS等。让我们在这里使用FAISS。
prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say GTGTGTGTGTGTGTGTGTG, don't try to make up an answer.
{context}
Question: {question}
Helpful Answer:"""
QA_PROMPT = PromptTemplate(template=prompt_template, input_variables=['context',"question"]
) 您可以使用自己的提示来优化查询和答案。写完提示后,让我们将其链接到最终的链。
让我们调用最后一个链,它将包括我们之前链接的所有内容。我们在这里使用ConversationalRetrievalChain。这有助于我们像人类一样与机器人进行对话。它会记住以前的聊天对话。
qa = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0.8), vectorstore.as_retriever(),qa_prompt=QA_PROMPT) 我们将使用简单的Gradio来创建Web应用程序。您可以使用流光或任何前端技术。此外,还有许多免费的部署选项可用,例如在拥抱脸或本地主机上部署,我们可以稍后再做。
# Front end web app
import gradio as gr
with gr.Blocks() as demo:gr.Markdown("## Grounding DINO ChatBot")chatbot = gr.Chatbot()msg = gr.Textbox()clear = gr.Button("Clear")chat_history = [] def user(user_message, history)print("Type of use msg:",type(user_message))# Get response from QA chainresponse = qa({"question": user_message, "chat_history": history})# Append user message and response to chat historyhistory.append((user_message, response["answer"]))print(history)return gr.update(value=""), historymsg.submit(user, [msg, chatbot], [msg, chatbot], queue=False)clear.click(lambda: None, None, chatbot, queue=False)############################################if __name__ == "__main__":demo.launch(debug=True) 此代码将启动指向 Web 应用的本地链接,你直接提出问题并查看响应。同样在 IDE 中,您将看到正在维护的聊天记录。

LangChain 的快照 [图片来源:作者]
今天就够了。这是一个简单的介绍,用于链接不同的模块并使用它们来启动最终链。您可以通过扭曲不同的模块和代码来做很多事情。我想说,玩耍是研究的最高形式!!
在下一篇博客中,我将介绍 LangChain 中的记忆和模型。如何选择模型,记忆如何做出贡献,以及更多......因此,请继续关注,如果有任何建议或问题,请与我联系。
四、如果您发现这篇文章有见地
事实证明,“慷慨使你成为一个更快乐的人”;因此,如果您喜欢这篇文章,请为它鼓掌。如果您觉得这篇文章很有见地,请在LinkedIn和媒体上关注我。您也可以订阅以在我发布文章时收到通知。让我们创建一个社区!感谢您的支持!
相关文章:
【LangChain概念】了解语言链️:第2部分
一、说明 在LangChain的帮助下创建LLM应用程序可以帮助我们轻松地链接所有内容。LangChain 是一个创新的框架,它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则,LangChain正在重新定义通过传统API可以实现的极限。 在上一篇博…...
步入React前厅 - Css In React
目录 扩展学习资料 行内样式 引入样式表 CSS Module /src/components/common.module.css /src/components/listitem.module.css css管理进阶 Css管理工具 练习 扩展学习资料 资料名称 链接 css module CSS Modules 用法教程 - 阮一峰的网络日志 在React中使…...
OpenCV(三)——图像分割(二)
目录 4.边缘检测 4.1 图像梯度的概念 4.2 模板卷积和梯度图的概念 4.3 梯度算子...
28.Netty源码之缓存一致性协议
Mpsc Queue 基础知识 Mpsc 的全称是 Multi Producer Single Consumer,多生产者单消费者。Mpsc Queue 可以保证多个生产者同时访问队列是线程安全的,而且同一时刻只允许一个消费者从队列中读取数据。 Netty Reactor 线程中任务队列 taskQueue 必须满足多个…...
造个轮子-任务调度执行小框架-任务清单执行恢复实现
文章目录 前言恢复执行流程失败任务执行重启执行中任务恢复执行修复组件整合组件整合容器启动类总结前言 okey,通过前面的两篇文章,关于这个任务执行这一块,我想应该是明白了。但是这里的话,还是不够的。我们希望对于任务还可以做到执行失败的重试执行,关于这个意外宕机的…...
若依部署前后端
打包项目 前端打包 npm run build:prod将代码上传到指定目录 配置nginx转发 server{listen 8090;server_name localhost;location / {root /home/cc_library/dist;index index.html index.htm;# 配置 history模式,刷新页面会404,,因为服…...
2009年上半年 软件设计师 下午试卷
博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
SpringBoot使用自定义事件监听器的demo
记录一下SpringBoot自定义事件监听器的使用方法 案例源码:SpringBoot使用自定义事件监听器的demo 使用的SpringBoot2.0.x版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><…...
arcgis定义投影与投影
1、定义 地理坐标系(GCS):利用地球表面的经纬度表示的坐标系统。一般单位为度。投影坐标系(PCS):利用数学换算将三维地球表面上的经纬度坐标转换到二维平面上的坐标系统。一般单位为米。可以认为ÿ…...
Flink多流处理之Broadcast(广播变量)
写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…...
LVS/DR+Keepalived负载均衡实战(一)
引言 负载均衡这个概念对于一个IT老鸟来说再也熟悉不过了,当听到此概念的第一反应是想到举世闻名的nginx,但殊不知还有一个大名鼎鼎的负载均衡方案可能被忽略了,因为对于一般系统来说,很多应用场合中采用nginx基本已经满足需求&a…...
测试DWPose的onnx +Unity barracuda
环境: Unity Barracuda 3.0.1 从github直接拉取的barracuda仓库才能装到这个版本Barracuda以后不再升级了,会迁移到Unity AI大计划里的Sentis 我想申请的来着但好像已经不开放了 Unity 2021.3.20模型:dw-ll_ucoco_384.onnx 报了一些错&…...
轻装上阵,不调用jar包,用C#写SM4加密算法【卸载IKVM 】
前言 记得之前写了一个文章,是关于java和c#加密不一致导致需要使用ikvm的方式来进行数据加密,主要是ikvm把打包后的jar包打成dll包,然后Nuget引入ikvm,从而实现算法的统一,这几天闲来无事,网上找了一下加密…...
redis学习笔记(一)
文章目录 一、引言二、redis介绍2.1、定义2.2、Redis的数据类型及主要特性2.3、Redis的应用场景有哪些? 三、redis环境安装3.1、下载和安装 一、引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站…...
最优化问题 - 拉格朗日对偶
primal 原问题 dual 对偶问题 目标函数 约束条件 可行域D 对偶专题 “拉格朗日对偶问题”如何直观理解?“KKT条件” “Slater条件” “凸优化”打包理解——bilibili 王木头 拉格朗日乘子法与对偶问题...
关于ISO27701隐私信息安全管理体系介绍
01 什么是ISO27701 ISO27701是对ISO27001信息安全管理和ISO27002安全控制的隐私扩展,全称《安全技术—扩展ISO27001和ISO27002的隐私信息管理—要求与指南》,是ISO标准委员会以ISO 27001为基准,以ISO27552为蓝本,建立发布的隐私…...
C语言案例 分数列求和-11
题目:有一分数列:2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。 程序分析 这是一个典型的分数列数学逻辑题,考究这类题目是需要从已知的条件中找到它们的分布规律 我们把前6荐的分子与分母分别排列出来,…...
Git 入门
一、版本控制 1.1 什么是版本控制 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单说就是用于管理多人协同开…...
PAT 1010 Radix
个人学习记录,代码难免不尽人意 Given a pair of positive integers, for example, 6 and 110, can this equation 6 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number. Now for any pair of positive integers N 1and N 2…...
ruoyi-cloud微服务新建子模块
目录 相关文章1、复制system模块2、在modules下的 pom.xml文件中添加子模块 test3、进入 test模块修改 pom.xml4、修改对应的包名、目录名和启动应用程序为test5、修改bootstrap.yml文件中的端口号和应用名称6、nacos中克隆 system-dev.yml的配置,修改名称为 test-d…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
