实战: LangChain 版 OpenAI-Translator v2.0
深入理解 Chat Model 和 Chat Prompt Template
深入理解 LangChain 的聊天模型。简而言之:
-
Chat Model
不止是一个用于聊天对话的模型抽象,更重要的是提供了多角色
提示能力(System,AI,Human,Function)。 -
Chat Prompt Template
则为开发者提供了便捷维护不同角色
的提示模板
与消息记录
的接口。
温故:LangChain Chat Model 使用方法和流程
from langchain.chat_models import ChatOpenAI chat_model = ChatOpenAI(model_name="gpt-3.5-turbo") from langchain.schema import ( AIMessage, HumanMessage, SystemMessage ) messages = [SystemMessage(content="You are a helpful assistant."), HumanMessage(content="Who won the world series in 2020?"), AIMessage(content="The Los Angeles Dodgers won the World Series in 2020."), HumanMessage(content="Where was it played?")] print(messages) chat_model(messages)
使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate
使用 ChatPromptTemplate.from_messages
方法,类似使用和维护messages
的方式,构造 chat_prompt_template
创建系统模板
from langchain.schema import AIMessage, HumanMessage, SystemMessage # 导入 Chat Model 即将使用的 Prompt Templates from langchain.prompts.chat import ( ChatPromptTemplate, SystemMessagePromptTemplate, AIMessagePromptTemplate, HumanMessagePromptTemplate, ) # 翻译任务指令始终由 System 角色承担 template = ( """You are a translation expert, proficient in various languages. \n Translates English to Chinese.""" ) system_message_prompt = SystemMessagePromptTemplate.from_template(template)
Human 角色输入
# 待翻译文本由 Human 角色输入 human_template = "{text}" human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate
chat_prompt_template = ChatPromptTemplate.from_messages( [system_message_prompt, human_message_prompt] )
生成用于翻译的 Chat Prompt
chat_prompt = chat_prompt_template.format_prompt(text="I love programming.").to_messages()
使用 Chat Model(GPT-3.5-turbo)实际执行翻译任务
from langchain.chat_models import ChatOpenAI # 为了翻译结果的稳定性,将 temperature 设置为 0 translation_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0) translation_model(chat_prompt)
使用 LLMChain 简化重复构造 ChatPrompt
from langchain.chains import LLMChain # 无需再每次都使用 to_messages 方法构造 Chat Prompt translation_chain = LLMChain(llm=translation_model, prompt=chat_prompt_template) # 等价于 translation_result.content (字符串类型) translation_chain.run({'text': "I love programming."})
扩展:支持多语言对翻译
System 增加 source_language 和 target_language
# System 增加 source_language 和 target_language template = ( """You are a translation expert, proficient in various languages. \n Translates {source_language} to {target_language}.""" ) system_message_prompt = SystemMessagePromptTemplate.from_template(template) # 待翻译文本由 Human 角色输入 human_template = "{text}" human_message_prompt = HumanMessagePromptTemplate.from_template(human_template) # 使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate m_chat_prompt_template = ChatPromptTemplate.from_messages( [system_message_prompt, human_message_prompt] ) m_translation_chain = LLMChain(llm=translation_model, prompt=m_chat_prompt_template)
基于 LangChain 优化 OpenAI-Translator 架构设 计
v2.0 设计:回应 Model 模块挑战
定义 trnslation chain
Gradio GUI
图形化界面
import sys import os import gradio as gr sys.path.append(os.path.dirname(os.path.abspath(__file__))) from utils import ArgumentParser, LOG from translator import PDFTranslator, TranslationConfig def translation(input_file, source_language, target_language): LOG.debug(f"[翻译任务]\n源文件: {input_file.name}\n源语言: {source_language}\n目标语言: {target_language}") output_file_path = Translator.translate_pdf( input_file.name, source_language=source_language, target_language=target_language) return output_file_path def launch_gradio(): iface = gr.Interface( fn=translation, title="OpenAI-Translator v2.0(PDF 电子书翻译工具)", inputs=[ gr.File(label="上传PDF文件"), gr.Textbox(label="源语言(默认:英文)", placeholder="English", value="English"), gr.Textbox(label="目标语言(默认:中文)", placeholder="Chinese", value="Chinese") ], outputs=[ gr.File(label="下载翻译文件") ], allow_flagging="never" ) iface.launch(share=True, server_name="0.0.0.0") def initialize_translator(): # 解析命令行 argument_parser = ArgumentParser() args = argument_parser.parse_arguments() # 初始化配置单例 config = TranslationConfig() config.initialize(args) # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法 global Translator Translator = PDFTranslator(config.model_name) if __name__ == "__main__": # 初始化 translator initialize_translator() # 启动 Gradio 服务 launch_gradio()