LLM | 一文搞懂Langchain的概念,相关组件,以及大模型微调~

本文主要介绍了 Langchain的概念,相关组件,以及大模型微调代码实现~

1.什么是LangChain?

LangChain是一个平台,提供工具和API,用于构建由语言模型(LLM)驱动的应用程序。它简化了 LLM 与项目的集成,能够利用高级语言处理功能。

2.设置 LangChain

2.1.LangChain的安装

使用 pip 安装
pip install langchain
 使用 conda 安装
conda install langchain -c conda-forge

有关导入有效使用 LLM 所需的必要库和依赖项的说明,本文主要是结合openai的chatgpt的实例。

import langchain
import openai
import os
import IPython
from langchain.llms import OpenAI
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import LLMChain
from langchain.chains import RetrievalQA
from langchain import ConversationChain

load_dotenv()
# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")

2.2.使用LangChain与LLM交互

使用 LangChain 与 LLM 交互涉及一系列步骤,利用预训练语言模型的强大功能来生成文本理解任务。以下是每个部分的详细说明,以及代码实现。

初始化 LLM

要在LangChain中初始化LLM,首先需要导入必要的库和依赖。

from langchain import LangModel

# Specify the language model you want to use
model_name = 'gpt3'

# Initialize the LLM
llm = LangModel(model_name)
输入提示

初始化 LLM 后,可以输入提示以生成文本或获取响应。提示是语言模型生成文本的起点。可以根据需要提供单个提示或多个提示。下面是一个示例:

# Input a single prompt
prompt = "Once upon a time"

# Generate text based on the prompt
generated_text = llm.generate_text(prompt)
 检索生成的文本或响应

输入提示后,可以从 LLM 中检索生成的文本或响应。生成的文本或响应将基于提示提供的上下文和语言模型的功能。下面是一个示例:

# Print the generated text
print(generated_text)

# Print the responses
for response in responses:
    print(response)

2.3.Langchain可以做什么?

LangChain提供了多样化的功能,关键组件包括 模型、提示、链、索引和内存,代理,并发现每个组件可以完成什么。

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

目前出现了许多新的LLM。LangChain为各种模型提供了简化的界面和集成。

LangChain的核心是强大的语言模型(LLM),使应用程序能够理解和生成类似人类的文本。借助LangChain,开发人员可以访问广泛的LLM集合,每个LLM都经过大量数据的训练,以在各种与语言相关的任务中表现出色。无论是理解用户查询、生成响应,还是执行复杂的语言任务,LangChain的模型都是语言处理能力的支柱。

from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")

# The LLM takes a prompt as an input and outputs a completion
prompt = "How many days are there in a month"
completion = llm(prompt)

聊天模型

这将使用 ChatOpenAI 类在用户和 AI 聊天机器人之间建立对话。聊天机器人的初始化temperature为 0,这使得其响应更加集中和确定。对话以系统消息开始,说明机器人的用途,然后是表达食物偏好的人类消息。聊天机器人将根据给定的输入生成响应。

chat = ChatOpenAI(temperature=0)

chat(
    [
        SystemMessage(content="You are a nice AI bot that helps a user figure out 
          what to eat in one short sentence"),
        HumanMessage(content="I like tomatoes, what should I eat?")
    ]
)
2.3.2.文本嵌入模型

文本输入由文本嵌入模型接收,然后输出以数字方式表示输入文本的嵌入列表。可以使用嵌入从文本中提取信息然后应用此信息,例如,确定两个文本的相似程度,例如电影摘要。

embeddings = OpenAIEmbeddings()

text = "Alice has a parrot. What animal is Alice's pet?"
text_embedding = embeddings.embed_query(text)
2.3.3.提示

尽管在自然语言中向 LLM 添加提示应该感觉很自然,但必须对提示进行重大更改,然后才能获得所需的结果。这称为提示工程

一旦有了好的提示,可能想把好提示用作其他事情的模板。因此,LangChain提供了PromptTemplates,它使能够从各种组件中构建提示。

template = "What is a good name for a company that makes {product}?"

prompt = PromptTemplate(
    input_variables=["product"],
    template=template,
)

prompt.format(product="colorful socks")
 2.3.4.链

将LLM与其他组件组合在一起以创建应用程序的过程在LangChain中称为链接。示例包括:

  • 结合提示模板和 LLM
  • 通过使用第一个 LLM 的输出作为第二个 LLM 的输入,可以按顺序组合多个 LLS。
  • 例如,将 LLM 与外部数据相结合来回答问题。
  • 将 LLM 与长期记忆(例如聊天记录)相结合。
chain = LLMChain(llm = llm, 
                  prompt = prompt)

chain.run("colorful socks")
 2.3.5.指标

缺乏上下文信息,例如访问特定文档或电子邮件是 LLM 的一个缺点。 授予 LLM 对特定外部数据的访问权限将帮助您避免这种情况。

准备好将外部数据存储为文档后,可以使用文本嵌入模型在名为 VectorStore 的矢量数据库中对其进行索引。

矢量存储现在将文档存储为嵌入。有了这些外部数据,可以执行许多操作。

将它用于基于信息检索器的问答任务

retriever = db.as_retriever()

qa = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=retriever, 
    return_source_documents=True)

query = "What am I never going to do?"
result = qa({"query": query})

print(result['result'])
 2.3.6.记忆

对于聊天机器人等程序来说,能够回忆起以前的对话至关重要。但是,除非输入聊天记录,否则默认情况下 LLM 缺乏任何长期记忆。

通过提供许多处理聊天记录的选项,LangChain通过保持所有对话,跟上最近的K对话,并总结所说的内容来解决这个问题。

conversation = ConversationChain(llm=llm, verbose=True)
conversation.predict(input="Alice has a parrot.")
conversation.predict(input="Bob has two cats.")
conversation.predict(input="How many pets do Alice and Bob have?")

 2.4.使用LangChain微调工作流程

数据集准备

要微调 LLM,请根据特定任务或领域定制数据集。首先收集或整理与目标应用程序一致的标记数据集。该数据集应包括输入输出对或适合微调过程的格式。

配置参数

在LangChain界面中,开发人员可以指定所需的LLM架构,例如层数、模型大小和其他相关参数。这些配置定义了要训练的模型的架构和容量,使开发人员能够在性能和计算资源之间取得适当的平衡。

培训流程

LangChain利用分布式计算资源来高效训练LLM。开发者发起训练流程,LangChain优化训练流水线,确保资源高效利用,收敛速度更快。在训练过程中,模型从提供的数据集中学习,调整其参数以捕获特定于目标任务或域的细微差别和模式。

一旦你准备好了数据集,你就可以开始使用LangChain进行微调过程。首先,导入必要的库和依赖项。然后,初始化预训练的 LLM 并在自定义数据集上对其进行微调。下面是一个示例:

from langchain import LangModel

# Initialize the pre-trained LLM
pre_trained_model = LangModel('gpt3')

# Load and preprocess your dataset
dataset = load_dataset('your_dataset.txt')
preprocessed_dataset = preprocess(dataset)

# Fine-tune the LLM on your dataset
fine_tuned_model = pre_trained_model.fine_tune(preprocessed_dataset, 
  num_epochs=5, batch_size=16)

3.使用LangChain的好处

  • 使用 LangChain 微调 LLM 可以提高模型的准确性和与特定任务或领域的上下文相关性,从而产生更高质量的输出。
  • LangChain允许开发人员自定义LLM来处理独特的任务、行业特定的术语和特定的领域上下文,以满足特定的用户需求。
  • 微调的 LLM 支持开发功能强大的应用程序,同时更深入地了解特定领域的语言,从而获得更准确和上下文感知的响应。
  • 使用LangChain进行微调减少了对大量训练数据和计算资源的需求,节省了时间和精力,同时实现了显著的性能改进。

参考文献

【1】Building LLM-Powered Applications with LangChain (analyticsvidhya.com)

【2】Generative AI Applications with LangChain and OpenAI API (analyticsvidhya.com) 

【3】Revamp Data Analysis Using OpenAI, LangChain & LlamaIndex (analyticsvidhya.com)

【4】Mastering Prompt Engineering for LLM Applications with LangChain (analyticsvidhya.com) 

【5】 (万字长文)手把手教你认识学会LangChain - 知乎 (zhihu.com)

【6】LangChain 介绍及相关组件使用总结-CSDN博客 

猜你喜欢

转载自blog.csdn.net/weixin_44649780/article/details/134763967