大语言模型的文本生成高级技术
立即解锁
发布时间: 2025-09-01 00:59:12 阅读量: 23 订阅数: 12 AIGC 

# 大语言模型的文本生成高级技术
## 1. 基于格式化提示生成故事
在格式化提示后,可以使用 `ChatOpenAI()` 创建一个聊天模型,并将格式化后的提示加载到 `SystemMessage` 中,从而创建一个关于《指环王》中佛罗多的小故事。示例代码如下:
```python
result = model.invoke([SystemMessage(content=formatted_prompt)])
```
## 2. 少样本学习的局限性及解决方法
### 2.1 少样本学习的局限性
少样本学习存在一定的局限性,主要有以下两个原因:
- **过拟合问题**:像 GPT - 4 这样的预训练模型有时会对少样本示例过拟合,导致它们更优先考虑示例而不是实际的提示。
- **令牌限制**:大语言模型有令牌限制,因此示例数量和响应长度之间总是存在权衡。提供更多的示例可能会限制响应长度,反之亦然。
### 2.2 解决方法
- **调整提示表述**:如果少样本提示没有产生预期的结果,可以考虑使用不同的表述方式或尝试改变提示的语言。提示表述的变化可能会导致不同的响应,这体现了提示工程的试错性质。
- **明确指令**:可以向模型添加明确的指令,让其在理解任务后忽略示例,或者仅将示例用于格式指导,以避免模型对示例过拟合。
- **模型微调**:如果任务复杂且少样本学习的模型性能不理想,可能需要考虑对模型进行微调。微调可以让模型更细致地理解特定任务,从而显著提高性能。
## 3. 保存和加载大语言模型提示
为了有效地利用 GPT - 4 等生成式 AI 模型,将提示存储为文件而不是 Python 代码是有益的,这样可以提高提示的可共享性、存储和版本管理能力。
### 3.1 LangChain 的支持
LangChain 支持从 JSON 和 YAML 文件中保存和加载提示,并且可以在一个文件中详细指定或分布在多个文件中。这意味着可以将模板、示例等不同组件存储在不同的文件中,并根据需要引用它们。
### 3.2 保存和加载提示的示例代码
```python
from langchain_core.prompts import PromptTemplate, load_prompt
prompt = PromptTemplate(
template='''Translate this sentence from English to Spanish.
\nSentence: {sentence}\nTranslation:''',
input_variables=["sentence"],
)
prompt.save("translation_prompt.json")
# Loading the prompt template:
load_prompt("translation_prompt.json")
# Returns PromptTemplate()
```
需要注意的是,LangChain 的提示保存可能并非适用于所有类型的提示模板。对于不支持的提示,可以使用 `pickle` 库或 `.txt` 文件进行读写。
### 3.3 创建少样本提示模板的技术
可以使用两种技术使用 LangChain 创建少样本提示模板:
- **固定数量的示例**:创建一组少样本示例,并使用 `ChatPromptTemplate` 对象将其格式化为聊天消息,以此为基础创建 `FewShotChatMessagePromptTemplate` 对象。
- **示例选择器**:当用户输入的长度差异很大时,使用示例选择器很方便。可以使用 `LengthBasedExampleSelector` 根据用户输入的长度调整示例数量,以确保大语言模型不超过其上下文窗口限制。
## 4. 数据连接
将大语言模型应用与数据相结合,可以挖掘大量机会来提高效率并优化决策过程。组织的数据可能有以下两种形式:
### 4.1 数据类型
| 数据类型 | 示例 |
| ---- | ---- |
| 非结构化数据 | Google Docs、Slack 或 Microsoft Teams 等通信平台的线程、网页、内部文档、GitHub 上的代码仓库 |
| 结构化数据 | 存储在 SQL、NoSQL 或图数据库中的数据 |
### 4.2 数据查询方法
- **非结构化数据**:需要进行加载、转换、嵌入并存储到向量数据库中。向量数据库是一种专门用于高效存储和查询向量形式数据的数据库,向量可以将文本或图像等复杂数据表示为适合机器学习和相似度搜索的格式。
- **结构化数据**:由于其已经过索引和存储,可以使用 LangChain 代理对数据库进行中间查询,提取特定特征,然后在大语言模型提示中使用这些特征。
### 4.3 数据处理组件
LangChain 提供了以下关键组件来加载、修改、存储和检索数据:
- **文档加载器**:用于从各种来源(如 Word 文档、PDF 文件、文本文件或网页)上传信息资源或文档。
- **文档转换器**:可以对文档进行分段、转换为问答布局、消除多余文档等操作。
- **文本嵌入模型**:可以将非结构化文本转换为一系列浮点数,供向量存储进行相似度搜索。
- **向量数据库(向量存储)**:可以保存和执行对嵌入数据的搜索。
- **检索器**:提供查询和检索数据的能力。
此外,其他大语言模型框架(如 LlamaIndex)可以与 LangChain 无缝协作,LlamaHub 是另一个专门用于文档加载器的开源库,可以创建特定于 LangChain 的文档对象。
### 4.4 文档加载示例
以 NutriFusion Foods 的大语言模型数据收集管道为例,需要收集的数据包括一本名为《营销原理》的 PDF 书籍、两个公共 Google Cloud Storage 存储桶中的 `.docx` 营销报告以及三个展示 2021、2022 和 2023 年营销绩效数据的 `.csv` 文件。具体操作步骤如下:
1. 创建一个新的 Jupyter Notebook 或 Python 文件,并运行 `pip install pdf2image docx2txt pypdf` 安装所需的三个包。
2. 导入各种数据加载器并创建一个空的 `all_documents` 列表来存储所有数据源的文档对象。
```python
from langchain_community.document_loaders import Docx2txtLoader
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders.csv_loader import CSVLoader
import glob
from langchain.text_splitter import CharacterTextSplitter
# To store the documents across all data sources:
all_documents = []
# Load the PDF:
loader = PyPDFLoader("data/principles_of_marketing_book.pdf")
pages = loader.load_and_split()
print(pages[0])
# Add extra metadata to each page:
for page in pages:
page.metadata["description"] = "Principles of Marketing Book"
# Checking that the metadata has been added:
for page in pages[0:2]:
print(page.metadata)
# Saving the marketing book pages:
all_documents.extend(pages)
csv_files = glob.glob("data/*.csv")
# Filter to only include the word Marketing in the file name:
csv_files = [f for f in csv_files if "Marketing" in f]
# For each .csv file:
for csv_file in csv_files:
loader = CSVLoader(file_path=csv_file)
data = loader.load()
# Saving the data to the all_documents list:
all_documents.extend(data)
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
chunk_size=200, chunk_overlap=0
)
urls = [
'''https://storage.googleapis.com/oreilly-content/NutriFusion%20Foods%2
0Marketing%20Plan%202022.docx''',
'''https://storage.googleapis.com/oreilly-content/NutriFusion%20Foods%2
0Marketing%20Plan%202023.docx''',
]
docs = []
for url in urls:
loader = Docx2txtLoader(url.replace('\n', ''))
pages = loader.load()
chunks = text_splitter.split_documents(pages)
# Adding the metadata to each chunk:
for chunk in chunks:
chunk.metadata["source"] = "NutriFusion Foods Marketing Plan - 2022/2023"
docs.extend(chunks)
# Saving the marketing book pages:
all_documents.extend(docs)
```
### 4.5 数据处理流程
```mermaid
graph LR
A[数据来源] --> B[加载到文档]
B --> C[文档分块]
C --> D[存储到向量数据库]
D --> E[后续检索]
```
## 5. 文本分割
### 5.1 文本分割的重要性
平衡每个文档的长度是一个关键因素。如果文档太长,可能会超过大语言模型的上下文长度(即大语言模型在单个请求中可以处理的最大令牌数);但如果文档被过度分割成小块,可能会丢失重要的上下文信息。
###
0
0
复制全文
相关推荐










