(原) 利用ollama实现的本地翻译机

原创文章,请后转载,并注明出处。

想法:输入任意语言,让它自动翻译成指定的母语
问题:当英文翻译为中文时,出现断句等不正常现象

以下仅为示例,可以扩充实现目标。不正常问题待解决。所以它是个不完善的代码。

// 利用本地ollama完成的自动语言翻译工具
// 可以自动识别语言翻译成中文或英文

// 与ollama连接

package main

import (
	"context"
	"fmt"
	"strings"
	"unicode"
	"unicode/utf8"

	"github.com/tmc/langchaingo/llms"
	"github.com/tmc/langchaingo/llms/ollama"
	"github.com/tmc/langchaingo/prompts"
)

// detectLanguage 用于检测字符串的语言类型。
// 它会返回 "Chinese"、"English" 或 "Unknown"。
func detectLanguage(s string) string {
	var chineseCount, englishCount int
	var hasOtherRune bool

	for i, w := 0, 0; i < len(s); i += w {
		r, width := utf8.DecodeRuneInString(s[i:])
		w = width
		switch {
		case unicode.Is(unicode.Han, r):
			chineseCount++
		case unicode.IsLetter(r) && (unicode.Is(unicode.Latin, r) || unicode.Is(unicode.ASCII_Hex_Digit, r)):
			englishCount++
		default:
			hasOtherRune = true
		}
	}

	if chineseCount > 0 {
		return "Chinese"
	} else if englishCount > 0 && (englishCount >= chineseCount) {
		return "English"
	} else if hasOtherRune {
		return "Unknown"
	}
	return "Unknown"
}

// 翻译到哪种语言
func toLanguage(s string) string {
	lang := detectLanguage(s)
	if lang == "Chinese" {
		return "english"
	}
	if lang == "English" {
		return "chinese"
	}
	return "chinese"
}

func main() {
	var info string
	fmt.Println(`-----------------------------------------------------------------------

 请输入您要翻译的内容 (Please input the text you want to translate)
 输入 exit 退出 (Input 'exit' to quit.)
	
------------------------------------------------------------------------
`)

	for {
		fmt.Print("> ")
		fmt.Scanln(&info)
		if info == "exit" {
			break
		}

		prompt := prompts.NewChatPromptTemplate([]prompts.MessageFormatter{
			prompts.NewSystemMessagePromptTemplate("你是一个只能翻译文本的翻译引擎,不需要进行解释。", nil),
			prompts.NewHumanMessagePromptTemplate("翻译这段文字到 {{.outputLang}}: {{.text}}", []string{"outputLang", "text"}),
		})

		vals := map[string]any{
			"outputLang": toLanguage(info),
			"text":       info,
		}

		messages, err := prompt.FormatMessages(vals)
		if err != nil {
			panic(err)
		}

		llm, err := ollama.New(ollama.WithModel("qwen2"))
		if err != nil {
			panic(err)
		}

		content := []llms.MessageContent{
			llms.TextParts(messages[0].GetType(), messages[0].GetContent()),
			llms.TextParts(messages[1].GetType(), messages[1].GetContent()),
		}
		response, err := llm.GenerateContent(context.Background(), content)

		if err != nil {
			panic(err)
		}

		fmt.Println(strings.ReplaceAll(response.Choices[0].Content, "Translate this text into English:", ""))
	}
}