LangChain和LangGraph初识

LangChain

  • LangChain是一个帮助在应用程序中使用大型语言模型的编程框架。同时也是企业名称,由创始人哈里森·蔡斯和安库什·戈拉于2023在美国加利福尼亚州创建的AI公司。Harrison Chase担任首席执行官。
  • LangChain简化了LLM应用生命周期的每个阶段:
    开发:利用LangChain的模块和组件来构建应用程序。通过与第三方集成和模板可迅速搭建一个项目。
    生产化:使用LangSmith来检查、监控和评估你的chains,这样你就可以持续优化,并充满信心地部署。
    部署:通过LangServe将任何chains转换成 API。

简单来说就比如
聊天用的:聊天组件
提示词模板
记忆
文档的加载+文档的分隔
向量的存储

更直白点:LangChain 提供了一套工具、组件和接口,简化了与语言模型交互的过程,并允许将语言模型与其他数据源和工具连接起来。

那我们为什么要使用LangChain呢?

  1. 数据连接:Langchain允许你将大型语言模型连接到你自己的数据源,比如数据库、PDF文件或其他文档。这意味着你可以使模型从你的私有数据中提取信息。
  2. 行动执行:不仅可以提取信息,Langchain还可以帮助你根据这些信息执行特定操作,如发送邮件。无需硬编码:它提供了灵活的方式来动态生成查询,避免了硬编码的需求

LangChain生态

  1. LangSmith:调试、测试、评估和监控应用程序,并与LangChain无缝集成。
  2. langGraph:用于编排复杂任务流程或工作流。构建健壮且有状态的多⻆色应用程序。
  3. langserve:部署LangChain链作为REST APIs。

LangChain主要组件

  1. Models:模型,各种类型的模型和模型集成,比如GPT-4
  2. Prompts:提示,包括提示管理、提示优化和提示序列化
  3. Memory:记忆,用来保存和模型交互时的上下文状态
  4. Indexes:索引,用来结构化文档,以便和模型交互
  5. Chains:链,一系列对各种组件的调用
  6. Agents:代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止

演示

我们先在这个项目中创建如下几个文件夹和文件
在这里插入图片描述
然后安装对应的依赖:

ip install langchain 
pip install langchain-core 
pip install langgraph>0.2.27       
pip install -qU"langchain[openai]"
pip install -U langchain-deepseek 
pip install langchain-community pypdf  
pip install docx2txt 
pip install -qU langchain-chroma   # 向量库chroma
pip install -qU faiss-cpu   # 向量库faiss

在这里插入图片描述
如上,我们逐步安装完成即可
我们可以使用pip list查看是否都安装成功

LangSmith

是LangChain的一个监控、日志平台
我们首先要去官网进行注册
官网地址:https://smith.langchain.com/
在这里插入图片描述

我们使用QQ邮箱注册
登录邮箱去确认邮箱即可
然后中间确认角色等过程一律skip
然后点击设置
在这里插入图片描述
点击+API Key
在这里插入图片描述
然后我们创建我们自己的密钥就可以了在这里插入图片描述
然后我们去代码里面配置我们的密钥相关信息
LANGSMITH_TRACING=true:表示启用跟踪(即启用LangSmith日志)
LANGSMITH_API_KEY:上面申请的秘钥LANGSMITH_PROJECT:项目的名称,随意填写
在这里插入图片描述
正常来讲,当我们运行之后,这里会显示我们运行的过程
在这里插入图片描述
那我们同时也配置上OpenAI和DeepSeek的秘钥,如下:
OPENAI_API_KEY=sk-UTMrYlOnkmtwiclzpQYiYaS
OPENAI_API_BASE=https://api.chat

DEEPSEEK_API_KEY=sk-ee2df75adfcc462
在这里插入图片描述
环境变量如上,我们配置完毕

LangChain主要组件介绍

聊天组件

我们创建demo1.py文件
在这里插入图片描述

from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage, SystemMessage

"""
聊天模块-一次性输出。
"""

def main():
    model = init_chat_model("deepseek-chat", model_provider="deepseek")
    messages = [
        SystemMessage("将以下内容从英语翻译成中文。"),
        HumanMessage("hi!good,yes"),
    ]
    print(model.invoke(messages).content)


if __name__ == '__main__':
    load_dotenv()
    main()

运行之后,我们发现,它是可以翻译成功的
在这里插入图片描述
在运行过程中,它自己会去加载环境变量,然后去运行
上面这个demo1是一次性输出,当然,我们也可以做到流式输出,说直白点就是一个字一个字的往外输出,我们创建demo2.py文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2025/10/26 13:33
@Author  : nian_nian
@File    : demo2.py
@Desc    : 
"""

from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage, SystemMessage
"""
聊天模块-流式输出。
"""

def main():
    model = init_chat_model("deepseek-chat", model_provider="deepseek")
    messages = [
        SystemMessage("你是一个高级中学的语文老师,你的作文写的很牛逼。"),
        HumanMessage("请以《奉献》为题,写一篇400的作文"),
    ]
    # print(model.invoke(messages).content)

    for token in model.stream(messages):
        print(token.content)

if __name__ == '__main__':
    load_dotenv()
    main()

运行过程如下:
在这里插入图片描述
照片看不出来效果,自己可以尝试下

提示词模板

我们在模板单元文件里面创建demo1.py文件,内容如下:

from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate

"""
提示词模版模块。
"""
def main(text):
    model = init_chat_model("deepseek-chat", model_provider="deepseek")

    system_template="将以下内容从英语翻译成{language}"

    prompt_template = ChatPromptTemplate.from_messages(
        [
            ("system", system_template), ("user", "{text}")
        ]
    )

    prompt = prompt_template.invoke({
   
   'language': '日语', 'text': text})

    print(model.invoke(prompt).content)


if __name__ == '__main__':
    load_dotenv()
    main('你好')

将我们输入的内容,翻译成日语的一个模板
运行结果我们看下:
在这里插入图片描述

文档加载

加载PDF文件

from langchain_community.document_loaders import PyPDFLoader


def load_pdf():
    loader = PyPDFLoader('sq_pdf.pdf')
    docs = loader.load()

    print('文档的长度', len(docs))
    print('第一部分内容', docs[0].page_content)


if __name__ == '__main__':
    load_pdf()

运行之后的结果如下:
在这里插入图片描述
我们可以看到,它正常读出来了PDF文件的内容,同时,它也可以实现,对文章内容进行分段处理

加载word文件

from langchain_community.document_loaders import Docx2txtLoader


def load_word():
    loader = Docx2txtLoader('sq_word.docx')
    docs = loader.load()

    print('文档的长度', len(docs))
    print('第一部分内容', docs[0].page_content)


if __name__ == '__main__':
    load_word()

运行之后的结果:
在这里插入图片描述
我们可以看到,word文档里面的内容也被读取了出来

接下来我们专门看下文件的分隔:
我们先写一段代码:

from langchain_text_splitters import CharacterTextSplitter
text_spliter = CharacterTextSplitter(
                                    separator=' ',    # 使用空格作为分割符
                                    chunk_size=10,    # 指明每个分割文本块的大小
                                    chunk_overlap=3,  # 指明每个分割后的文档之间的重复字符个数
                                )


result=text_spliter.split_text('AB CD EF GH IJKLMNOPQRST UVWXYZ1234567890')
print(result)

我们先看下运行的结果:
在这里插入图片描述
我们可以看到,并不是所有的元素,都是正好等于10
第一个元素,加上空格,正好等于10
第二个元素,很明显不等于10,因为,如果要等于10,那么就需要对下一个元素进行分割,很明显,下一个元素不能被分隔。举个例子,我们在日常生活中的很多单词,如果我们进行了分隔,那么,他的含义很显然就会发生变化,所以这种结果正常来讲,是我们想要的。

存储到向量库与检索查询

关于文本转换向量,我们只提供几个代码文件,大家可以看下

from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings

"""
将文本转换成向量
"""

def embed_txt():
    embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
    vector1=embeddings.embed_query('小米')
    vector2=embeddings.embed_query('小米')
    print(vector1)
    print(vector2)

    print(vector1 == vector2)  # 同样的内容,向量化后,结果可能一样,也可能不一样,如果不一样,也会很相近。

    print(len(vector1)==len(vector2))
    print(len(vector2))

if __name__ == '__main__':
    load_dotenv()
    embed_txt()
import os
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings

""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I小小测试员

你的鼓励将是我最大的创作动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值