DeepLX密钥用起来!能够让让Llama更好地理解你的中文,试试Open WebUI DeepLX 翻译过滤器!

Open WebUI 函数:DeepLX 翻译过滤器

介绍

我们很高兴地宣布,一个新的翻译过滤器现已上线,可以在 Open WebUI 官网一键部署:DeepLX 翻译过滤器

出于对国内谷歌翻译不可用及其翻译效果不佳的顾虑,我对现有的谷歌翻译过滤器进行了修改,改用了 DeepLX 接口。这一改变使得用户的母语可以被有效地翻译为大模型的母语,并再翻译回用户的母语。

特点

  • 使用 DeepLX for Cloudflare 的 demo 接口(注意:该接口可能会被风控)。
  • 支持本地 Docker 部署,为注重隐私的用户提供自行搭建的选项。

本地 Docker 部署

如果您希望在本地进行部署,请使用如下命令:

docker run -d -p 1188:1188 --name deeplx --restart always missuo/deeplx:latest

部署完成后,请将 API 接口地址更改为 http://host.docker.internal:1188/translate

使用体验

如果你有兴趣搭建自己的接口,或者想尝试其他接口如“始皇接口”,欢迎在评论区分享你的使用体验和反馈。

import re
from typing import List, Optional
from pydantic import BaseModel
import requests
import logging

from utils.misc import get_last_user_message, get_last_assistant_message

# 配置日志记录
logging.basicConfig(level=logging.WARNING)  # 设置所需的日志级别

class Filter:
    class Valves(BaseModel):
        api_url: str = "https://deeplx.mingming.dev/translate"  # DeepLX API的URL
        source_user: str = "auto"  # 用户输入的源语言,默认值为"auto"
        target_user: str = "en"  # 用户输入的目标语言,默认值为"en"
        source_assistant: str = "en"  # 助手输入的源语言,默认值为"en"
        target_assistant: str = "zh"  # 助手输入的目标语言,默认值为"zh"

    def __init__(self, valves: Optional[Valves] = None) -> None:
        self.valves = valves if valves else self.Valves()
        self.code_blocks = []  # 存储代码块的列表

    def translate(self, text: str, source: str, target: str) -> str:
        # 更新API URL为DeepLX的URL
        url = self.valves.api_url

        # 构建请求数据
        payload = {"text": text, "source_lang": source, "target_lang": target}
        headers = {
            "Content-Type": "application/json",
            "Authorization": "",  # 如果不使用Authorization头,可以删除此行
        }

        try:
            # 使用POST方法发送请求
            r = requests.post(
                url, json=payload, headers=headers, timeout=10
            )  # 添加超时以提高健壮性
            r.raise_for_status()
            result = r.json()
            translated_text = result["data"]  # 提取翻译后的文本
            return translated_text
        except requests.exceptions.RequestException as e:
            error_msg = f"翻译API错误: {str(e)}"
            logging.error(error_msg)
            return f"{text}\\\\n\\\\n[翻译失败: {error_msg}]"
        except Exception as e:
            error_msg = f"翻译过程中发生意外错误: {str(e)}"
            logging.exception(error_msg)  # 记录意外错误的回溯
            return f"{text}\\\\n\\\\n[翻译失败: {error_msg}]"

    def split_text_around_table(self, text: str) -> List[str]:
        # 使用正则表达式将文本拆分为表格前的文本和表格文本
        table_regex = r"((?:^.*?\\|.*?\\n)+)(?=\\n[^\\|\\s].*?\\|)"
        matches = re.split(table_regex, text, flags=re.MULTILINE)

        if len(matches) > 1:
            return [matches[0], matches[1]]
        else:
            return [text, ""]

    def clean_table_delimiters(self, text: str) -> str:
        # 用单个短划线替换表格分隔符周围的多个空格
        return re.sub(r"(\\|\\s*-+\\s*)+", lambda m: m.group(0).replace(" ", "-"), text)

    async def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
        print(f"入口函数: {__name__}")
        print(f"用户输入的源语言: {self.valves.source_user}")
        print(f"用户输入的目标语言: {self.valves.target_user}")
        print(f"助手输入的源语言: {self.valves.source_assistant}")
        print(f"助手输入的目标语言: {self.valves.target_assistant}")

        user_message = get_last_user_message(body["messages"])

        # 查找并存储代码块
        code_regex = r"```(.*?)```"
        self.code_blocks = re.findall(code_regex, user_message, flags=re.DOTALL)

        # 暂时用占位符替换代码块
        user_message_processed = re.sub(
            code_regex, "__CODE_BLOCK__", user_message, flags=re.DOTALL
        )

        if self.valves.source_user != self.valves.target_user:
            parts = self.split_text_around_table(user_message_processed)
            text_before_table, table_text = parts

            translated_before_table = self.translate(
                text_before_table,
                self.valves.source_user,
                self.valves.target_user,
            )

            translated_user_message = translated_before_table + table_text
            translated_user_message = self.clean_table_delimiters(
                translated_user_message
            )

            # 在翻译后的消息中还原代码块
            for code in self.code_blocks:
                translated_user_message = translated_user_message.replace(
                    "__CODE_BLOCK__", f"```{code}```", 1
                )

            for message in reversed(body["messages"]):
                if message["role"] == "user":
                    if "[翻译失败:" in translated_user_message:
                        print(
                            f"翻译失败,语言对为 {self.valves.source_user} 到 {self.valves.target_user}"
                        )
                    else:
                        message["content"] = translated_user_message
                    break

        return body

    async def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
        print(f"出口函数: {__name__}")
        print(f"用户输入的源语言: {self.valves.source_user}")
        print(f"用户输入的目标语言: {self.valves.target_user}")
        print(f"助手输入的源语言: {self.valves.source_assistant}")
        print(f"助手输入的目标语言: {self.valves.target_assistant}")

        assistant_message = get_last_assistant_message(body["messages"])

        # 查找并存储代码块
        code_regex = r"```(.*?)```"
        self.code_blocks = re.findall(code_regex, assistant_message, flags=re.DOTALL)

        # 暂时用占位符替换代码块
        assistant_message_processed = re.sub(
            code_regex, "__CODE_BLOCK__", assistant_message, flags=re.DOTALL
        )

        if self.valves.source_assistant != self.valves.target_assistant:
            parts = self.split_text_around_table(assistant_message_processed)
            text_before_table, table_text = parts

            translated_before_table = self.translate(
                text_before_table,
                self.valves.source_assistant,
                self.valves.target_assistant,
            )

            translated_assistant_message = translated_before_table + table_text
            translated_assistant_message = self.clean_table_delimiters(
                translated_assistant_message
            )

            # 在翻译后的消息中还原代码块
            for code in self.code_blocks:
                translated_assistant_message = translated_assistant_message.replace(
                    "__CODE_BLOCK__", f"```{code}```", 1
                )

            for message in reversed(body["messages"]):
                if message["role"] == "assistant":
                    if "[翻译失败:" in translated_assistant_message:
                        print(
                            f"翻译失败,语言对为 {self.valves.source_assistant} 到 {self.valves.target_assistant}"
                        )
                    else:
                        message["content"] = translated_assistant_message
                    break

        return body

最后再分享一个本站某大佬DeepL Pro免费车队,需要的可以上车,配合DeepLX接入https://linux.do/t/topic/180128
让我们共同提升这款实用工具的效能!期待你的试用与分享!

266 个赞

官方来了??

21 个赞

对的,我是F-droid社区的国区成员,负责F-droid国区代理。

20 个赞

这个是放入deepl使用的吗

5 个赞

能不能教一下 怎么在自己的CF搭建

5 个赞

就是一个Open WebUI的DeepLX过滤器函数,你在Open WebUI里面安装这个函数之后,就可以体验大模型以英文提问英文回答的技术水平,而DeepLX作为api接口实现你和大模型之间的语言转换,就如同你用同声翻译软件跟老外对话一样。

19 个赞

CF已经绝版了,我这个里面默认调用的是作者的demo演示站的api,之前部署好的没有影响现在不能新部署了。

13 个赞

那要是被风控不好使了 怎么能发现

17 个赞

对于开了这个函数的模型,你用中文提问时他首先会用英文回答你,在回答结束几秒后会自动转换为翻译后的中文结果,如果失效了无非就以下两种情况,第一种情况是直接用中文回答,那说明第一步中文问题转化为英文来问的这一步就已经失效了,第二种情况是回答完英文之后翻译失败了,也就不会再转化为中文

13 个赞

如何接入呢,在用其他服务器已经部署了deeplx的情况下 :tieba_087:

12 个赞

直接打开官网链接DeepLX Translate Function | Open WebUI Community
然后点击获取,要求注册一个账号,注册完之后就可以添加到你的Open WebUI中,你在上面填写一下你的Open WebUI服务器的地址,它就会自动跳转到安装界面,然后你点击保存就可以。

9 个赞

你这个不错 我发现用完这个 AI话变多了

5 个赞

目前中文的语料污染情况特别严重,很多模型的中文训练数据集都不干净,而且中文语料在互联网上占比本来就少,又加之国内各大大厂都把数据放在app中,防止被他人爬取用于训练ai,也就是我们论坛坚决抵制AIGC自动发贴的原因。而使用翻译函数之后是直接以英文提问,对于复杂问题很多国外模型的语义理解能力都是英文远远大于中文,最知名的开源模型llama3.1 405B也是如此。

13 个赞

感覺挺好的 概念是用deeplx 將輸入變成英文再輸入到大模型當中
以提升大模型輸出效果

10 个赞

必須支持一波 之後開搞

12 个赞

这位是台湾、香港还是澳门的友人啊?用繁体发帖子啊!

25 个赞

台 請問我的理解正確嗎
不過目前有一個想法
這個東西如果使用ai翻譯之後再傳入會不會更好
畢竟deeplx聽說還是不能跟llm打的

9 个赞

请问佬有 LobeChat 的版本插件吗?

7 个赞

而且再rag的時候變成用英文輸入感覺會導致匹配困難

9 个赞

DeepLX就是逆向DeepL翻译api,如果你有pro账号你可以把那个令牌在部署的时候以环境变量的形式填入,这样的翻译质量会更高,DeepL号称是全球最先进的人工智能翻译,它的翻译质量也不错,至少比谷歌翻译要强。我知道你可能是想用OpenAI作为翻译api,但是这样的成本确实很高,目前还不打算支持,以后可能会试试。

6 个赞