下面就是介绍部分:
介绍大型语言模型(LLMs)在生成内容方面表现很好,但有时你得到的输出格式可能参差不齐,难以预测。
例如,你要求某种格式的 JSON 输出,却可能收到未格式化的文本,或者被 Markdown 字符串包裹的 JSON,或者是一个缺少必需字段的正确 JSON。如果你的应用需要严格的格式,这可能真正成为一个问题,因此。
可能通过改进提示,或者更优秀的输出解析器来检测并修复格式问题,或者两者兼有以修复输出格式,但这会增加不必要的额外工作。
Vertex AI 现在新增了两个功能,response_mime_type
和 response_schema
,这些功能有助于将 LLM 的输出限制在特定格式内。
我们来看一下一个例子 main.py。
没有受控生成
首先,让我们向不具有受控生成功能的LLM提一个问题。
model = GenerativeModel('gemini-1.5-flash-001')
prompt = "分享几个流行的饼干食谱"
response = model.generate_content(prompt)
跑一下。
python main.py --project_id 你的项目ID # 无受控生成模式
你会得到一段自由文本的回答
提示:列出几种流行的曲奇食谱
回复:## 流行的曲奇食谱:**经典且简单:**
* **巧克力碎片曲奇:** 这个永恒的经典之所以受欢迎,确实有其原因!绝对让你爱不释手,甜中带嚼劲。
* **酥皮糖饼干:...
你可以通过在请求中加入更多细节来使回复的格式更加详细。
model = GenerativeModel('gemini-1.5-flash-001')
prompt = """
列出几个常见的流行的饼干食谱,使用以下的 JSON 模式来:
Recipe = {"recipe_name": str}
返回一个包含食谱的列表: list[Recipe]
"""
response = model.generate_content(prompt)
你得到了如下回复:
请列出一些流行饼干的食谱,使用以下JSON模板:
食谱 = {"recipe_name": str}
返回:食谱列表
响应:```json
[
{"recipe_name": "Chocolate Chip Cookies"},
{"recipe_name": "Oatmeal Raisin Cookies"},
{"recipe_name": "Snickerdoodles"},
{"recipe_name": "Sugar Cookies"},
{"recipe_name": "Peanut Butter Cookies"},
{"recipe_name": "Gingerbread Cookies"},
{"recipe_name": "Shortbread Cookies"}
]
回复更好了,但它是 JSON 代码格式,而不是有效的 JSON。
生成响应的, MIME 类型一种让响应返回 JSON 的简单方法是在模型中采用 response_mime_type
类型。
model = GenerativeModel('gemini-1.5-flash-001',
generation_config=GenerationConfig(
response_mime_type="application/json"
))
prompt = """
分享几个遵循这个 JSON 模式的流行饼干食谱:
Recipe = {"recipe_name": str}
返回:食谱列表
"""
response = model.generate_content(prompt)
试试这个:
python main.py --project_id 你的项目ID号
现在你应该得到正确的JSON返回了
提示:
列出几个使用以下 JSON 架构的流行饼干食谱:
食谱 = {"recipe_name": str}
响应:list[Recipe]
响应:[
{"recipe_name": "巧克力芯片饼干"},
{"recipe_name": "燕麦葡萄干饼干"},
{"recipe_name": "红糖饼干"},
{"recipe_name": "糖饼干"},
{"recipe_name": "花生酱饼干"}
]
根据响应方案生成
您可以使用 response_schema
进一步约束响应模式。
response_schema = {
"type": "array",
"items": {
"type": "object",
"properties": {
"recipe_name": {"type": "string"},
"calories": {"type": "integer"}
},
"required": ["recipe_name"]
},
}
model = GenerativeModel('gemini-1.5-pro-001',
generation_config=GenerationConfig(
response_mime_type="application/json",
response_schema=response_schema))
prompt = "列几款流行的曲奇食谱"
response = model.generate_content(prompt)
需要注意的是,提示中完全没有提到格式,但模型知道如何整理输出罢了。
运行一下:
python main.py --project_id 项目ID # 该命令用于运行主脚本并指定特定的项目ID和模式
这里没有任何内容需要翻译。
提示:列出几个流行的饼干食谱
响应:[
{
"recipe_name": "巧克力豆曲奇",
"calories": 150
},
{
"recipe_name": "花生酱曲奇",
"calories": 160
},
{
"recipe_name": "燕麦葡萄干曲奇",
"calories": 140
},
{
"recipe_name": "糖饼干",
"calories": 130
}
]
提取响应模式的内容
你也可以用更结构化的方式来提取信息,通过使用响应模式。
例如,你可以将非结构化的文本中的社交平台上的评论提取出来为如下结构化的 JSON 格式等等。
response_schema = {
"type": "array",
"items": {
"type": "object",
"properties": {
"dessert_name": { "type": "string"},
"rating" : { "type": "integer"},
"message": { "type": "string"}
},
"required": ["dessert_name", "rating", "message"]
},
}
model = GenerativeModel('gemini-1.5-pro-001',
generation_config=GenerationConfig(
response_mime_type="application/json",
response_schema=response_schema))
prompt = """
提取一下我们社交媒体上的评论:
- "非常喜欢!这是我吃过的最好的冰淇淋了。" 评分:4分
- "不错的奶酪蛋糕,但对我来说稍微有点甜了。" 评分:2分
- "不太喜欢提拉米苏。" 评分:0分
"""
response = model.generate_content(prompt)
试试看。
运行以下命令:
python main.py --project_id your-project-id with_response_schema2
其中 with_response_schema2
表示...
您将收到以 JSON 格式返回的提取信息,具体如下:
提取社交媒体评论:
- "绝对喜欢!这是我吃过的最好的冰激凌。" 评分:4
- "不错的芝士蛋糕,但稍微有点甜。" 评分:2
- "不怎么喜欢提拉米苏。" 评分:0
响应:[
{
"甜品名称": "冰激凌",
"评价": "绝对喜欢!这是我吃过的最好的冰激凌",
"评分": 4
},
{
"甜品名称": "芝士蛋糕",
"评价": "不错的芝士蛋糕,但稍微有点甜",
"评分": 2
},
{
"甜品名称": "提拉米苏",
"评价": "不怎么喜欢提拉米苏",
"评分": 0
}
]
结论
在这篇博客文章中,我分享了如何在Vertex AI中控制LLM输出格式的方式。目前仅支持JSON格式,但它提供了一种确保特定JSON模式的简单方法。如果你想了解更多,以下是一些相关资源: