本文主要介绍了 Langchain的概念,相关组件,以及大模型微调代码实现~
LangChain是一个平台,提供工具和API,用于构建由语言模型(LLM)驱动的应用程序。它简化了 LLM 与项目的集成,能够利用高级语言处理功能。
pip install langchain
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")
使用 LangChain 与 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)
LangChain提供了多样化的功能,关键组件包括 模型、提示、链、索引和内存,代理,并发现每个组件可以完成什么。
目前出现了许多新的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?")
]
)
文本输入由文本嵌入模型接收,然后输出以数字方式表示输入文本的嵌入列表。可以使用嵌入从文本中提取信息然后应用此信息,例如,确定两个文本的相似程度,例如电影摘要。
embeddings = OpenAIEmbeddings()
text = "Alice has a parrot. What animal is Alice's pet?"
text_embedding = embeddings.embed_query(text)
尽管在自然语言中向 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")
将LLM与其他组件组合在一起以创建应用程序的过程在LangChain中称为链接。示例包括:
chain = LLMChain(llm = llm,
prompt = prompt)
chain.run("colorful socks")
缺乏上下文信息,例如访问特定文档或电子邮件是 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'])
对于聊天机器人等程序来说,能够回忆起以前的对话至关重要。但是,除非输入聊天记录,否则默认情况下 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?")
要微调 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)
【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博客