分类: 编码

  • 自建免费翻译服务:LibreTranslate 安装与运行指南

    对于需要翻译功能但又希望数据掌握在自己手中,或者想避免商业翻译 API 成本的用户而言,开源翻译软件 LibreTranslate 提供了一个绝佳的解决方案。它允许您在自己的服务器上搭建一个功能完善的机器翻译服务,支持多种语言对的机器翻译,且不依赖外部 API,适合在内网或资源受限的环境中使用

    一、创建独立的运行环境 (Conda)

    创建一个名为 libretranslate 的新虚拟环境并激活一个名为 libretranslate 的环境,基于 Python 3.12。

    conda create -n libretranslate python=3.12
    conda activate libretranslate

    二、安装 LibreTranslate

    使用 pip 安装最新版的 LibreTranslate:

    pip install -U libretranslate

    安装完成后,即可通过命令行启动 LibreTranslate 服务。

    三、启动服务

    运行以下命令,启动默认配置的翻译服务:

    libretranslate

    服务启动后,默认会监听本地的 http://127.0.0.1:5000,提供一个 REST API 接口用于文本翻译。

    四、指定加载语言模型

    如果你只需要支持特定语言(比如英文和中文),可以通过 --load-only 参数指定需要加载的模型,从而节省内存和启动时间:

    libretranslate --load-only en,zh

    这将只加载英文(en)和中文(zh)之间的模型。

    五、更新语言模型

    为确保模型为最新版,可以执行以下命令进行更新:

    libretranslate --update-models

    此命令会自动下载并更新本地缓存的翻译模型,确保翻译质量和准确性。

  • 在 WordPress 主题中添加暗黑模式切换

    1. 编辑主题的 functions.php 文件

    1. 编辑到您当前使用的主题目录,通常位于 wp-content/themes/your-theme-name/
    2. 找到 functions.php 文件并使用文本编辑器打开它。

    2. 添加代码

    将代码粘贴到 functions.php 文件的末尾,确保不要覆盖任何现有的代码

    // Color Change
    function add_dark_mode_toggle_script() {
        ?>
        <script>
            document.addEventListener("DOMContentLoaded", function () {
                const toggleBtn = document.createElement("button");
                toggleBtn.id = "dark-mode-toggle";
                toggleBtn.innerHTML = "🌙"; // 默认显示月亮(暗色模式)
                toggleBtn.classList.add("dark-mode-btn");
                document.body.appendChild(toggleBtn);
    
                function toggleDarkMode() {
                    if (document.body.classList.contains("dark-mode")) {
                        document.body.classList.remove("dark-mode");
                        localStorage.setItem("theme", "light");
                        toggleBtn.innerHTML = "🌙"; // 切换回暗色模式
                    } else {
                        document.body.classList.add("dark-mode");
                        localStorage.setItem("theme", "dark");
                        toggleBtn.innerHTML = "☀️"; // 切换回亮色模式
                    }
                }
    
                toggleBtn.addEventListener("click", toggleDarkMode);
    
                if (localStorage.getItem("theme") === "dark") {
                    document.body.classList.add("dark-mode");
                    toggleBtn.innerHTML = "☀️"; // 初始时使用亮色模式图标
                }
            });
        </script>
    
        <style>
            /* 风格切换按钮 */
            .dark-mode-btn {
                position: fixed;
                bottom: 20px;
                right: 20px;
                width: 50px;
                height: 50px;
                background: #FF6F61; /* 温暖的橙色按钮背景 */
                color: white;
                border: none;
                border-radius: 50%;
                font-size: 20px;
                cursor: pointer;
                display: flex;
                align-items: center;
                justify-content: center;
                box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2);
                transition: background 0.3s, transform 0.2s;
            }
    
            .dark-mode-btn:hover {
                background: #FF4C29; /* 深橙色悬停 */
                transform: scale(1.1);
            }
    
            body.dark-mode {
                background-color: #000000; /* 黑色背景 */
                color: #FFFFFF; /* 白色文字 */
            }
    
            body.dark-mode a {
                color: #FF9F5F; /* 浅橙色链接 */
            }
    
            body.dark-mode h1, 
            body.dark-mode h2, 
            body.dark-mode h3, 
            body.dark-mode h4 {
                color: #FF6F61; /* 温暖的橙色标题 */
            }
    
            body.dark-mode blockquote {
                border-left: 5px solid #FF6F61; /* 温暖的橙色引用框 */
                background: rgba(255, 111, 97, 0.1); /* 橙色浅背景 */
                padding: 12px 15px;
            }
    
            /* 按钮样式 */
            body.dark-mode .dark-mode-btn {
                background: #FF6F61; /* 温暖的橙色按钮 */
                color: #FFF;
            }
    
            /* 按钮悬停效果 */
            body.dark-mode .dark-mode-btn:hover {
                background: #FF4C29; /* 深橙色悬停 */
            }
        </style>
        <?php
    }
    add_action('wp_footer', 'add_dark_mode_toggle_script');

    3. 效果演示

    • 清除您的浏览器缓存。
    • 访问您的 WordPress 网站。
    • 您应该会在页面右下角看到一个带有月亮图标的按钮。
    • 点击按钮,网站应该切换到暗黑模式。再次点击,切换回亮色模式。
  • WordPress在文章中添加相关文章推荐功能

    添加一段代码,它通过分析文章的分类,智能地在单篇文章末尾展示相关文章,从而提升网站的互动性和用户体验。

    1. 找到您的 functions.php 文件

    • 编辑到您当前使用的主题目录,通常位于 wp-content/themes/your-theme-name/
    • 找到 functions.php 文件并使用文本编辑器打开它。

    2. 将代码片段添加到 functions.php

    将以下代码复制并粘贴到 functions.php 文件的末尾:

    // Related articles
    function display_related_posts_by_category($content) {
        if (is_single()) {
            $post_object = get_queried_object();
            if ($post_object) {
                $categories = wp_get_post_categories($post_object->ID);
                if ($categories) {
                    $args = array(
                        'category__in' => $categories,
                        'post__not_in' => array($post_object->ID),
                        'posts_per_page' => 5,
                        'orderby' => 'rand',
                        'no_found_rows' => true,
                    );
                    $related_posts = new WP_Query($args);
                    if ($related_posts->have_posts()) {
                        $content .= '<div class="related-posts"><h3>相关文章</h3><ul>';
                        while ($related_posts->have_posts()) {
                            $related_posts->the_post();
                            $content .= '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a></li>';
                        }
                        $content .= '</ul></div>';
                        wp_reset_postdata();
                    }
                }
            }
        }
        return $content;
    }
    add_filter('the_content', 'display_related_posts_by_category');

    3. 保存 functions.php 文件

    • 保存对 functions.php 文件的更改。

    4. 实际应用:增强用户体验

    通过在 WordPress 网站中添加这段代码,可以实现以下效果:

    • 提高用户粘性: 相关文章的推荐,能够引导用户浏览更多感兴趣的内容,延长页面停留时间。
    • 优化内容结构: 通过分类推荐,帮助用户发现同一主题下的其他文章,完善内容体系。
    • 提升 SEO 效果: 增加页面内部链接,有助于搜索引擎更好地理解网站结构和内容相关性。
  • 基于LangChain和Ollama的本地文档问答系统

    使用 LangChain 框架和 Ollama 开源大模型搭建一个问答系统,根据提供的文档内容回答用户提出的问题。

    系统主要由以下几个部分组成:

    • 文档加载模块: 负责从指定的路径加载文档。
    • 文档切分模块: 将加载的文档按照指定的大小和重叠度进行切分,以便 LLM 处理。
    • LLM 加载模块: 负责加载指定的 Ollama 模型。
    • 问答链创建模块: 使用 LangChain 表达式语言 (LCEL) 构建问答链,将用户问题和文档内容输入到 LLM 中,并解析 LLM 的输出。
    • 提问模块: 接收用户输入的问题,调用问答链生成答案,并返回给用户。
    • 重试机制: 使用 Tenacity 库,当提问模块出现错误时,自动进行重试,以提高系统的稳定性。

    1. 创建一个虚拟环境,名字为langqa

    conda create -n langqa python=3.12

    2. 激活虚拟环境

    conda activate langqa

    3. 安装依赖

    pip install langchain langchain_community langchain-ollama ollama tenacity

    4. 部署代码

    替换为你自己的文件、模型和地址

    • 文件:tcpdump.1-4.4.0.txt
    • 模型:llama3.1:8b
    • OLLAMA :http://localhost:11434

    配置完成后使用命令行进行运行对话

    python langqa.py

    代码

    """
    Author: Qixinlee
    Description: 基于LangChain和Ollama的本地文档问答系统
    """ 
    
    import os
    from langchain_community.document_loaders import TextLoader
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from langchain_ollama import OllamaLLM
    from langchain.prompts import PromptTemplate
    import ollama
    from tenacity import retry, stop_after_attempt, wait_random_exponential
    from langchain_core.runnables import chain
    from langchain_core.output_parsers import StrOutputParser
    
    # 常量定义
    DOCUMENT_PATH = os.path.join(os.path.dirname(__file__), "tcpdump.1-4.4.0.txt")
    CHUNK_SIZE = 1000
    CHUNK_OVERLAP = 100
    LLM_MODEL_NAME = "llama3.1:8b"
    OLLAMA_HOST = "http://localhost:11434"
    
    # 1. 设置 Ollama 连接信息
    os.environ["OLLAMA_HOST"] = OLLAMA_HOST
    ollama.DEFAULT_BASE_URL = OLLAMA_HOST
    
    # 2. 加载文档
    def load_document(document_path: str):
        try:
            loader = TextLoader(document_path)
            documents = loader.load()
            print(f"Successfully loaded document from {document_path}")
            return documents
        except Exception as e:
            print(f"Error loading document: {e}")
            exit()
    
    # 3. 切分文档
    def split_document(documents, chunk_size: int, chunk_overlap: int):
        text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
        texts = text_splitter.split_documents(documents)
        return texts
    
    # 4. 加载 LLM
    def load_llm(llm_model_name: str):
        try:
            llm = OllamaLLM(model=llm_model_name)
            print(f"Successfully loaded LLM model: {llm_model_name}")
            return llm
        except Exception as e:
            print(f"Error loading LLM model: {e}")
            exit()
    
    # 5. 创建问答链 (使用 LangChain 表达式语言)
    def create_qa_chain(llm):
        try:
            template = """你是一个问答机器人。请根据以下已知信息,用简洁和专业的中文回答用户的问题。
            如果无法从中得到答案,请清晰地输出 “根据已知信息无法回答该问题”。
    
            已知信息:
            {context}
    
            问题: {question}
            答案:"""
            QA_CHAIN_PROMPT = PromptTemplate(
                input_variables=["context", "question"], template=template
            )
    
            # 使用 Runnable 序列
            qa_chain = QA_CHAIN_PROMPT | llm | StrOutputParser()
    
            print("Successfully created QA chain.")
            return qa_chain
        except Exception as e:
            print(f"Error creating QA chain: {e}")
            exit()
    
    # 6. 提问 (使用 Tenacity 实现重试机制)
    @retry(stop=stop_after_attempt(3), wait=wait_random_exponential(multiplier=1, min=4, max=10))
    def generate_answer(qa_chain, document_content: str, query: str):
        try:
            result = qa_chain.invoke({"context": document_content, "question": query})
            print("Successfully generated answer.")
            return result
        except Exception as e:
            print(f"Error during QA: {e}")
            raise
    
    # 主程序
    if __name__ == "__main__":
    
        # 1. 加载文档
        documents = load_document(DOCUMENT_PATH)
    
        # 2. 切分文档
        texts = split_document(documents, CHUNK_SIZE, CHUNK_OVERLAP)
    
        # 3. 加载 LLM (使用常量)
        llm = load_llm(LLM_MODEL_NAME)
    
        # 4. 将所有文本块连接成一个字符串
        document_content = "\n".join([text.page_content for text in texts])
    
        # 5. 创建问答链
        qa_chain = create_qa_chain(llm)
    
        # 6. 循环提问
        while True:
            query = input("请输入你的问题 (输入 'exit' 退出): ")
            if query.lower() == "exit":
                break
    
            try:
                result = generate_answer(qa_chain, document_content, query)
                print("Question (中文):", query)
                print("Answer (中文):", result)
    
            except Exception as e:
                print(f"Failed to generate answer: {e}")
                exit()
  • WordPress通过代码实现评论回复进行邮件通知

    我最近遇到了WordPress邮件发送的问题,在我印象中WordPress有评论回复是可以正常发送邮件的,经过我的排查发现twentytwentyfour主题,在文章评论页面没有如果有人回复我的评论,请通过电子邮件通知我这个功能,昨天翻阅了WordPress Developer Resources文档开始折腾这个功能,成功实现了

    1. 编辑twentytwentyfour主题的 functions.php 文件

    1. 编辑到您当前使用的主题目录,通常位于 wp-content/themes/your-theme-name/
    2. 找到 functions.php 文件并使用文本编辑器打开它。

    2. 添加代码

    将代码粘贴到 functions.php 文件的末尾,确保不要覆盖任何现有的代码

    // WordPress Comment Reply Notification
    function wpdocs_notify_comment_reply( $comment_id ) {
        $comment = get_comment( $comment_id );
        $parent_comment = get_comment( $comment->comment_parent );
    
        // 只有当这是一个回复并且存在父级评论时才继续
        if ( $comment->comment_parent != 0 && $parent_comment ) {
            $parent_author_email = $parent_comment->comment_author_email;
            $parent_author_name  = $parent_comment->comment_author;
            $post_title           = get_the_title( $parent_comment->comment_post_ID );
            $post_link            = get_permalink( $parent_comment->comment_post_ID );
            $reply_author_name    = $comment->comment_author;
            $reply_content        = $comment->comment_content;
            $site_name            = get_bloginfo('name'); // 获取站点名称
    
            // 避免给自己回复发送通知
            if ( $parent_author_email != $comment->comment_author_email ) {
                $subject = sprintf( '[%s] 您的评论收到了新的回复 - %s', $site_name, $post_title );
                $message = sprintf(
                    "您好 %s,\n\n" .
                    "您在文章《%s》上的评论收到了新的回复。\n\n" .
                    "回复人:%s\n" .
                    "回复内容:\n%s\n\n" .
                    "点击以下链接查看完整对话:\n%s#comment-%s\n\n" .
                    "如果这封邮件不是由您回复的,请忽略。\n\n" .
                    "感谢您的参与!\n\n" .
                    "%s 团队",
                    $parent_author_name,
                    $post_title,
                    $reply_author_name,
                    $reply_content,
                    $post_link,
                    $comment->comment_parent,
                    $site_name
                );
    
                wp_mail( $parent_author_email, $subject, $message );
            }
        }
    }
    add_action( 'comment_post', 'wpdocs_notify_comment_reply' );
  • 通过 MySQL 命令行重置 WordPress 管理员密码

    在忘记 WordPress 管理员密码的情况下,如何通过 MySQL 命令行重置密码的步骤。

    1. 进入 MySQL 命令行

    如果你的 WordPress 使用的是本地数据库,使用以下命令登录 MySQL:

    mysql -u root -p

    如果 WordPress 使用 Docker 运行,先找到 MySQL 容器:

    docker ps | grep mysql

    然后进入 MySQL 容器:

    docker exec -it <mysql-container-id> mysql -u root -p

    2. 选择 WordPress 数据库

    找到 WordPress 使用的数据库名

    SHOW DATABASES;

    进入wordpress数据库

    USE wordpress;

    查看数据表

    show tables;

    3. 查找管理员用户名

    SELECT ID ,user_login,user_pass FROM wp_users;

    找到管理员的 user_loginuser_pass 和对应的 ID

    4. 更新管理员密码

    使用 ID 值替换 1,并使用你想要的新密码替换 newpassword

    UPDATE wp_users SET user_pass = MD5('newpassword') WHERE ID = 1;

    WordPress 采用 MD5 存储密码,所以这里使用 MD5() 进行加密。

    5. 退出 MySQL

    EXIT;

    6. 重新登录 WordPress

    使用新的密码登录你的 WordPress 管理员后台 (/wp-admin/)。

    请注意,即使密码是加盐的,也就是说它们看起来像 $P$BLDJMdyBwegaCLE0GeDiGtC/mqXLzB0,您仍然可以用 MD5 哈希替换密码,WordPress 会允许您登录,然后在 WordPress 后台手动更改为更安全的密码。