想法:输入任意语言,让它自动翻译成指定的母语
问题:当英文翻译为中文时,出现断句等不正常现象
以下仅为示例,可以扩充实现目标。不正常问题待解决。所以它是个不完善的代码。
// 利用本地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:", ""))
}
}