建议先了解一下附录知识。
文章目录
- 1 官方课程内容自述
- Lesson 1: 大型语言模型(LLMs)简介
- Lesson 2: 自然语言处理(NLP)基础
- Lesson 3: Transformer 和注意力机制
- Lesson 4: 检索增强生成(RAG)
- Lesson 5: 为大型语言模型构建自定义数据集
- Lesson 6 - 项目:构建你自己的自定义聊天机器人
- 2 练习
- 2.1 Introduction to LLMs
- 1. **chatbot_memory_management.ipynb**
- 2. **demo_cot_and_triggers.ipynb**
- 2.2 NLP Fundamentals
- 1 encoding.ipynb
- 2 hugging-face-tokenizer.ipynb
- 3 hugging-face-tokenizer-properties.ipynb
- 4 text-generation.ipynb
- 2.3 Transformers and Self Attention
- exercise-1-implement-self-attention-solution.ipynb
- exercise-2-create-your-own-gpt-model-solution.ipynb
- 2.4 Retrieval Augmented Generation(RAG)
- end-to-end-code-casestudy.ipynb
- 2.5 Build Custom Datasets(网页抓取、数据清理、数据集制作)
- 1. `Simple_Scraper_STARTER.ipynb`
- 2. `Basic Web Scraping.ipynb`
- 3. `Cleaning Data.ipynb(内容丰富)`
- 4. `Building_QA_Datasets_SOLUTION.ipynb`
- 5. `Causal LM Datasets.ipynb`
- 3 项目:构建一个自定义聊天机器人
- 3.1 该项目总结
- 3.2 具体流程步骤
- 1\. 最新数据的收集与准备
- 2\. 数据预处理、嵌入向量生成、保存到本地
- 3\. 检索与问题相关信息
- 4\. 制作提示词并调用大模型
- 3.3 效果展示
- 测试1
- 测试2
- 4 附录
- 4.1 调用大模型对话时,为什么要截断对话历史?
- 1. **模型的注意力窗口限制**
- 2. **提升效率和减少计算资源**
- 3. **保持对话的相关性**
- 4. **避免超过 API 的限制**
- 5. **简单截断 vs 复杂截断**
- 总结:
- 4.2 Together API介绍
- Together API 的特点:
- Together API 与 openai的API区别
- Together API 的工作原理
- API 使用流程
- Together API 的代码示例
- API 参数说明
- 优势
- 总结
- 4.3 检索增强生成(Retrieval Augmented Generation, RAG)
- RAG 的主要步骤:
- RAG 的优势:
- 总结:
1 官方课程内容自述
https://www.udacity.com/course/generative-ai–nd608
深入探讨计算机如何理解和生成语言,并学习如何使用无监督机器学习、提示工程和检索增强生成技术构建自定义聊天机器人。我们将从大型语言模型的类型、它们之间的差异以及如何最好地利用其优势和规避其弱点进行概述。接下来,我们将深入研究内部细节,包括自然语言处理(NLP)技术,如分词、现代的Transformer架构和注意力机制。最后,我们将构建一个结合自定义数据集的大型语言模型实际应用。
Lesson 1: 大型语言模型(LLMs)简介
涵盖了大型语言模型的类型,帮助你直观理解它们的局限性和能力、推理和解码的超参数设置,以及如何进行有效的提示工程。
Lesson 2: 自然语言处理(NLP)基础
涵盖使用最新大型语言模型技术所需的基本自然语言处理知识。你将学习 NLP 的基础知识,然后深入学习文本编码和文本生成的技术。
Lesson 3: Transformer 和注意力机制
在这节课中,你将深入了解 Transformer 架构的核心机制,学习注意力机制及其他使这些强大模型得以实现的关键组件。
Lesson 4: 检索增强生成(RAG)
在这节课中,你将学习如何使用 OpenAI 构建一个自定义的问答机器人。与此同时,你还将学习 OpenAI 的工作原理以及如何利用其强大的语言处理能力。
Lesson 5: 为大型语言模型构建自定义数据集
在这节课中,将教你如何构建一个用于微调大型语言模型并进行检索增强生成的相关且高质量的数据集。
Lesson 6 - 项目:构建你自己的自定义聊天机器人
在本项目中,你将应用本课程中的所有知识,使用你选择的数据集创建一个自定义的聊天机器人。
2 练习
2.1 Introduction to LLMs
1. chatbot_memory_management.ipynb
- 背景提示:在调用 OpenAI 的 API 进行多轮对话时,每次请求都需要将对话历史一起发送给 API。API 不会自动维护对话的上下文,所以你需要在每次调用时,将之前的对话记录和新问题一起发送,确保上下文能够被模型理解。
- 目的:介绍如何调用 OpenAI 的 API(如 GPT-3.5-turbo 模型),并重点展示了如何通过对话历史截断来优化大模型的记忆管理,并测试了多轮对话的处理效果。【关于为什么要截断对话历史,见本文末尾附录】
- 学会后有什么用?:看了该文件后,你就知道如何帮自己或客户定制一个大模型聊天机器人程序,包括:连接openai的API,给大模型设定回答问题的风格,如何控制交互内容的显示细节。
- 详细概述:
- openai API 调用设置。
- 设置系统提示词:
- 这个系统提示词目的是指示模型的行为风格,也就是调用 API 时,这个提示词作为给模型的第一句话。本项目中设定 AI 为游戏专家,且所有回应以双感叹号结束。具体内容:SYSTEM_PROMPT = “”“You expert at games of chance. End every response with double exclamation points!!”“”
- 对话管理:
- 自定义一个
get_convo
函数来记录和生成对话历史,确保每轮用户输入和 AI 响应的正确生成。 - 编写
get_response
函数,负责调用API并生成模型响应,并根据对话历史的长度进行截断,避免超过模型的 token 限制。截断策略包括:- 简单截断:删除最早的一条对话记录。
- 复杂截断:删除最早的用户或 AI 交互,而保留系统提示。
- 定义问题:
- 文件中定义了4个问题,会依次传给API进行4轮对话交互,4个问题如下:
- “What cards game has the best odds of winning?”
- “What are the odds of winning it?”
- “What is the best hand to be dealt?”
- “What is the next most likely game to win?”
- 多轮对话测试:
- 文件中测试了4种调用API和显示结果的方式,包括:
- 测试1:禁用详细输出,采用简单截断,只打印最新的用户输入和 AI 响应。
- 测试2:启用详细输出,采用简单截断,打印完整的对话历史。(即每轮对话时,历史信息也回传给API,这个测试2就是打印这种真实的交互信息)
- 测试3:禁用详细输出,采用复杂截断。
- 测试4:启用详细输出,采用复杂截断。
- 这4个测试,模拟用户与 AI 之间的多轮对话,让你观察模型的响应效果及其对截断策略的处理。
2. demo_cot_and_triggers.ipynb
- 目的:演示如何使用 Together API 调用 Meta 的 Llama-2 模型,重点展示了链式推理(Chain of Thought, CoT)和触发条件的应用。目的是通过合理的提示设计和 API 调用,实现复杂问题的推理和解决。【关于Together API 见附录】
- 详细概述:
- API 调用设置:
- 文件使用了 Together API 来调用模型,并通过设置解码参数进行推理,包括
temperature
(随机性控制)、max_tokens
(最大 token 数设置为 512)和repetition_penalty
(控制重复的惩罚力度)。 - Together 平台上集成了多个模型,在这里使用了 Hugging Face 上的 Meta Llama-2 模型。
- 系统提示:
- 通过格式化的提示(
INST
和SYS
标签)来控制模型的行为。 - 提示设计重点在于触发链式推理(CoT),即模型通过推理多步来解决复杂问题。此机制通过在提示中嵌入问题的结构化信息来实现,能够引导模型给出更符合逻辑的答案。
- 解码参数调整:
- 通过
temperature
、max_tokens
和repetition_penalty
控制模型生成的多样性、长度和避免重复性。在测试过程中,这些参数用于探索不同的推理效果和生成质量。
- 测试内容:
- 该文件测试了如何根据不同的提示和触发条件生成对话和解决问题的推理。具体而言,测试了以下内容:
- 简单问题的生成:使用模型提供的推理能力处理简单问题。
- 复杂问题的链式推理(CoT):在一些复杂问题中,通过设置多步推理,观察模型如何逐步给出合乎逻辑的答案。
- 触发条件:通过不同类型的问题提示来测试触发模型的不同推理路径,探索模型如何处理不确定性和多步骤的任务。
- 重点功能测试:
- 该文件展示了如何使用 Together API 调用预训练模型,并通过链式推理引导模型执行更复杂的推理任务。
- 测试了链式推理的效果,以及不同解码参数(如
temperature
和max_tokens
)对模型推理的影响。
2.2 NLP Fundamentals
1 encoding.ipynb
-
目的:该文件的目的是演示如何从零开始编写一个基础分词器(Tokenizer),通过 Python 实现文本的归一化、预分词、分词、编码和解码的步骤。这一过程帮助理解分词和编码的基本原理,特别是在自然语言处理任务中的应用。
-
详细概述:
- 导入依赖库:
- 使用 Python 的标准库如
string
、re
和collections.defaultdict
来实现文本的处理和 token 到 ID 的映射。 defaultdict
被用来创建一个默认值为 0 的字典,用于处理未见过的 tokens。
- 定义样例文本:
- 文本样例是一段包含标点符号和数字的短文本,用于后续的归一化、分词和编码测试。
- 文本归一化:
- 通过自定义
normalize_text
函数将文本标准化,即保留字母、数字、标点符号和空白字符,并将所有字符转换为小写。该步骤确保输入的一致性,过滤掉非目标字符。
- 预分词:
pretokenize_text
函数使用简单的空格分割,将归一化后的文本分割成较小的单词和标点符号片段。
- 分词:
- 使用
tokenize_text
函数结合正则表达式匹配单词和标点符号,进一步将文本切分为 tokens。此过程通过re.findall
方法识别字母、数字和标点符号,并生成最终的 token 列表。
- 后处理步骤:
- 使用
postprocess_tokens
函数向 tokens 列表中添加序列的起始[BOS]
和结束[EOS]
标记,以便后续的编码和解码任务。
- 定义样例语料库:
- 定义一个简单的语料库,其中包含若干样本文本,用于后续的分词和编码测试。
- 生成 token 到 ID 的映射:
- 使用集合存储唯一的 tokens,并生成 token 到整数 ID 的映射
token2id
,以及 ID 到 token 的反向映射id2token
。其中,未知的 token 映射到 0,未知的 ID 映射到[UNK]
。
- 编码:
encode
函数将 token 列表转换为对应的 ID 列表,实现 token 到整数 ID 的映射。
- 解码:
decode
函数将整数 ID 列表转换回 token 字符串,完成 ID 到 token 的反向映射。通过此函数,可以将经过编码的文本恢复到其原始 token 形式。
-
文件展示了如何:
- 对文本进行分词、归一化以及预处理。
- 构建 token 到 ID 的映射表,完成编码和解码任务。
- 通过手动实现分词器,帮助用户理解 NLP 中 token 化与编码的基本原理。
2 hugging-face-tokenizer.ipynb
- 目的: 使用 Hugging Face 的
AutoTokenizer
加载预训练的分词器,探索 Hugging Face 提供的分词器功能。 - 概述:
- 加载库: 使用
transformers
库中的AutoTokenizer
类。 - 加载预训练分词器: 通过
AutoTokenizer.from_pretrained()
函数加载预训练的 BERT 分词器 (bert-base-cased
)。 - 分词器的用途: 展示如何利用 Hugging Face 预训练的模型进行文本的分词和编码,适用于文本处理和自然语言任务。
- 加载库: 使用
3 hugging-face-tokenizer-properties.ipynb
- 目的: 探索 Hugging Face 分词器的更多属性和功能,比较不同模型的分词器。
- 概述:
- 加载库: 使用
transformers
库中的AutoTokenizer
类。 - 加载不同模型的分词器: 选择并加载多个预训练的模型分词器,包括
bert-base-cased
,xlm-roberta-base
,google/pegasus-xsum
, 和allenai/longformer-base-4096
。 - 比较分词器的属性: 对比不同模型的分词器在处理文本时的特性,分析它们在不同任务中的表现。
- 加载库: 使用
4 text-generation.ipynb
- 目的:本文件的目的是展示如何结合 PyTorch 和 Hugging Face Transformers 库进行字符级文本生成任务,后者主要用它的分词器内置函数。
- 数据集:用的莎士比亚某作品txt文件,50000多个字符。
- 模型:很简单,就是nn.Embedding+nn.GRU+nn.Linear。
2.3 Transformers and Self Attention
exercise-1-implement-self-attention-solution.ipynb
用pytorch实现MultiHeadSelfAttention类,并检验类的各模块输入输出的正确性。
exercise-2-create-your-own-gpt-model-solution.ipynb
这文件是基于karpathy的miniGPT教程项目改造的,用transform模型实现一个3位数内的加法器(即输入两个数,让transform模型直接预测加法结果)
备注:文件不全,没有找到common文件夹。代码还是用10423或11785课程的transformer或GPT2代码比较好。
2.4 Retrieval Augmented Generation(RAG)
end-to-end-code-casestudy.ipynb
- 目的:该文件通过一个端到端的案例研究,展示如何构建一个定制的 OpenAI Chatbot,并使用 Prompt Engineering 来优化 Chatbot 的响应。
- 详细概述:
- API 设置:导入
openai
并设置 API Key。 - 初步结果测试:在没有任何定制化 Prompt 的情况下,向 OpenAI 模型提问并查看其响应。示例包括关于俄乌冲突和 Twitter 所有权的问题。
- 下一步:通过修改 Prompt 来优化响应质量。
- API 设置:导入
2.5 Build Custom Datasets(网页抓取、数据清理、数据集制作)
以下文件涵盖了网页抓取、数据清理、问答数据集构建以及语言模型数据集处理等不同主题,帮助用户在 NLP 和数据处理领域中应用这些技术。
1. Simple_Scraper_STARTER.ipynb
- 内容:这是一个简单网页抓取器的入门笔记本,展示如何从指定网页抓取数据,通常用于爬取书籍或产品信息。
- 重点:
- 使用
requests
库抓取网页数据,并验证页面的抓取结果。 - 简单的 HTML 解析示例,展示如何提取页面中的有用信息(如书名、价格等)。
- 这是一个入门级别的网页抓取示例,适合新手学习基础抓取技能。
- 使用
2. Basic Web Scraping.ipynb
- 内容:深入网页抓取技巧,展示如何使用 Python 库(如
requests
和BeautifulSoup
)来获取网页内容并解析 HTML 结构。 - 重点:
- 导入网页抓取所需的库,如
requests
和BeautifulSoup
。 - 编写函数来获取网页内容,并对 HTML 进行解析。
- 通过简单的抓取任务,如提取页面中的文本或特定元素,展示抓取和解析的基本工作流程。
- 导入网页抓取所需的库,如
3. Cleaning Data.ipynb(内容丰富)
- 内容:该文件侧重于数据清洗,展示了如何处理和清理原始数据,以便将其转换为更结构化、易于使用的格式。
- 重点:
- 数据清理的各种技术,包括去除无关字符、处理缺失值、标准化数据等。
- 通过 Python 代码展示如何逐步清理不同类型的数据。
- 强调清理后的数据如何为后续分析或建模做准备。
4. Building_QA_Datasets_SOLUTION.ipynb
- 内容:该文件展示如何构建问答数据集,包含了将原始文本数据转换为问答格式的详细步骤。
- 重点:
- 使用文本数据生成问题和答案对,适用于训练问答系统。
- 提供了解如何从文本中自动生成问题和答案的解决方案。
- 涉及对文本进行清洗和预处理的步骤,并展示如何将这些步骤自动化。
5. Causal LM Datasets.ipynb
- 内容:该笔记本涉及因果语言模型(Causal Language Model)的数据集构建。Causal LM 是一种单向生成模型,通常用于生成式任务。
- 重点:
- 介绍了如何准备和处理训练 Causal LM 的数据集。
- 展示了如何将大规模文本数据预处理为模型可用的格式,如将文本分割为 token。
- 涉及语言模型的上下文窗口、数据切片及数据格式化。
3 项目:构建一个自定义聊天机器人
Custom-Chatbot-Using-RAG.ipynb
3.1 该项目总结
在调用大模型的API回答用户的问题时,先在本地使用检索增强生成(RAG)技术,即把用户的问题与最近年限的数据集知识进行相似度检测,然后将相似度最高的那个知识作为用户问题的上下文信息,一起传给大模型API。因为大模型获得了最新的信息,所以回答的结果会更有时效性或针对性,从而提升聊天机器人的用户体验。
3.2 具体流程步骤
1. 最新数据的收集与准备
目标:获取相关领域的最新数据,填补模型在训练时可能没有的最新知识。
步骤:
- 选择一个与问题领域相关的最新数据集(例如时尚趋势数据:2023_fashion_trends.csv,里面有)。
- 数据集应包含文本数据,并且以 CSV 或其他结构化格式存储。
- 确保数据集中的文本行数足够多,以便生成丰富的上下文内容。
2. 数据预处理、嵌入向量生成、保存到本地
目标:将文本数据转换为机器学习模型理解的嵌入向量,方便后续检索(类似于人脸识别项目,把人脸数据以512维向量形式缓存,方便后续做相似度检测)。
步骤:
- 使用
pandas
读取 CSV 文件。 - 使用 OpenAI 提供的
Embedding.create()
API 将 CSV 中文本转成向量嵌入形式。 - 将嵌入向量保存在 pandas 数据格式中,并导出到本地为新的 CSV 文件,以便后续使用。
代码示例:
import openai
import pandas as pddf = pd.read_csv("data/2023_fashion_trends.csv")
df["text"] = df["Trends"]# 生成嵌入
embeddings = []
for text in df["text"]:response = openai.Embedding.create(input=text, engine="text-embedding-ada-002")embeddings.append(response["data"][0]["embedding"])df["embeddings"] = embeddings
df.to_csv("embeddings.csv")
3. 检索与问题相关信息
目标:根据用户提出的问题,从数据集中检索与之最相关的文本信息。
步骤:
- 将用户的问题通过
get_embedding()
转换为嵌入向量。 - 使用
distances_from_embeddings()
计算问题与每条文本嵌入之间的余弦距离。 - 按距离升序排列数据。(距离越低,相似度越高)
代码示例:
from openai.embeddings_utils import get_embedding, distances_from_embeddingsdef get_relevant_rows(question, df):question_embedding = get_embedding(question, engine="text-embedding-ada-002")df["distance"] = distances_from_embeddings(question_embedding, df["embeddings"].values, distance_metric="cosine")return df.sort_values(by="distance")
4. 制作提示词并调用大模型
目标:将之前计算得到的最相关的一些文本和用户的问题,组合成一个供 OpenAI 模型使用的提示,并调用模型,得到回答。
步骤:
- 编写一个
create_prompt()
函数,将用户问题和找到的最相关文本组合成一个完整的提示(也就是组合成一段话,等下输给大模型)。 - 调用
openai.Completion.create()
,调用大模型生成回答。 - 如果问题无法根据上下文回答,返回 “I don’t know” 或其他默认回答。
代码示例:
def create_prompt(question, df, max_tokens=1800):context = "\n\n###\n\n".join(df["text"].values[:5]) # 选择最相关的几行作为上下文prompt = f"Answer the question based on the context below:\n\nContext: {context}\n\nQuestion: {question}\nAnswer:"return promptdef answer_question(question, df, max_prompt_tokens=1800, max_answer_tokens=150):prompt = create_prompt(question, df, max_prompt_tokens)try:response = openai.Completion.create(model="gpt-3.5-turbo-instruct", prompt=prompt, max_tokens=max_answer_tokens)return response["choices"][0]["text"].strip()except Exception as e:print(f"Error: {e}")return "I don't know"
3.3 效果展示
测试1
【输给模型的问题】:Tell me some of the current fashion trends.(告诉我一些当前的时尚趋势。)
【大模型的回答】:
- 柔和色调和精致的花卉图案:这种风格在连衣裙、裙子、衬衫和配饰中广泛出现,给穿搭增添了女性化和浪漫的气息。
- 宽松和夸张的剪裁:与精致风格相反,宽松且夸张的轮廓也非常流行,体现在宽腿裤、超大西装外套和蓬松袖子等服装中。
- 可持续和道德时尚:随着环保意识的提升,越来越多的人倾向于选择那些倡导可持续性和道德生产的品牌。
- 90年代风格回归:90年代的时尚元素正大规模回潮,复古风的单品重新流行。
【输给模型的问题】:
“根据以下的上下文回答问题,如果上下文无法回答该问题,请说‘我不知道’。
上下文:
“每个季节都会有一些趋势唤醒我们内心的极繁主义者。虽然秋天给我们带来了明亮的霓虹色、机车靴和Y2K风格的奢华,但2023年春夏呈现出更为甜美的风格。如果你对一切‘可爱’的事物感到抗拒,那么这是你现在回避的提示,”Who What Wear UK 的购物编辑 Remy Farrell 说道。
###
“皮夹克正引领着新型的颓废风潮,Masha Popova、Knwls 和 Gucci 也带来了这一季强劲的更新版本,”Gramston 说到。看到没?很简单!
问题:告诉我一些当前的时尚趋势。
回答:”
【大模型的回答】:当前的时尚趋势包括极繁主义风格、受“颓废”风影响的时尚、剪裁精良的造型、日间亮片(将亮片用于日常穿搭)、网状衣物、钴蓝色、长款耳环、透视装以及绿色元素。
测试2
【输给模型的问题】:what are your views about oversized bags?(你对大号包包有什么看法?)
【大模型的回答】:作为人工智能,我对时尚物品如大号包没有个人观点或偏好。然而,一些人可能会认为大号包实用且时尚,而另一些人可能为了方便和风格更喜欢小包。最终,选择什么样的包取决于个人需求和喜好。
问题:你对大号包包有什么看法?
“根据以下的上下文回答问题,如果上下文无法回答该问题,请说‘我不知道’。
上下文:
“大号包包。虽然小包很可爱,但它们并不是最实用的配饰。不过我们有个好消息:今年春天,许多品牌推出了超大号的包包,展示了可以装下日常所需物品的设计——从杂货、笔记本电脑到精装书,几乎你所能想到的物品都能装下。如果你正在寻找一个新的工作包,这就是你的信号:现在大包才是主流。”
问题:你对大号包有什么看法?
回答:”
**【大模型的回答】:**看来发言者对大号包持积极态度,提到许多品牌已经“放大”了他们的包包设计,现在大包成了流行趋势。他还提到了“超大托特包”风靡时尚圈,并举了一些名人使用大包的例子。
4 附录
4.1 调用大模型对话时,为什么要截断对话历史?
在使用大型语言模型(LLMs)进行对话时,截断对话历史是为了管理模型的注意力窗口,并保持模型生成的响应在可控范围内。下面是截断对话历史的主要原因:
1. 模型的注意力窗口限制
- 大型语言模型在生成文本时,通常只能“看到”一定数量的上下文,也就是所谓的注意力窗口。例如,一个模型可能只能处理最多 4000 个 token 的上下文。如果对话的长度超过了这个限制,模型将无法正确理解最早的对话内容,这会导致生成不准确的或无关的响应。
- 因此,当对话历史逐渐变长时,截断较早的部分对话,只保留最新的内容,可以确保模型只处理其注意力窗口范围内的上下文,从而保持生成的准确性和相关性。
2. 提升效率和减少计算资源
- 处理更长的对话历史意味着模型需要处理更多的 token,计算成本也会随之增加。对于较长的对话,截断对话历史可以减少计算负担,提升推理效率,同时降低 API 的调用成本,尤其是在处理实时对话的场景中。
3. 保持对话的相关性
- 在许多应用场景下,较早的对话内容可能已经不再相关,特别是对于多轮对话中的连续问题和回答。截断这些不相关的历史可以让模型更专注于用户的最新输入,生成更符合当前上下文的回答。
- 通过保留最新的用户输入和模型响应,可以提升对话的连贯性,避免模型因为关注不相关的旧内容而产生偏差。
4. 避免超过 API 的限制
- 许多 LLM API 对单次请求的 token 数量有严格的限制,比如最多只能处理 4096 个 token。如果对话内容过长并超过这一限制,API 调用会失败或出错。
- 截断对话可以防止超出这些 API 限制,确保每次 API 调用能够成功进行。
5. 简单截断 vs 复杂截断
- 简单截断:通常是删除对话中最早的一条记录(例如用户输入或 AI 的回复),从而腾出空间给最新的输入和响应。
- 复杂截断:为了在截断时保留最重要的上下文(如系统提示词或特定关键对话),可以选择只删除用户或 AI 交互中的部分内容,而保留重要的提示和对话结构。
总结:
截断是为了确保模型在生成响应时能处理到最新和最相关的上下文,避免因注意力窗口过载导致生成质量下降,并且提升模型的计算效率和保证对话的连贯性。
4.2 Together API介绍
Together API 是 Together Computer 推出的一个用于访问和调用大型语言模型(LLMs)的平台。它提供了一种简单的方式,让开发者和研究人员能够轻松调用不同的开源模型,支持多种任务,如文本生成、翻译、总结等。Together API 旨在提供开源社区中的高性能模型,且强调开放性和可扩展性。
Together API 的特点:
- 多模型支持:
Together API 允许用户调用不同的语言模型,而不仅仅局限于一个模型。你可以访问像 GPT 系列的开源版本、BERT 变体以及其他开源的自然语言处理模型。
- 统一接口:
Together API 提供了统一的 API 接口,不论你使用的是哪个模型,都可以通过同样的 API 调用方式来与模型进行交互。这种方式极大地简化了开发者的工作,避免了不同模型间的接口差异。
- 开放和开源:
Together Computer 推广开源模型,并通过 Together API 提供访问。它支持使用开源的语言模型,并致力于推动社区协作,为模型开发和改进提供平台。
- 高性能和可扩展性:
Together API 设计为高效且可扩展的平台,支持并行调用和分布式计算。用户可以在API中使用大规模模型,进行快速的推理和推送任务。
- 多种任务支持:
Together API 允许用户使用模型进行多种 NLP 任务,如:
-
文本生成
-
文本总结
-
机器翻译
-
问答系统
-
文本分类
-
与开源模型集成:
Together API 强调与开源模型(如 BLOOM、OPT、GPT-J、GPT-NeoX)等的集成,用户可以方便地利用这些模型,而无需自己训练或托管。
Together API 与 openai的API区别
Together API 和 OpenAI API 在功能、使用方式以及应用场景上有一些相似之处,但它们之间也存在显著的区别。以下是对两者的详细对比:
特点 | OpenAI API | Together API |
---|---|---|
模型类型 | 专有模型(如 GPT-3、GPT-4) | 开源模型(如 GPT-J、GPT-NeoX、BLOOM) |
开源性 | 闭源,不提供模型权重 | 开源,支持模型下载与本地部署 |
使用场景 | 即插即用,适合商用应用 | 灵活定制,适合研究与开源项目 |
部署与定制 | 不支持本地部署 | 支持本地部署与自定义 |
价格 | 按请求收费,价格较高 | 使用开源模型,潜在成本较低 |
社区支持 | 商业公司主导 | 社区驱动,开源贡献 |
Together API 的工作原理
Together API 基本工作原理是通过 RESTful API 来访问服务器托管的模型。你发送输入(如一段文本或问题),API 会返回处理后的结果,比如生成的文本或回答。
API 使用流程
- 获取 API 密钥:
在使用 Together API 之前,需要先注册并获取 API 密钥。这是为了确保你有权限使用平台上的资源。
- 发送请求:
使用标准的 HTTP 请求方式向 Together API 发送数据,例如文本生成任务中的文本提示。Together API 会处理这些请求,并返回模型的输出结果。
- 处理返回结果:
API 返回的结果通常是模型生成的文本。你可以直接使用或进一步处理这些结果,以满足特定应用需求。
Together API 的代码示例
这里是一个使用 Together API 进行文本生成的 Python 示例:
import requests# Together API 的基础 URL
API_URL = "https://api.together.xyz/v1/completions"# 你的 API 密钥
API_KEY = "your-api-key"# 定义要发送的文本提示
data = {"model": "gpt-j-6B","prompt": "What is the importance of open-source software?","max_tokens": 100
}# 发送请求到 Together API
headers = {"Authorization": f"Bearer {API_KEY}","Content-Type": "application/json"
}response = requests.post(API_URL, headers=headers, json=data)# 打印返回的生成结果
if response.status_code == 200:result = response.json()print("Generated Text:", result['choices'][0]['text'])
else:print(f"Error: {response.status_code}, {response.text}")
API 参数说明
model
: 使用的模型名称,比如 “gpt-j-6B” 或 “gpt-neox-20B”。prompt
: 你希望模型生成的文本提示。max_tokens
: 最大生成的 token 数量,控制返回结果的长度。
优势
- 无需托管模型:Together API 让用户直接使用大规模语言模型,而不必自己部署和托管。这大大减少了使用大型模型所需的计算资源和时间。
- 适应性强:你可以根据不同任务选择不同模型,适应各种场景,特别是 NLP 领域中的多任务应用。
- 开源社区支持:Together API 的开放性鼓励了开源社区对模型的贡献和使用,推动了语言模型的开源发展。
总结
Together API 是一个集成了多种开源大语言模型的统一接口平台,旨在让用户能够轻松访问这些高性能模型。通过它,开发者和研究人员可以进行诸如文本生成、机器翻译、问答等多种任务,而无需自行托管模型。平台强调开放性和性能,并为使用开源模型提供了一个高效的解决方案。
4.3 检索增强生成(Retrieval Augmented Generation, RAG)
检索增强生成(RAG) 是一种结合了信息检索和文本生成的混合方法。在传统的生成式模型中,模型主要依靠自身的参数和训练时积累的知识来生成输出文本。而 RAG 通过在生成之前,首先从外部知识库或文档库中检索相关信息,帮助模型获得更多最新的或特定领域的信息,从而生成更加准确、相关的回答。这种方法尤其适用于需要大量外部知识的任务,如问答系统、对话系统、技术文档生成等。
RAG 的主要步骤:
- 输入问题或查询:用户向系统提出问题或输入查询。
- 信息检索:系统首先会根据问题,从预定义的文档库(例如书籍、网页、数据库)中检索出与该问题相关的文档片段或上下文信息。
- 生成增强:在获得了与查询相关的外部信息后,生成模型使用这些检索到的文档信息作为上下文,结合模型自身的知识生成答案。这样生成的文本既包含了外部检索到的最新信息,也利用了生成模型自身的自然语言生成能力。
RAG 的优势:
- 扩展知识范围:生成式模型(如 GPT)虽然强大,但其内部知识受限于训练数据的时效性和规模。通过引入检索机制,RAG 可以从外部知识库中获得更丰富、更新的内容。
- 应对实时性问题:生成式模型往往不能处理实时更新的知识,例如新闻事件、技术更新等。RAG 可以动态检索最新信息,并生成回答。
- 提高准确性:在一些需要特定领域知识的任务中,生成模型可能未必掌握足够的知识,而 RAG 能够通过检索获取到特定领域的详细信息,生成更准确的回答。
- 减少幻觉问题:生成式模型有时会产生“幻觉”(hallucination),即生成看似合理但实际错误的信息。通过结合检索,RAG 可以降低幻觉问题的发生,提升回答的可信度。
总结:
- RAG 通过结合检索和生成,增强了生成式模型的能力,特别适用于那些需要依赖大量外部知识的任务。
- 它在智能问答、内容生成等 AIGC 应用中扮演了关键角色,帮助生成更相关、准确且基于最新信息的内容。
RAG 的独特之处在于,它可以突破传统生成模型的局限性,使生成结果更加智能化和精准化。