LLM大模型——langchain相关知识总结

目录

  • 一、简介
    • LangChain的主要价值支柱
    • 简单安装
  • 二、 LangChain的主要模块
    • 1.Model I/O
      • prompt模版定义
      • 调用语言模型
    • 2. 数据连接
    • 3. chains
    • 4. Agents
    • 5. Memory
    • Callbacks
  • 三、其他记录
    • 多进程调用

主要参考以下开源文档
文档地址:https://python.langchain.com/en/latest/
学习github:https://github.com/liaokongVFX/LangChain-Chinese-Getting-Started-Guide

一、简介

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。主要有 2 个能力:

  1. 可以将 LLM 模型与外部数据源进行连接
  2. 允许与 LLM 模型进行交互

LangChain的主要价值支柱

  1. 组件:用于处理语言模型的抽象,以及每个抽象的实现集合。无论是否使用LangChain框架的其余部分,组件都是模块化的,易于使用。

  2. 现成的链:用于完成特定更高级别任务的组件的结构化组装,可以理解为一个个任务。

简单安装

pip install langchain

二、 LangChain的主要模块

1.Model I/O

提供了丰富的语言模型的借口供用户调用
在这里插入图片描述
这里主要记录一波我觉得比较有用的几个点:

prompt模版定义

这个适用于批量处理某些问题,我可以定义一个模版,然后替换中间的某些内容喂入llm即可:

from langchain import PromptTemplate

template = """
你好请你回答下面的问题:
 {question}?
"""

prompt = PromptTemplate.from_template(template)
prompt.format(product="question")

有时候对于一个模版,我们可能需要传递多个参数。那么可以用下面的操作:

template = """
我会给你一些例子如下:
{example},
请你参考上面的例子,回答下面的问题:
 {question}?
"""
prompt = PromptTemplate(
    input_variables=["example", "question"], 
    template=template
)
parm={"example": "xxxx", "question":"qqqqqq"}
prompt.format(**parm)

调用语言模型

这里有两种类别:一种是llm,仅以单个文本为输入;另一种是chat model,以文本列表为输入。
llm调用:openai的模型需要key,这里需要点科技,自己去openai官网申请下

import os
from langchain.llms import OpenAI
os.environ["OPENAI_API_KEY"] = '你的api key'

llm = OpenAI(model_name="text-davinci-003", max_tokens=1024)
result = llm("你是谁?")

chat model调用

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)
chat = ChatOpenAI(openai_api_key="...")
result = chat([HumanMessage(content="你是谁?")])

2. 数据连接

提供了特定数据的接口,包括文档加载,文档处理,词嵌入等类,可以很方便处理输入。类似的构建基于知识库的聊天模型或者处理超长文本输入时,用这个就很方便。
在这里插入图片描述
这里记录一个处理超长文本输入的例子,首先使用document_loaders加载文本。如果想要用openai api输入一个超长的文本并进行返回,一旦文本超过了 api 最大的 token 限制就会报错。一个解决办法是使用text_splitter对输入进行分段,比如通过 tiktoken 计算并分割,然后将各段发送给 api 进行总结,最后将各段的总结再进行一个全部的总结。

from langchain.document_loaders import UnstructuredFileLoader
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain import OpenAI

# 导入文本
loader = UnstructuredFileLoader("test.txt")
# 将文本转成 Document 对象
document = loader.load()
print(f'documents:{len(document)}')

# 初始化文本分割器
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 500,
    chunk_overlap = 0
)

# 切分文本
split_documents = text_splitter.split_documents(document)
print(f'documents:{len(split_documents)}')

# 加载 llm 模型
llm = OpenAI(model_name="text-davinci-003", max_tokens=1500)

# 创建总结链
chain = load_summarize_chain(llm, chain_type="refine", verbose=True)

# 执行总结链
chain.run(split_documents)

3. chains

结构化调用序列:虽然说单独地使用LLM对于简单的应用程序来说很方便,但有时候我们可能需要使用不同的LLM,这时候使用chain来管理就很方便了。LangChain为此类“链式”应用程序提供了Chain接口。

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

llm = OpenAI(temperature=0.95)
prompt = PromptTemplate(
    input_variables=["question"],
    template="回答下面问题 {question}?",
)
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run("1+1=?"))

4. Agents

让链根据给定的高级指令选择使用哪些工具,这里我没怎么用过,到时候用到就看文档吧

5. Memory

在链运行之间保留应用程序状态
在这里插入图片描述
这里典型的应用就是聊天模型,我们需要记忆以往的聊天内容,用这个就比较方便了

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory

llm = OpenAI(temperature=0.95)
template = """你是我的聊天机器人,让我们聊天吧。
历史对话内容如下:
{chat_history}

那现在新的问题如下: {question}
请你回复进行:
"""
prompt = PromptTemplate.from_template(template)
memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "你好"})

做个for循环重复调用即可

Callbacks

记录并流式传输任何链的中间步骤,这个回调系统允许我们挂接在LLM应用程序的各个阶段。这对于日志记录、监视、流式传输和其他任务非常有用。

三、其他记录

多进程调用

如果有一大批数据需要预测,可以使用python的多进程调用

import os
import openai
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
# 运行此API配置,需要将目录中的.env中api_key替换为自己的
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.environ['OPENAI_API_KEY']


from concurrent.futures import ProcessPoolExecutor, as_completed
import time
import collections

# 这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
# 如果你想要每次得到不一样的有新意的答案,可以尝试调整该参数。
# 以下的对话均无记忆,即每次调用预测不会记得之前的对话。(想要有记忆功能请看下一节的langchain的Memory模块)
chat = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

print(chat)

# 定义预测函数
def predict(params):
    query, input = params
    res = chat(input)
    res = res.content
    return query, res

# def predict(prompt):
#     return prompt

def main():
    start_time = time.time()
    # 多进程并行预测
    # 您可能需要根据自己的需求调整间隔时间。另外,您可以根据需要调整进程池的大小,以获得更好的性能。
    template_string = """请回答下面的问题:{query}"""
    input_data = ['1+1等于几啊?', '2+2等于几啊?', '3+3等于几啊?', '4+4等于几啊?']
    prompt_template = ChatPromptTemplate.from_template(template_string)

    from langchain.schema import HumanMessage, SystemMessage
    system_msg = SystemMessage(content="你是一个数学家。")
    print(system_msg)

    # output_data = collections.defaultdict(int)
    with ProcessPoolExecutor(max_workers=2) as executor:
        # 异步调用(多进程并发执行)
        futures = []
        for query in input_data:
            prompt = prompt_template.format_messages(query=query)
            job = executor.submit(predict, (query, [system_msg]+prompt))
            futures.append(job)
            
		# 因为异步等待结果,返回的顺序是不定的,所以记录一下进程和输入数据的对应
        query2res = collections.defaultdict(int) 
        # 异步等待结果(返回顺序和原数据顺序可能不一致) ,直接predict函数里返回结果?
        for job in as_completed(futures):
            query, res = job.result(timeout=None)  # 默认timeout=None,不限时间等待结果
            query2res[query] = res
            time.sleep(1)  # 为了避免超过OpenAI API的速率限制,每次预测之间间隔1秒


    end_time = time.time()
    total_run_time = round(end_time-start_time, 3)
    print('Total_run_time: {} s'.format(total_run_time))
    print(query2res)
	
	# 保存结果
    import pandas as pd
    df = pd.DataFrame({'query': list(query2res.keys()), 'infer_result': list(query2res.values())})
    df.to_excel('./chatgpt_infer_result.xlsx', index=False)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)

一、概述 Docker持久化是指将容器中的数据持久保存在主机上,以便在容器重新启动或迁移时不丢失数据。由于Docker容器是临时和可变的,它们的文件系统默认是易失的,这意味着容器中的任何更改或创建的文件都只存在于此容器的生命周期内。但是&a…

LVDS端口ESD静电放电保护电路图(经典)

Low Voltage Differential Signaling(LVDS)是一种低压差分信号技术接口,是美国NS公司为克服以TTL电平方式传输宽带高码率数据时功耗大、EMI电磁干扰大等缺点而研制的一种数字视频信号传输方式。LVDS端口电路包括两部分:驱动板侧的…

3DEXPERIENCE用户角色 | Structural Mechanics Engineer 结构力学工程师

真实条件下实施复杂的线性和非线性分析 直观验证设计并更快地做出产品决策 Structural Mechanics Engineer 在基于云的 3DEXPERIENCE 平台上构建,您可对产品行为执行结构线性和非线性静态、低速和高速动态和热仿真。具备材料校准功能,有助于确保材料行为…

十分钟python入门 日期时间

1.Python 日期 Python 中的日期不是其自身的数据类型,但是我们可以导入名为 datetime 的模块,把日期视作日期对象进行处理。 1.1 导入 datetime 模块并显示当前日期: import datetime#导入 datetime 模块并显示当前日期: x da…

微信小程序接入腾讯云天御验证码

腾讯云新一代行为验证码(Captcha),基于十道安全防护策略,为网页、APP、小程序开发者打造立体、全面的人机验证。在保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。 …

在使用Python爬虫时遇到503 Service Unavailable错误解决办法汇总

在进行Python爬虫的过程中,有时会遇到503 Service Unavailable错误,这意味着所请求的服务不可用,无法获取所需的数据。为了解决这个常见的问题,本文将提供一些解决办法,希望能提供实战价值,让爬虫任务顺利完…

【问题随记】

ubuntu 14.04源更新(sources.list) deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-update…

MyBatis的使用方法

文章目录 一、MyBatis的创建准备工作 二、MyBatis的使用1.项目分层2.业务代码1&#xff09;使用XML的方法2&#xff09;直接使用注解 总结 一、MyBatis的创建 准备工作 1.添加依赖 旧项目 方法一&#xff1a;在pom.xml中添加MyBatis和MySQL Diver依赖 <!-- 添加 MyBati…

【Android】在AndroidStudio开发工具运行Java程序

在Android Studio开发工具中&#xff0c;Android系统开始就是用java语言开发的&#xff0c;还可以java代码来写程序&#xff0c;控制台&#xff0c;桌面应用&#xff0c;还可以写可调用的模块&#xff0c;这里讲一下创建Java程序步骤&#xff0c;方便入门java语言开发。 新建一…

批处理文件的@echo off是什么意思?

echo off 关闭回显 echo on 打开回显 echo off并不是DOS程序中的&#xff0c; 而是DOS批处理中的。 当年的DOS&#xff0c;所有操作都用键盘命令来完成&#xff0c; 当你每次都要输入相同的命令时&#xff0c; 可以把这么多命令存为一个批处理&#xff0c; 从此以后&#xff…

[Docker实现测试部署CI/CD----自由风格的CI操作[中间架构](4)]

10、自由风格的CI操作&#xff08;中间架构&#xff09; 中间架构图 创建web项目 创建一个 web 项目&#xff0c;就使用简单的 spring boot 工程&#xff0c;例如工程名为 hellojks。仅需导 入 spring web 依赖即可。 import org.springframework.web.bind.annotation.GetMapp…

轮足机器人硬件总结

简介 本文主要根据“轮腿机器人Hyun”总结的硬件部分。 轮腿机器人Hyun开源地址&#xff1a;https://github.com/HuGuoXuang/Hyun 1 电源部分 1.1 78M05 78M05是一款三端稳压器芯片&#xff0c;它可以将输入电压稳定输出为5V直流电压. 1.2 AMS1117-3.3 AMS1117-3.3是一种输…

Maven里面没有plugins dependence问题解决

说明&#xff1a;今天在做Nacos、Dubbo整合的时候&#xff0c;在父模块中做了版本限制&#xff0c;出错后就又把版本控制什么都删掉&#xff0c;回退到最开始的状态&#xff0c;此时父模块下面的服务右侧的 maven里面没有plugins dependence &#xff0c;然后项目全都报错。 问…

液冷数据中心规模化扩张在即,曙光数科发布“冷平衡”战略

出品 | CSDN 云计算 随着数字化深入&#xff0c;AI应用爆发&#xff0c;我国算力需求持续增长。面对服务器密度、双碳目标、降本增效的多重考量&#xff0c;平衡数据中心性能、功耗、成本的三元关系&#xff0c;成为摆在每个数据中心面前的难题&#xff0c;为此数据中心将目光转…

【C++】STL——set和map及multiset和multiset的介绍及使用

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

k8s概念-StatefulSet

StatefulSet 是用来管理有状态应用的控制器 StatefulSet 用来管理某Pod集合的部署和扩缩&#xff0c; 并为这些 Pod 提供持久存储和持久标识符StatefulSet | KubernetesStatefulSet 运行一组 Pod&#xff0c;并为每个 Pod 保留一个稳定的标识。 这可用于管理需要持久化存储或稳…

云曦暑期学习第三周——ctfshow--php特性(89-104)

目录 web89 preg_match函数 、数组 web90 intval()函数、强比较 web91 正则修饰符 web92 intval()函数、弱比较 web93 八进制、小数点 web94 strpos() 函数、小数点 web95 小数点 web96 highlight_file() 下的目录路径 web97 数组 web98 三目运算符 web9…

CMake简介

文章目录 为什么需要头文件为什么 C 需要声明头文件 - 批量插入几行代码的硬核方式头文件进阶 - 递归地使用头文件 CMake什么是编译器多文件编译与链接CMake 的命令行调用为什么需要库&#xff08;library&#xff09;CMake 中的静态库与动态库CMake 中的子模块子模块的头文件如…

企业邮箱费用详解!了解企业邮箱的费用及其相关信息

对于需要可靠的邮箱平台的企业来说&#xff0c;企业邮箱可能是最好的解决方案。有许多供应商提供企业邮箱服务&#xff0c;他们通常每月都有相应的费用。 在考虑企业邮箱的成本时&#xff0c;有几件事要记住。首先&#xff0c;您应该考虑使用邮箱服务的用户数量&#xff0c;因为…

基于Web智慧森林防火GIS监测预警可视化系统

森林火灾是森林最危险的敌人&#xff0c;也是林业最可怕的灾害&#xff0c;它会给森林带来毁灭性的后果。 建设背景 森林火灾&#xff0c;重在预防。随着现代技术的快速发展&#xff0c;数字化森林监控已成为及早发觉&#xff0c;排除森林火灾隐情的必要手段。充分利用现代科…