使用Ollama+Langchaingo+Gin通过定义prompt模版实现翻译功能

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!",
			},
		},
	},
}
相关推荐
掰头战士几秒前
AgentLoop: 从 while(true) 到生产级循环
typescript·llm·agent
Albart5751 分钟前
大模型无限循环输出、重复生成文本:参数层面规避幻觉输出实战
大模型·llm·vllm·大模型推理·幻觉·重复输出
玉宇夕落11 分钟前
llm模块二 结构化输出 LangChain 结构化输出完全指南:从 JSON 解析到 withStructuredOutput
langchain·llm
“AI国潮设计-小江”2 小时前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁英歌舞猫IP & 创意甜品设计(附ComfyUI工作流与商业授权说明)
开发语言·人工智能·python·prompt·aigc
AI 思录2 小时前
AI生造词、乱用术语怎么治?一份防“词汇污染“的Prompt约束模板
人工智能·语言模型·prompt·ai写作·用户体验·ai合规
桃西西呀3 小时前
体检报告上一堆箭头看不懂?背后的逻辑就是随机森林:一群树投票,比一棵树靠谱
人工智能·机器学习·llm
JouYY3 小时前
我用DSH高效管理了我的prompt收藏
架构·llm·agent
CoderJia程序员甲4 小时前
GitHub 热榜项目 - 周榜(2026-09-12)
ai·大模型·llm·github·agent
阡陌数智5 小时前
LiteLLM 开源网关实践:能力边界与生产环境改造要点
大数据·人工智能·开源·prompt·软件工程
多云行者5 小时前
LLM Gateway科普:大模型统一接入与治理,究竟解决了什么
大模型·llm·gateway·api·大模型统一接入