🤖 Gato GraphQL 与 ChatGPT 的集成变得更加强大
Gato GraphQL 的 Power Extensions 捆绑包最新版本包含以下新的 Root 字段:
_arrayEncodeAsJSONString_objectEncodeAsJSONString
这些字段对不同的结构进行 JSON 编码(_arrayEncodeAsJSONString 用于项目数组,_objectEncodeAsJSONString 用于 JSON 对象),生成其字符串表示形式。
这使我们能够在发送给 ChatGPT 的提示中包含结构化数据。
这在通过 ChatGPT 翻译内容时非常有用(以及其他使用场景):通过将多个字符串归入数组或对象,可以在单个请求中翻译多个字符串,翻译质量优于发送多个独立请求。
让我们来看几个例子。
发送数组以通过 ChatGPT 翻译多个字符串
Query Translate multiple sentences using ChatGPT 从多篇文章中获取内容,并使用 ChatGPT 将这些字符串翻译成任意语言。
此视频演示了该 Query 的执行过程:
它首先检索文章内容项并将其导出为数组。然后,使用新的 _arrayEncodeAsJSONString 字段将数组编码为字符串,并将其包含在 ChatGPT 提示中。最后对 ChatGPT API 执行 HTTP 请求,获取翻译结果。
运行 Query 后,从 translatedContent 条目下检索翻译结果。
query GetPostContent($limit: Int! = 5) {
posts(pagination: {limit: $limit}, sort: {by: ID, order: ASC}) {
content
@export(
as: "contentItems",
type: LIST
)
}
}
query TranslateContentWithChatGPT(
$fromLang: String!
$toLang: String!
$openAIAPIKey: String!
$systemMessage: String! = "You are a language translator"
$promptTemplate: String! = """
I'm working on internationalizing my application.
I've created a JSON with sentences in {$fromLang}. Please translate the sentences to {$toLang}.
If a sentence contains HTML, do not translate inside the HTML tags.
This is the JSON:
{$encodedContentItems}
"""
$model: String! = "gpt-4o-mini"
)
@depends(on: "GetPostContent")
{
contentItems: _echo(value: $contentItems)
encodedContentItems: _arrayEncodeAsJSONString(array: $contentItems)
prompt: _strReplaceMultiple(
search: ["{$fromLang}", "{$toLang}", "{$encodedContentItems}"],
replaceWith: [$fromLang, $toLang, $__encodedContentItems],
in: $promptTemplate
)
openAIResponse: _sendJSONObjectItemHTTPRequest(input: {
url: "https://api.openai.com/v1/chat/completions",
method: POST,
options: {
auth: {
password: $openAIAPIKey
},
json: {
model: $model,
messages: [
{
role: "system",
content: $systemMessage
},
{
role: "user",
content: $__prompt
},
],
response_format: {
type: "json_schema",
json_schema: {
name: "translation_response",
strict: true,
schema: {
type: "object",
properties: {
translations: {
type: "array",
items: {
type: "string"
}
}
},
required: ["translations"],
additionalProperties: false
}
}
}
}
}
})
@underJSONObjectProperty(by: { key: "choices" })
@underArrayItem(index: 0)
@underJSONObjectProperty(by: { path: "message.content" })
@export(as: "jsonEncodedTranslatedContent")
}
query ExtractTranslatedContent
@depends(on: "TranslateContentWithChatGPT")
{
jsonEncodedTranslatedContent: _echo(value: $jsonEncodedTranslatedContent)
@remove
decodedTranslatedContent: _strDecodeJSONObject(string: $jsonEncodedTranslatedContent)
@remove
translatedContent: _objectProperty(
object: $__decodedTranslatedContent,
by: { key: "translations" }
)
}以下是执行翻译为西班牙语的 Query 时的响应:
{
"data": {
"posts": [
{
"content": "\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>\n"
},
{
"content": "\n<p>This is a paragraph block. Professionally productize highly efficient results with world-class core competencies. Objectively matrix leveraged architectures vis-a-vis error-free applications. Completely maximize customized portals via fully researched metrics. Enthusiastically generate premier action items through web-enabled e-markets. Efficiently parallel task holistic intellectual capital and client-centric markets.<br><br></p>\n\n\n\n<h2 class=\"wp-block-heading\">Image Block (Standard)</h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https://d.pr/i/8pTmgY+\" alt=\"\" class=\"wp-image-1755\"/></figure>\n"
}
],
"contentItems": [
"\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>\n",
"\n<p>This is a paragraph block. Professionally productize highly efficient results with world-class core competencies. Objectively matrix leveraged architectures vis-a-vis error-free applications. Completely maximize customized portals via fully researched metrics. Enthusiastically generate premier action items through web-enabled e-markets. Efficiently parallel task holistic intellectual capital and client-centric markets.<br><br></p>\n\n\n\n<h2 class=\"wp-block-heading\">Image Block (Standard)</h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https://d.pr/i/8pTmgY+\" alt=\"\" class=\"wp-image-1755\"/></figure>\n"
],
"encodedContentItems": "[\"\\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!<\\/p>\\n\",\"\\n<p>This is a paragraph block. Professionally productize highly efficient results with world-class core competencies. Objectively matrix leveraged architectures vis-a-vis error-free applications. Completely maximize customized portals via fully researched metrics. Enthusiastically generate premier action items through web-enabled e-markets. Efficiently parallel task holistic intellectual capital and client-centric markets.<br><br><\\/p>\\n\\n\\n\\n<h2 class=\\\"wp-block-heading\\\">Image Block (Standard)<\\/h2>\\n\\n\\n\\n<figure class=\\\"wp-block-image\\\"><img decoding=\\\"async\\\" src=\\\"https:\\/\\/d.pr\\/i\\/8pTmgY+\\\" alt=\\\"\\\" class=\\\"wp-image-1755\\\"\\/><\\/figure>\\n\"]",
"prompt": "\nI'm working on internationalizing my application.\n\nI've created a JSON with sentences in English. Please translate the sentences to Spanish.\n\nThis is the JSON:\n\n[\"\\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!<\\/p>\\n\",\"\\n<p>This is a paragraph block. Professionally productize highly efficient results with world-class core competencies. Objectively matrix leveraged architectures vis-a-vis error-free applications. Completely maximize customized portals via fully researched metrics. Enthusiastically generate premier action items through web-enabled e-markets. Efficiently parallel task holistic intellectual capital and client-centric markets.<br><br><\\/p>\\n\\n\\n\\n<h2 class=\\\"wp-block-heading\\\">Image Block (Standard)<\\/h2>\\n\\n\\n\\n<figure class=\\\"wp-block-image\\\"><img decoding=\\\"async\\\" src=\\\"https:\\/\\/d.pr\\/i\\/8pTmgY+\\\" alt=\\\"\\\" class=\\\"wp-image-1755\\\"\\/><\\/figure>\\n\"]\n",
"openAIResponse": {
"id": "chatcmpl-AlcAdtuZ40iauuSVvr1uEdrbYefMa",
"object": "chat.completion",
"created": 1735911507,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\"translations\":[\"\\n<p>Bienvenido a WordPress. Esta es tu primera publicación. Edítala o elimínala, ¡y luego empieza a escribir!<\\\\/p>\\n\",\"\\n<p>Este es un bloque de párrafo. Profesionalmente productiza resultados altamente eficientes con competencias esenciales de clase mundial. Objetivamente aprovecha arquitecturas aprovechadas en relación con aplicaciones sin errores. Maximiza completamente portales personalizados a través de métricas totalmente investigadas. Genera entusiastamente elementos de acción de primer nivel a través de mercados electrónicos habilitados por la web. Eficazmente paralelamente gestiona el capital intelectual holístico y los mercados centrados en el cliente.<br><br><\\\\/p>\\n\\n\\n\\n<h2 class=\\\"wp-block-heading\\\">Bloque de Imagen (Estándar)<\\\\/h2>\\n\\n\\n\\n<figure class=\\\"wp-block-image\\\"><img decoding=\\\"async\\\" src=\\\"https://d.pr/i/8pTmgY+\\\" alt=\\\"\\\" class=\\\"wp-image-1755\\\"/><\\\\/figure>\\n\"]}",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 257,
"completion_tokens": 224,
"total_tokens": 481,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"system_fingerprint": "fp_0aa8d3e20b"
},
"translatedContent": [
"\n<p>Bienvenido a WordPress. Esta es tu primera publicación. Edítala o elimínala, ¡y luego empieza a escribir!<\\/p>\n",
"\n<p>Este es un bloque de párrafo. Profesionalmente productiza resultados altamente eficientes con competencias esenciales de clase mundial. Objetivamente aprovecha arquitecturas aprovechadas en relación con aplicaciones sin errores. Maximiza completamente portales personalizados a través de métricas totalmente investigadas. Genera entusiastamente elementos de acción de primer nivel a través de mercados electrónicos habilitados por la web. Eficazmente paralelamente gestiona el capital intelectual holístico y los mercados centrados en el cliente.<br><br><\\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bloque de Imagen (Estándar)<\\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https://d.pr/i/8pTmgY+\" alt=\"\" class=\"wp-image-1755\"/><\\/figure>\n"
]
}
}发送对象以通过 ChatGPT 翻译多个字符串
Query Translate all properties of a post using ChatGPT 从单篇文章中获取所有属性,并使用 ChatGPT 将这些字符串翻译成任意语言。
观看此视频以了解该 Query 的执行过程:
此 Query 与前一个类似,但它从单篇文章中检索(并翻译)所有属性,并将其导出为 JSON 对象。
运行 Query 后,从 translatedPostPropertiesAsJSON 条目下检索翻译结果。
query GetPostProperties($postId: ID!) {
post(by: { id: $postId }) {
title
content
excerpt
@export(
as: "postProperties",
affectAdditionalFieldsUnderPos: [1, 2]
)
}
}
query TranslatePostPropertiesWithChatGPT(
$fromLang: String!
$toLang: String!
$openAIAPIKey: String!
$systemMessage: String! = "You are a language translator"
$promptTemplate: String! = """
I'm working on internationalizing my application.
I've created a JSON with sentences in {$fromLang}. Please translate the sentences to {$toLang}.
Keep the object properties identical, translate the values only.
If a sentence contains HTML, do not translate inside the HTML tags.
This is the JSON:
{$encodedPostProperties}
"""
$model: String! = "gpt-4o-mini"
)
@depends(on: "GetPostProperties")
{
postProperties: _echo(value: $postProperties)
encodedPostProperties: _objectEncodeAsJSONString(object: $postProperties)
prompt: _strReplaceMultiple(
search: ["{$fromLang}", "{$toLang}", "{$encodedPostProperties}"],
replaceWith: [$fromLang, $toLang, $__encodedPostProperties],
in: $promptTemplate
)
openAIResponse: _sendJSONObjectItemHTTPRequest(input: {
url: "https://api.openai.com/v1/chat/completions",
method: POST,
options: {
auth: {
password: $openAIAPIKey
},
json: {
model: $model,
messages: [
{
role: "system",
content: $systemMessage
},
{
role: "user",
content: $__prompt
},
],
response_format: {
type: "json_schema",
json_schema: {
name: "translation_response",
strict: true,
schema: {
type: "object",
properties: {
translations: {
type: "array",
items: {
type: "object",
properties: {
property: {
type: "string"
},
translation: {
type: "string"
}
},
required: ["property", "translation"],
additionalProperties: false
}
}
},
required: ["translations"],
additionalProperties: false
}
}
}
}
}
})
@underJSONObjectProperty(by: { key: "choices" })
@underArrayItem(index: 0)
@underJSONObjectProperty(by: { path: "message.content" })
@export(as: "jsonEncodedTranslatedPostProperties")
}
query ExtractTranslatedPostProperties
@depends(on: "TranslatePostPropertiesWithChatGPT")
{
jsonEncodedTranslatedPostProperties: _echo(value: $jsonEncodedTranslatedPostProperties)
@remove
decodedTranslatedPostProperties: _strDecodeJSONObject(string: $jsonEncodedTranslatedPostProperties)
@remove
translatedPostProperties: _objectProperty(
object: $__decodedTranslatedPostProperties,
by: { key: "translations" }
)
translatedPostPropertiesAsJSON: _arrayOfJSONObjectsExtractPropertiesAndConvertToObject(
array: $__translatedPostProperties,
key: "property",
value: "translation"
)
}以下是执行翻译为西班牙语的 Query 时的响应:
{
"data": {
"post": {
"title": "Hello world!",
"content": "\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>\n",
"excerpt": "Welcome to WordPress. This is your first post. Edit or delete it, then start writing!"
},
"postProperties": {
"title": "Hello world!",
"content": "\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>\n",
"excerpt": "Welcome to WordPress. This is your first post. Edit or delete it, then start writing!"
},
"encodedPostProperties": "{\"title\":\"Hello world!\",\"content\":\"\\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!<\\/p>\\n\",\"excerpt\":\"Welcome to WordPress. This is your first post. Edit or delete it, then start writing!\"}",
"prompt": "\nI'm working on internationalizing my application.\n\nI've created a JSON with sentences in English. Please translate the sentences to Spanish.\n\nKeep the object properties identical, translate the values only.\n\nThis is the JSON:\n\n{\"title\":\"Hello world!\",\"content\":\"\\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!<\\/p>\\n\",\"excerpt\":\"Welcome to WordPress. This is your first post. Edit or delete it, then start writing!\"}\n",
"openAIResponse": {
"id": "chatcmpl-AlrJK6lIJK7YmtITveYeUrCJbP0JO",
"object": "chat.completion",
"created": 1735969706,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\"translations\":[{\"property\":\"title\",\"translation\":\"¡Hola mundo!\"},{\"property\":\"content\",\"translation\":\"\\n<p>Bienvenido a WordPress. Este es tu primer artículo. ¡Edítalo o elimínalo, luego comienza a escribir!<\\\\/p>\\n\"},{\"property\":\"excerpt\",\"translation\":\"Bienvenido a WordPress. Este es tu primer artículo. ¡Edítalo o elimínalo, luego comienza a escribir!\"}]}",
"refusal": null
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 167,
"completion_tokens": 92,
"total_tokens": 259,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"system_fingerprint": "fp_0aa8d3e20b"
},
"translatedPostProperties": [
{
"property": "title",
"translation": "¡Hola mundo!"
},
{
"property": "content",
"translation": "\n<p>Bienvenido a WordPress. Este es tu primer artículo. ¡Edítalo o elimínalo, luego comienza a escribir!<\\/p>\n"
},
{
"property": "excerpt",
"translation": "Bienvenido a WordPress. Este es tu primer artículo. ¡Edítalo o elimínalo, luego comienza a escribir!"
}
],
"translatedPostPropertiesAsJSON": {
"title": "¡Hola mundo!",
"content": "\n<p>Bienvenido a WordPress. Este es tu primer artículo. ¡Edítalo o elimínalo, luego comienza a escribir!<\\/p>\n",
"excerpt": "Bienvenido a WordPress. Este es tu primer artículo. ¡Edítalo o elimínalo, luego comienza a escribir!"
}
}
}