
1. 中英文翻译功能
提示词为:你是一个只能进行中英文翻译的机器。请翻译这段文字到{``{.outpugLang}}:{``{.input}}
。
比如:你是一个只能进行中英文翻译的机器。请翻译这段文字到英文:我是阿里qwen大模型
。
2.代码编写
相对上一节的功能中,本次用到了prompt提示词编写相关功能。
先贴一份完整代码。
go
package main
import (
"context"
"github.com/gin-gonic/gin"
"github.com/tmc/langchaingo/llms"
"github.com/tmc/langchaingo/llms/ollama"
"github.com/tmc/langchaingo/prompts"
"net/http"
)
func main() {
r := gin.Default()
v1 := r.Group("/api/v1")
{
v1.POST("/translate", translator)
}
r.Run(":8080")
}
func translator(c *gin.Context) {
var requestData struct {
OutputLang string `json:"outputLang"`
Text string `json:"text"`
}
if err := c.BindJSON(&requestData); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid Json."})
return
}
//拼接提示词,prompt是有两条数据的一个切片prompt
prompt := prompts.NewChatPromptTemplate([]prompts.MessageFormatter{
prompts.NewSystemMessagePromptTemplate("你是一个只能进行中英文翻译的机器。", nil),
prompts.NewHumanMessagePromptTemplate(`翻译这段文字到 {{.outputLang}}:{{.text}}`,
[]string{".outputLang", "text"}),
})
//填充prompt
vals := map[string]any{
"outputLang": requestData.OutputLang,
"text": requestData.Text,
}
//把vals填充到prompt中
messages, _ := prompt.FormatMessages(vals)
//默认是访问本地ollama,如果需要访问别的地址的ollama,可以通过Getenv环境变量参数来指定。
llm, err := ollama.New(ollama.WithModel("qwen"))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
content := []llms.MessageContent{
llms.TextParts(messages[0].GetType(), messages[0].GetContent()),
llms.TextParts(messages[1].GetType(), messages[1].GetContent()),
}
response, _ := llm.GenerateContent(context.Background(), content)
c.JSON(http.StatusOK, response)
}
构建+拼接提示词

首先定义一个用于生成翻译任务的提示模板。
prompts.NewChatPromptTemplate
创建了一个聊天提示模板,包含两条消息格式化器:
第一条是系统消息模板,内容为"你是一个只能进行中英文翻译的机器。",用于向语言模型明确其角色和功能。
第二条是用户消息模板,内容为翻译这段文字到 {``{.outputLang}}:{``{.text}}
,其中{``{.outputLang}}
和{``{.text}}
是模板变量,分别表示目标语言和需要翻译的文本。[]string{".outputLang", "text"}
指定了模板变量的名称。
填充prompt

定义一个vals字典,用于存储模板变量的值。requestData.OutputLang
表示用户指定的目标语言,requestData.Text
表示需要翻译的原始文本。这些值将被填充到前面定义的提示模板中。
构造输入内容

content
是一个llms.MessageContent
类型的切片,用于存储输入到语言模型的内容。llms.TextParts
方法将消息的类型和内容分别提取出来,构造为MessageContent
对象。
调用llm.GenerateContent(context.Background(), content)
方法,将构造好的输入内容传递给语言模型,生成翻译结果。response变量存储了语言模型返回的翻译结果。
来看看MessageContent结构体中都有些什么。
bash
type MessageContent struct {
Role ChatMessageType
Parts []ContentPart
}
Role 是一个 ChatMessageType 类型的字段,表示消息的角色。在聊天系统中,消息通常有不同类型的角色,比如系统角色、用户角色等等。
Parts 是一个 ContentPart 类型的切片,表示消息的内容部分。消息的内容可能由多个部分组成。
那么对于代码:
bash
content := []llms.MessageContent{
llms.TextParts(messages[0].GetType(), messages[0].GetContent()),
llms.TextParts(messages[1].GetType(), messages[1].GetContent()),
}
content 是一个 MessageContent 切片,包含了两个消息的内容部分:
第一个消息(系统消息):
Role:SystemMessage(系统消息的角色)
Parts:
类型:"text"(文本类型)
值:"你是一个只能进行中英文翻译的机器。"(系统消息的内容)
第二个消息(用户消息):
Role:HumanMessage(用户消息的角色)
Parts:
类型:"text"(文本类型)
值:"翻译这段文字到 [目标语言]:[需要翻译的文本]"(用户消息的内容,其中 [目标语言] 和 [需要翻译的文本] 是动态填充的值)
所以构造的content内容是:
bash
content := []llms.MessageContent{
{
Role: SystemMessage,
Parts: []ContentPart{
{
Type: "text",
Value: "你是一个只能进行中英文翻译的机器。",
},
},
},
{
Role: HumanMessage,
Parts: []ContentPart{
{
Type: "text",
Value: "翻译这段文字到 中文:Hello, world!",
},
},
},
}