大型语言模型 (LLM) 的一个重要方面是这些模型用于学习的参数数量。模型拥有的参数越多,它就能更好地理解单词和短语之间的关系。这意味着具有数十亿个参数的模型有能力生成各种创造性的文本格式,并以信息丰富的方式回答开放式和挑战性的问题。
ChatGPT 等法学硕士利用 Transformer 模型,精通理解和生成人类语言,这使得它们对于需要自然语言理解的应用程序非常有用。然而,它们并非没有局限性,其中包括过时的知识、无法与外部系统交互、缺乏上下文理解,有时会产生听起来合理但不正确或无意义的响应等。
解决这些限制需要将法学硕士与外部数据源和功能集成,这可能会带来复杂性并需要广泛的编码和数据处理技能。再加上理解人工智能概念和复杂算法的挑战,导致了与使用法学硕士开发应用程序相关的学习曲线。
尽管如此,将法学硕士与其他工具集成以形成法学硕士支持的应用程序可以重新定义我们的数字景观。此类应用程序的潜力是巨大的,包括提高效率和生产力、简化任务、增强决策以及提供个性化体验。
在本文中,我们将更深入地研究这些问题,探索使用 Langchain 进行即时工程的先进技术,提供清晰的解释、实际示例以及如何实现它们的分步说明。
Langchain 是一个最先进的库,为设计、实现和调整提示带来了便利和灵活性。当我们解开即时工程的原理和实践时,您将学习如何利用 Langchain 的强大功能来发挥 GPT-4 等 SOTA 生成式 AI 模型的优势。
了解提示
在深入了解提示工程的技术细节之前,有必要了解提示的概念及其意义。
"提示"是一系列标记,用作语言模型的输入,指示它生成特定类型的响应。提示在引导模型的行为方面起着至关重要的作用。它们可以影响生成文本的质量,并且如果正确制作,可以帮助模型提供富有洞察力、准确且针对特定上下文的结果。
提示工程是设计有效提示的艺术和科学。目标是从语言模型中得出所需的输出。通过仔细选择和构建提示,可以引导模型生成更准确和相关的响应。在实践中,这涉及微调输入短语以适应模型的训练和结构偏差。
提示工程的复杂性包括从简单的技术(例如向模型提供相关关键字)到更高级的方法,包括设计复杂的结构化提示,利用模型的内部机制来发挥其优势。
Langchain:增长最快的提示工具
LangChain 由Harrison Chase于 2022 年 10 月推出,已成为2023 年 GitHub 上评价最高的开源框架之一。它提供了一个简化和标准化的界面,用于将大型语言模型 (LLM) 合并到应用程序中。它还为快速工程提供了功能丰富的界面,允许开发人员尝试不同的策略并评估其结果。通过使用Langchain,您可以更有效、更直观地执行快速的工程任务。
LangFlow作为一个用户界面,用于将 LangChain 组件编排成可执行流程图,从而实现快速原型设计和实验。
浪链填补了大众人工智能发展的关键空白。它支持一系列 NLP 应用程序(例如虚拟助手、内容生成器、问答系统等)来解决一系列现实问题。
LangChain 不是一个独立的模型或提供者,而是简化了与不同模型的交互,将 LLM 应用程序的功能扩展到简单 API 调用的限制之外。
浪链架构
LangChain的主要组件包括模型I/O、提示模板、内存、代理和链。
型号输入/输出
LangChain 通过使用称为模型 I/O 的标准化接口来封装各种语言模型,从而促进与各种语言模型的无缝连接。这有助于轻松进行模型切换,以实现优化或更好的性能。LangChain支持多种语言模型提供商,包括OpenAI、HuggingFace、Azure、Fireworks等。
提示模板
这些用于通过提供简洁的说明或示例来管理和优化与法学硕士的互动。优化提示可增强模型性能,其灵活性对输入过程有显着贡献。
提示模板的简单示例:
1234 | from langchain.prompts ``import PromptTemplate`` prompt ``= PromptTemplate(input_variables``=``[``"subject"``],``template``=``"What are the recent advancements in the field of {subject}?"``)``print``(prompt.``format``(subject``=``"<a href="``https:``/``/``www.unite.ai``/``what``-``is``-``natural``-``language``-``processing``/``">Natural Language Processing</a>"``)) |
---|
随着复杂性的提高,我们在 LangChain 中遇到了更复杂的模式,例如理性和行动(ReAct)模式。ReAct 是操作执行的重要模式,其中代理将任务分配给适当的工具,为其自定义输入,并解析其输出以完成任务。下面的 Python 示例展示了 ReAct 模式。它演示了浪链中的提示是如何构造的,使用一系列的想法和行动来推理问题并产生最终答案:
12345678910 | PREFIX ``= """Answer the following question using the given tools:"""`` FORMAT_INSTRUCTIONS ``= """Follow this format:``Question: {input_question}``Thought: your initial thought on the question``Action: your chosen action from [{tool_names}]``Action Input: your input for the action``Observation: the action's outcome"""`` SUFFIX ``= """Start!``Question: {input}``Thought:{agent_scratchpad}""" |
---|
记忆
内存是 LangChain 中的一个关键概念,它使法学硕士和工具能够随着时间的推移保留信息。这种有状态行为通过存储先前的响应、用户交互、环境状态和代理的目标来提高LangChain应用程序的性能。ConversationBufferMemory 和 ConversationBufferWindowMemory 策略分别帮助跟踪对话的完整部分或最近部分。对于更复杂的方法,ConversationKGMemory 策略允许将对话编码为知识图,该知识图可以反馈到提示中或用于预测响应,而无需调用 LLM。
代理商
代理通过执行操作和任务与世界交互。在LangChain中,代理结合了工具和链来执行任务。它可以建立与外界的信息检索连接,以扩充LLM知识,从而克服其固有的局限性。他们可以根据情况决定将计算传递给计算器或 Python 解释器。
代理配备了子组件:
- 工具:这些是功能组件。
- 工具包:工具的集合。
- 代理执行器:这是允许在工具之间进行选择的执行机制。
LangChain中的代理也遵循零样本ReAct模式,其中决策仅基于工具的描述。该机制可以通过内存进行扩展,以便考虑完整的对话历史记录。借助 ReAct,您可以提示法学硕士在思想/行动/观察循环中做出响应,而不是要求法学硕士自动完成您的文本。
链条
链,顾名思义,是允许 LangChain 库无缝处理语言模型输入和输出的操作序列。LangChain 的这些组成部分基本上是由链接组成的,这些链接可以是其他链,也可以是提示、语言模型或实用程序等原语。
将链条想象为工厂中的传送带。这条带上的每一步都代表一个特定的操作,可以调用语言模型,将 Python 函数应用于文本,甚至以特定方式提示模型。
LangChain将其链分为三种类型:实用链、通用链和组合文档链。我们将深入讨论实用链和通用链。
- 实用程序链专门设计用于从语言模型中提取狭义任务的精确答案。例如,让我们看一下 LLMMathChain。该实用程序链使语言模型能够执行数学计算。它接受自然语言的问题,语言模型反过来生成一个 Python 代码片段,然后执行该代码片段以产生答案。
- ****另一方面,通用链作为其他链的构建块,但不能直接独立使用。 这些链(例如 LLMChain)是基础链,通常与其他链结合来完成复杂的任务。例如,LLMChain 经常用于查询语言模型对象,方法是根据提供的提示模板格式化输入,然后将其传递到语言模型。
使用 Langchain 逐步实施即时工程
我们将引导您完成使用 Langchain 实施即时工程的过程。在继续之前,请确保您已安装必要的软件和软件包。
您可以利用 Docker、Conda、Pip 和 Poetry 等流行工具来设置 LangChain。这些方法的相关安装文件可以在 LangChain 存储库中找到,网址为{github.com/benman1/gen... Docker 的Dockerfile 、用于 Pip 的requirements.txt 、用于 Poetry 的 pyproject.toml 以及用于 Conda 的langchain_ai.yml文件。
在我们的文章中,我们将使用Python的标准包管理器Pip来方便第三方库的安装和管理。如果您的 Python 发行版中未包含它,您可以按照pip.pypa.io/上的说明安装 Pip 。
要使用 Pip 安装库,请使用命令pip install library_name
。
但是,Pip 本身并不管理环境。为了处理不同的环境,我们使用virtualenv工具。
在下一节中,我们将讨论模型集成。
第1步:设置Langchain
首先,您需要安装 Langchain 软件包。我们使用的是Windows操作系统。在终端中运行以下命令来安装它:
1 | pip ``install langchain |
---|
第二步:导入Langchain及其他必要模块
接下来,导入 Langchain 以及其他必要的模块。在这里,我们还导入了 Transformers 库,该库广泛用于 NLP 任务。
12 | import langchain``from transformers ``import AutoModelWithLMHead, AutoTokenizer |
---|
第 3 步:加载预训练模型
开放人工智能
OpenAI模型可以方便地与LangChain库或OpenAI Python客户端库对接。值得注意的是,OpenAI 为文本嵌入模型提供了 Embedding 类。两个关键的 LLM 模型是 GPT-3.5 和 GPT-4,主要区别在于令牌长度。每种型号的定价可以在 OpenAI 的网站上找到。虽然有像 GPT-4-32K 这样的更复杂的模型具有更高的令牌接受度,但并不总是能保证它们通过 API 的可用性。
访问这些模型需要 OpenAI API 密钥。这可以通过在 OpenAI 平台上创建帐户、设置计费信息并生成新密钥来完成。
12 | import os``os.environ[``"OPENAI_API_KEY"`` ] ``= 'your-openai-token' |
---|
成功创建密钥后,您可以将其设置为环境变量 (OPENAI_API_KEY) 或在 OpenAI 调用的类实例化期间将其作为参数传递。
考虑一个 LangChain 脚本来展示与 OpenAI 模型的交互:
12345 | 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 ``= "who is the president of the United States of America?"`` completion ``= llm(prompt) |
---|
The current President of the United States of America is Joe Biden. |
---|
在此示例中,代理被初始化以执行计算。该代理接受一个输入(一个简单的加法任务),使用提供的 OpenAI 模型对其进行处理并返回结果。
抱脸
Hugging Face是一个免费使用的 Transformers Python 库,与 PyTorch、TensorFlow 和 JAX 兼容,并包含BERT、T5等模型的实现。
Hugging Face 还提供 Hugging Face Hub,这是一个用于托管代码存储库、机器学习模型、数据集和 Web 应用程序的平台。
要将 Hugging Face 用作模型的提供者,您需要一个帐户和 API 密钥(可以从其网站获取)。该令牌可以在您的环境中以 HUGGINGFACEHUB_API_TOKEN 的形式提供。
考虑以下 Python 代码片段,它利用了 Google 开发的开源模型,即 Flan-T5-XXL 模型:
12345 | from langchain.llms ``import HuggingFaceHub`` llm ``= HuggingFaceHub(model_kwargs``=``{``"temperature"`` : ``0.5`` , ``"max_length"`` : ``64``},repo_id``=``"google/flan-t5-xxl"``)`` prompt ``= "In which country is Tokyo?"`` completion ``= llm(prompt)``print``(completion) |
---|
该脚本以问题作为输入并返回答案,展示模型的知识和预测能力。
第 4 步:基本快速工程
首先,我们将生成一个简单的提示并查看模型如何响应。
12345 | prompt ``= 'Translate the following English text to French: "{0}"'`` input_text ``= 'Hello, how are you?'`` 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 步:高级快速工程
虽然上述方法效果很好,但它没有充分利用即时工程的力量。让我们通过引入一些更复杂的提示结构来改进它。
12345 | prompt ``= 'As a highly proficient French translator, translate the following English text to French: "{0}"'`` input_text ``= 'Hello, how are you?'`` 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构建一个学术文献问答系统,可以回答有关最近发表的学术论文的问题。
首先,为了设置我们的环境,我们安装必要的依赖项。
1 | pip install langchain arxiv openai transformers faiss``-``cpu |
---|
安装完成后,我们创建一个新的 Python 笔记本并导入必要的库:
1234 | 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 相关的最新论文:
123456789101112131415 | 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)分别作为内容和来源。
12345678910 | def print_answer(question):`` ``print``(`` ``chain(`` ``{`` ``"input_documents"``: sources,`` ``"question"``: question,`` ``},`` ``return_only_outputs``=``True``,`` ``)[``"output_text"``]`` ``) |
---|
让我们定义我们的语料库并设置 LangChain:
12 | sources ``= get_arxiv_data(``2``)`` chain ``= load_qa_with_sources_chain(OpenAI(temperature``=``0``)) |
---|
我们的学术问答系统现已准备就绪,我们可以通过提出问题来测试它:
1 | print_answer(``"What are the recent advancements in NLP?"``) |
---|
输出将是您问题的答案,并引用提取信息的来源。例如:
Recent advancements in NLP include Retriever-augmented instruction-following models and a novel computational framework for solving alternating current optimal power flow (ACOPF) problems using graphics processing units (GPUs).``SOURCES: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1 |
---|
您可以根据需要轻松切换型号或更改系统。例如,我们在这里更改为 GPT-4,这最终为我们提供了更好、更详细的响应。
12 | sources ``= get_arxiv_data(``2``)`` chain ``= load_qa_with_sources_chain(OpenAI(model_name``=``"gpt-4"``,temperature``=``0``)) |
---|
Recent advancements in Natural Language Processing (NLP) include the development of retriever-augmented instruction-following models for information-seeking tasks such as question answering (QA). These models can be adapted to various information domains and tasks without additional fine-tuning. However, they often struggle to stick to the provided knowledge and may hallucinate in their responses. Another advancement is the introduction of a computational framework for solving alternating current optimal power flow (ACOPF) problems using graphics processing units (GPUs). This approach utilizes a single-instruction, multiple-data (SIMD) abstraction of nonlinear programs (NLP) and employs a condensed-space interior-point method (IPM) with an inequality relaxation strategy. This strategy allows for the factorization of the KKT matrix without numerical pivoting, which has previously hampered the parallelization of the IPM algorithm.``SOURCES: 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 这样的工具,由于标记限制而必须将文本分成更小的块有时会导致上下文丢失,从而影响答案的质量。因此,在使用这些大型语言模型时,仔细管理和优化令牌使用至关重要。
1 | pip ``install faiss-cpu langchain CharacterTextSplitter |
---|
确保安装了上述库后,运行
123456789101112131415161718192021 | 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`` ) ``# We can now use feed more data`` 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"``]`` ``) |
---|
代码完成后,我们现在就有了一个查询NLP领域最新学术文献的强大工具。
Recent advancements in NLP include the use of deep neural networks (DNNs) for automatic text analysis and natural language processing (NLP) tasks such as spell checking, language detection, entity extraction, author detection, question answering, and other tasks.``SOURCES: http://arxiv.org/abs/2307.10652v1, http://arxiv.org/abs/2307.07002v1, http://arxiv.org/abs/2307.12114v1, http://arxiv.org/abs/2307.16217v1 |
---|
结论
将大型语言模型 (LLM) 集成到应用程序中加速了多个领域的采用,包括语言翻译、情感分析和信息检索。快速工程是最大限度发挥这些模型潜力的强大工具,而 Langchain 在简化这一复杂任务方面处于领先地位。其标准化界面、灵活的提示模板、强大的模型集成以及代理和链的创新使用确保了法学硕士的最佳表现。
然而,尽管取得了这些进步,但仍有一些提示需要牢记。当您使用 Langchain 时,必须了解输出的质量在很大程度上取决于提示的措辞。尝试不同的提示样式和结构可以产生更好的结果。另外,请记住,虽然 Langchain 支持多种语言模型,但每种语言模型都有其优点和缺点。为您的特定任务选择合适的产品至关重要。最后,重要的是要记住,使用这些模型需要考虑成本,因为令牌处理直接影响交互成本。
正如分步指南中所演示的,Langchain 可以为强大的应用程序提供支持,例如学术文献问答系统。随着用户社区的不断壮大以及在开源领域的日益突出,Langchain 有望成为充分利用 GPT-4 等 LLM 潜力的关键工具。