Press "Enter" to skip to content

使用Python进行零到高级的Langchain提示工程化

大型语言模型(LLM)的一个重要方面是这些模型用于学习的参数数量。模型的参数越多,它就越能理解词语和短语之间的关系。这意味着具有数十亿参数的模型能够生成各种创造性的文本格式,并以信息性的方式回答开放性和具有挑战性的问题。

像ChatGPT这样利用Transformer模型的LLM在理解和生成人类语言方面非常熟练,使其在需要自然语言理解的应用中非常有用。然而,它们也有一些局限性,包括过时的知识、无法与外部系统交互、缺乏上下文理解以及有时生成听起来合理但错误或荒谬的回答等。

使用Python进行零到高级的Langchain提示工程化 四海 第1张

要解决这些局限性,需要将LLM与外部数据源和能力集成在一起,这可能涉及复杂性并需要广泛的编码和数据处理技能。这与理解AI概念和复杂算法的挑战相结合,导致使用LLM开发应用程序的学习曲线。

然而,将LLM与其他工具集成形成LLM驱动的应用程序可以重新定义我们的数字化景观。这类应用程序的潜力是巨大的,包括提高效率和生产力,简化任务,增强决策能力和提供个性化体验。

在本文中,我们将深入探讨这些问题,探索使用Langchain进行提示工程的高级技术,提供清晰的解释、实际的例子和逐步的实施说明。

Langchain是一个先进的库,为设计、实施和调整提示提供便利和灵活性。当我们深入讨论提示工程的原则和实践时,您将学会如何利用Langchain强大的功能来发挥SOTA生成AI模型(如GPT-4)的优势。

理解提示

在深入研究提示工程的技术细节之前,了解提示的概念及其重要性是至关重要的。

‘提示’是一系列的标记序列,用作语言模型的输入,指示其生成特定类型的响应。提示在引导模型行为方面起着关键作用。它们可以影响生成文本的质量,并在正确设计时帮助模型提供有见地、准确和特定上下文的结果。

提示工程是设计有效提示的艺术和科学。目标是从语言模型中引出所需的输出。通过精心选择和构建提示,可以引导模型生成更准确、相关的响应。在实践中,这涉及微调输入短语以适应模型的训练和结构偏差。

提示工程的复杂程度从简单的技术,如提供相关关键词给模型,到涉及设计复杂的结构提示并利用模型的内部机制的更高级方法。

Langchain:最快增长的提示工具

Langchain由Harrison Chase于2022年10月推出,成为2023年GitHub上评分最高的开源框架之一。它为将大型语言模型(LLM)集成到应用程序中提供了一个简化和标准化的界面。它还提供了一个功能丰富的界面,用于提示工程,使开发人员能够尝试不同的策略并评估其结果。通过使用Langchain,您可以更有效、直观地执行提示工程任务。

LangFlow作为用户界面,将LangChain组件编排为可执行流程图,实现快速原型设计和实验。

使用Python进行零到高级的Langchain提示工程化 四海 第2张

Langchain填补了大众AI开发中的一个重要空白。它使得一系列NLP应用如虚拟助手、内容生成器、问答系统等能够解决各种现实问题。

LangChain不仅仅是一个独立的模型或提供者,它简化了与各种模型的交互,扩展了LLM应用的能力,超越了简单的API调用的限制。

LangChain的架构

 

使用Python进行零到高级的Langchain提示工程化 四海 第3张

LangChain的主要组件包括模型输入/输出、提示模板、内存、代理和链。

模型输入/输出

LangChain通过包装标准化接口Model I/O,实现与各种语言模型的无缝连接。这样可以轻松切换模型以进行优化或提高性能。LangChain支持多种语言模型提供商,包括OpenAI、HuggingFace、Azure、Fireworks等。

提示模板

提示模板用于管理和优化与LLM的交互,通过提供简明的指示或示例来增强模型性能。优化提示可以显著提升模型性能,而灵活性则对输入过程产生重要影响。

一个简单的提示模板示例:

from langchain.prompts import PromptTemplate
prompt = PromptTemplate(input_variables=["subject"],
template="关于{subject}领域的最新进展是什么?")
print(prompt.format(subject="自然语言处理"))

随着复杂度的提高,我们在LangChain中遇到了更复杂的模式,如Reason and Act(ReAct)模式。ReAct是一种重要的动作执行模式,其中代理将任务分配给适当的工具,定制其输入,并解析输出以完成任务。下面的Python示例展示了ReAct模式,演示了如何在LangChain中构建一个提示,使用一系列的思考和动作来推理问题并产生最终答案:

PREFIX = """使用给定的工具回答以下问题:"""
FORMAT_INSTRUCTIONS = """按照以下格式进行操作:
问题:{input_question}
思考:对问题的初始思考
动作:从[{tool_names}]中选择的动作
动作输入:动作的输入
观察:动作的结果"""
SUFFIX = """开始!
问题:{input}
思考:{agent_scratchpad}"""

记忆

记忆是LangChain中的一个关键概念,使LLM和工具能够长时间保留信息。这种有状态的行为通过存储先前的响应、用户交互、环境状态和代理目标来提高LangChain应用程序的性能。ConversationBufferMemory和ConversationBufferWindowMemory策略有助于跟踪对话的全部或最近部分。对于更复杂的方法,ConversationKGMemory策略允许将对话编码为知识图,可以将其反馈到提示中或用于预测响应而无需调用LLM。

代理

代理通过执行动作和任务与世界进行交互。在LangChain中,代理将工具和链结合起来执行任务。它可以与外部世界建立连接以获取信息,以增强LLM的知识,从而克服其固有的限制。根据情况,它们可以决定将计算传递给计算器或Python解释器。

代理配备有子组件:

  • 工具:这些是功能组件。
  • 工具包:工具的集合。
  • 代理执行器:这是允许在工具之间进行选择的执行机制。

在LangChain中,代理也遵循零-shot ReAct模式,决策仅基于工具的描述。该机制可以通过记忆进行扩展,以考虑完整的对话历史记录。通过ReAct,您可以提示LLM以在思考/动作/观察循环中进行回应,而不是要求LLM自动完成您的文本。

链,顾名思义,是LangChain库用于无缝处理语言模型输入和输出的操作序列。LangChain的这些重要组成部分基本上由链接组成,链接可以是其他链,也可以是提示、语言模型或实用工具等基本元素。

想象一下链就像工厂中的传送带。这个传送带上的每一步代表一定的操作,可以是调用语言模型、将Python函数应用于文本,甚至以特定的方式提示模型。

LangChain将其链分为三种类型:实用链、通用链和合并文档链。我们将重点讨论实用链和通用链。

  • 实用链专门设计用于从语言模型中提取精确答案,用于狭义定义的任务。例如,让我们看一下LLMMathChain。这个实用链使语言模型能够执行数学计算。它接受一个自然语言问题,然后语言模型生成一个Python代码片段,然后执行该代码以产生答案。
  • 通用链则用作其他链的构建块,但不能直接独立使用。这些链,如LLMChain,是基础的,经常与其他链组合以完成复杂的任务。例如,LLMChain经常用于通过根据提供的提示模板格式化输入,并将其传递给语言模型来查询语言模型对象。

使用Langchain逐步实现Prompt Engineering

我们将引导您了解使用Langchain实现Prompt Engineering的过程。在继续之前,请确保您已安装了必要的软件和包。

您可以使用Docker、Conda、Pip和Poetry等流行工具来设置LangChain。每种方法的相关安装文件都可以在LangChain存储库(https://github.com/benman1/generative_ai_with_langchain)中找到。其中包括用于Docker的Dockerfile,用于Pip的requirements.txt,用于Poetry的pyproject.toml,以及用于Conda的langchain_ai.yml文件。

在我们的文章中,我们将使用Pip作为Python的标准软件包管理器,以便安装和管理第三方库。如果它没有包含在您的Python发行版中,您可以按照https://pip.pypa.io/上的说明安装Pip。

要使用Pip安装库,使用命令pip install library_name

然而,Pip无法独自管理环境。为了处理不同的环境,我们使用了工具virtualenv

在下一节中,我们将讨论模型集成。

步骤1:设置Langchain

首先,您需要安装Langchain包。我们正在使用Windows操作系统。在终端中运行以下命令以安装它:

pip install langchain

步骤2:导入Langchain和其他必要的模块

接下来,导入Langchain以及其他必要的模块。在这里,我们还导入了transformers库,该库在NLP任务中被广泛使用。

import langchain
from transformers import AutoModelWithLMHead, AutoTokenizer

步骤3:加载预训练模型

Open AI

OpenAI模型可以方便地与LangChain库或OpenAI Python客户端库交互。值得注意的是,OpenAI为文本嵌入模型提供了一个Embedding类。两个重要的LLM模型是GPT-3.5和GPT-4,主要区别在于标记长度。每个模型的定价可以在OpenAI的网站上找到。虽然还有更复杂的模型,如GPT-4-32K,其标记接受性更高,但它们通过API的可用性并不总是保证的。

使用Python进行零到高级的Langchain提示工程化 四海 第4张

访问这些模型需要一个OpenAI API密钥。您可以通过在OpenAI平台上创建帐户、设置结算信息并生成新的秘密密钥来完成此操作。

import os
os.environ["OPENAI_API_KEY"] = 'your-openai-token'

成功创建密钥后,您可以将其设置为环境变量(OPENAI_API_KEY)或在OpenAI调用的类实例化期间将其作为参数传递。

考虑一个LangChain脚本,以展示与OpenAI模型的交互:

from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# LLM将prompt作为输入,并输出一个完成的结果
prompt = "美国总统是谁?"
completion = llm(prompt)

美国的现任总统是乔·拜登。

在这个示例中,初始化了一个代理来进行计算。代理接收一个输入,一个简单的加法任务,使用提供的OpenAI模型进行处理,并返回结果。

Hugging Face

Hugging Face是一个免费使用的Transformers Python库,与PyTorch、TensorFlow和JAX兼容,并包含了BERT、T5等模型的实现。

Hugging Face还提供了Hugging Face Hub,一个用于托管代码存储库、机器学习模型、数据集和Web应用程序的平台。

要将Hugging Face用作模型的提供者,您需要一个帐户和API密钥,可以从其网站上获取。令牌可以在您的环境中作为HUGGINGFACEHUB_API_TOKEN提供。

考虑以下使用谷歌开源模型Flan-T5-XXL的Python代码片段:

“`python
from langchain.llms import HuggingFaceHub
llm = HuggingFaceHub(model_kwargs={“temperature”: 0.5, “max_length”: 64},repo_id=”google/flan-t5-xxl”)
prompt = “东京位于哪个国家?”
completion = llm(prompt)
print(completion)
“`

此脚本接受一个问题作为输入并返回一个答案,展示了模型的知识和预测能力。

第4步:基本提示工程
首先,我们将生成一个简单的提示并查看模型的响应。

“`python
prompt = ‘将以下英文文本翻译成法语:”{0}”‘
input_text = ‘你好,你好吗?’
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors=’pt’)
generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
“`

在上面的代码片段中,我们提供了一个提示,将英文文本翻译成法语。语言模型然后根据提示尝试翻译给定的文本。

第5步:高级提示工程
虽然上述方法效果不错,但没有充分利用提示工程的威力。让我们通过引入一些更复杂的提示结构来改进它。

“`python
prompt = ‘作为一名高级法语翻译员,将以下英文文本翻译成法语:”{0}”‘
input_text = ‘你好,你好吗?’
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors=’pt’)
generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
“`

在此代码片段中,我们修改了提示,提示翻译由“高级法语翻译员”完成。提示的改变可以导致改进的翻译,因为模型现在假设自己是一个专家的角色。

使用LangChain构建学术文献问答系统
我们将使用LangChain构建一个学术文献问答系统,可以回答关于最近发表的学术论文的问题。

第2节
首先,为了设置我们的环境,我们安装必要的依赖项。

“`python
pip install langchain arxiv openai transformers faiss-cpu
“`

安装完成后,我们创建一个新的Python笔记本并导入必要的库:

“`python
from langchain.llms import OpenAI
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.docstore.document import Document
import arxiv
“`

我们的问答系统的核心是能够获取与某个领域相关的相关学术论文,这里我们考虑自然语言处理(NLP),使用arXiv学术数据库。为了执行此操作,我们定义一个函数`get_arxiv_data(max_results=10)`。此函数从arXiv收集最近的NLP论文摘要,并将它们封装成LangChain Document对象,使用摘要作为内容和唯一条目ID作为来源。

我们将使用arXiv API获取与NLP相关的最新论文:

“`python
def get_arxiv_data(max_results=10):
search = arxiv.Search(
query=”NLP”,
max_results=max_results,
sort_by=arxiv.SortCriterion.SubmittedDate,
)

documents = []

for result in search.results():
documents.append(Document(
page_content=result.summary,
metadata={“source”: result.entry_id},
))
return documents
“`

此函数从arXiv检索最新的NLP论文摘要,并将它们转换为LangChain Document对象。我们使用论文的摘要和其唯一条目ID(指向论文的URL)作为内容和来源。

“`python
def print_answer(question):
print(
chain(
{
“input_documents”: sources,
“question”: question,
},
return_only_outputs=True,
)[“output_text”]
)
“`

此函数打印回答问题的答案。

让我们定义我们的语料库并设置LangChain:

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(temperature=0))

现在我们的学术问答系统已经准备好了,我们可以通过提问来测试它:

print_answer("自然语言处理的最新进展是什么?")

输出将是您问题的答案,引用从中提取信息的来源。例如:

自然语言处理的最新进展包括增强型指令跟随模型和使用图形处理单元(GPU)解决交流电最优潮流(ACOPF)问题的新型计算框架。
来源:http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1

您可以根据需要轻松切换模型或更改系统。例如,这里我们将切换到GPT-4,这样就能得到更好和更详细的响应。

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(model_name="gpt-4",temperature=0))

自然语言处理的最新进展包括为信息检索任务(如问答)开发增强型指令跟随模型。这些模型可以适应各种信息领域和任务,无需额外的微调。然而,它们在保持提供的知识方面常常困难,并且在回答中可能出现幻觉。另一个进展是引入了使用图形处理单元(GPU)解决交流电最优潮流(ACOPF)问题的计算框架。该方法利用非线性程序(NLP)的单指令多数据(SIMD)抽象,并采用具有不等式松弛策略的紧凑空间内点法(IPM)。这种策略允许对KKT矩阵进行因式分解,而无需数值枢轴,这在过去阻碍了IPM算法的并行化。
来源:http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1

GPT-4中的一个令牌可以是一个字符或一个单词。例如,GPT-4-32K可以一次处理多达32,000个令牌,而GPT-4-8K和GPT-3.5-turbo分别支持8,000和4,000个令牌。然而,重要的是要注意,与这些模型的每次交互都会有与处理的令牌数量成正比的成本,无论是输入还是输出。

在我们的问答系统中,如果一篇学术文献超过了最大令牌限制,系统将无法完整地处理它,从而影响了响应的质量和完整性。为了解决这个问题,可以将文本分解为符合令牌限制的较小部分。

FAISS(Facebook AI相似性搜索)可以帮助快速找到与用户查询相关的最相关的文本块。它为每个文本块创建一个向量表示,并使用这些向量来识别和检索与给定问题的向量表示最相似的块。

重要的是要记住,即使使用了FAISS等工具,由于令牌限制需要将文本分成较小的块,有时会丢失上下文,从而影响答案的质量。因此,在使用这些大型语言模型时,仔细管理和优化令牌的使用非常重要。

pip install faiss-cpu langchain CharacterTextSplitter

确保安装了上述库后,运行:

from langchain.embeddings.openai import OpenAIEmbeddings 
from langchain.vectorstores.faiss import FAISS 
from langchain.text_splitter import CharacterTextSplitter 
documents = get_arxiv_data(max_results=10) # 我们现在可以提供更多数据
document_chunks = []
splitter = CharacterTextSplitter(separator=" ", chunk_size=1024, chunk_overlap=0)
for document in documents:
    for chunk in splitter.split_text(document.page_content):
        document_chunks.append(Document(page_content=chunk, metadata=document.metadata))
search_index = FAISS.from_documents(document_chunks, OpenAIEmbeddings())
chain = load_qa_with_sources_chain(OpenAI(temperature=0))
def print_answer(question):
    print(
        chain(
            {
                "input_documents": search_index.similarity_search(question, k=4),
                "question": question,
            },
            return_only_outputs=True,
        )["output_text"]
    )

代码完成后,我们现在拥有了一个强大的工具,可以查询自然语言处理领域的最新学术文献。

自然语言处理的最新进展包括使用深度神经网络(DNN)进行自动文本分析和自然语言处理(NLP)任务,例如拼写检查、语言检测、实体提取、作者检测、问答等任务。
来源:http://arxiv.org/abs/2307.10652v1,http://arxiv.org/abs/2307.07002v1,http://arxiv.org/abs/2307.12114v1,http://arxiv.org/abs/2307.16217v1 

结论

将大型语言模型(LLMs)集成到应用程序中加速了多个领域的采用,包括语言翻译、情感分析和信息检索。Prompt工程是最大化这些模型潜力的强大工具,Langchain在简化这一复杂任务方面处于领先地位。其标准化接口、灵活的提示模板、强大的模型集成以及智能代理和链条的创新使用确保了LLMs性能的最佳结果。

然而,尽管有这些进展,仍有一些要记住的小技巧。在使用Langchain时,理解输出质量严重依赖于提示的措辞是至关重要的。尝试不同的提示风格和结构可以改善结果。此外,请记住,虽然Langchain支持各种语言模型,但每个模型都有其优点和缺点。选择适合特定任务的正确模型至关重要。最后,需要记住使用这些模型会涉及成本考虑,因为令牌处理直接影响交互的成本。

如逐步指南所示,Langchain可以支持强大的应用程序,例如学术文献问答系统。随着用户社区的不断增长和在开源领域的日益重要性,Langchain有望成为发挥GPT-4等LLMs全部潜力的关键工具。

Leave a Reply

Your email address will not be published. Required fields are marked *