本地大模型编程实战(01)实现翻译功能
这里写自定义目录标题
- 准备
- 使用本地大语言模型
- 翻译测试
- 流式输出
- 提示词模板
- 代码
大语言模型的主要功能是预测:输入一些字符串,它预测输出另一些字符串,这个特点使它擅长翻译。
本文描述了如何使用大语言模型(LLM
)实现基本的翻译功能,此翻译功能的特点是:无需指定源语言,只需要指定目标语言就可以进行翻译了。
准备
在正式开始撸代码之前,需要准备一下编程环境。
-
计算机
本文涉及的所有代码可以在没有显存的环境中执行。 我使用的机器配置为:- CPU: Intel i5-8400 2.80GHz
- 内存: 16GB
-
Visual Studio Code 和 venv
这是很受欢迎的开发工具,相关文章的代码可以在Visual Studio Code
中开发和调试。 我们用python
的venv
创建虚拟环境, 详见:
在Visual Studio Code中配置venv。 -
Ollama
在Ollama
平台上部署本地大模型非常方便,基于此平台,我们可以让langchain
使用llama3.1
、qwen2.5
等各种本地大模型。详见:
在langchian中使用本地部署的llama3.1大模型 。
使用本地大语言模型
from langchain_ollama.llms import OllamaLLM
model = OllamaLLM(model="llama3.1")
llama3.1
支持多语言,适合一般性任务。langchain
也支持很多其它平台和模型,详见:Chat models 。
翻译测试
ChatModel
是 LangChain Runnable
的实例,这意味着它们公开了一个用于与它们交互的标准接口。我们用 .invoke
方法即可简单的调用模型。
def translate_1(text):
"""将文字翻译为意大利语"""
messages = [
SystemMessage("Translate the following from English into Italian"),
HumanMessage(text),
]
return model.invoke(messages)
我们现在可以调用上述方法,测试一下大模型的能力。
if __name__ == '__main__':
response = translate_1("Hello, how are you?")
print(response)
Ciao! Come stai? (Hello! How are you?)
langchain
还支持用其它的格式作为invoke的参数,例如:model.invoke("Hello")
等价于:
model.invoke([{"role": "user", "content": "Hello"}])
model.invoke([HumanMessage("Hello")])
流式输出
因为聊天模型是 Runnable
,所以它们公开了一个包含异步和流调用模式的标准接口stream
,我们用它把翻译方法改造一下:
def translate_1_stream(text):
"""将文字翻译为意大利语"""
messages = [
SystemMessage("Translate the following from English into Italian"),
HumanMessage(text),
]
for token in model.stream(messages):
yield token
我们可以调用一下此方法:
for token in translate_1_stream("Hello, how are you?"):
print(token, end="|")
C|iao|,| come| st|ai|?||
流式输出的好处是:大模型返回的数据可以"一点一点"的返回来。
当大模型响应比较慢时,可以让用户便等待边看到结果,很友好;另外,在后面练习比较复杂的Agent
时,也可以通过stream
调用看到调用过程,便于调试。
提示词模板
我们通过提示词模板构建比较复杂一点的提示词,它有两个参数:
- language: 将文本翻译成的语言
- text: 被翻译的文本
然后我们再调用提示词模板的invoke
方法初始化提示词。
# 1. system提示词
def translate_2(text,language):
"""用提示词模板构建提示词,翻译文字"""
# 1. system提示词
system_template = "Translate the following from English into {language}"
# 2. 提示词模板
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
# 3. 调用invoke构建提示词
prompt = prompt_template.invoke({"language": language, "text": text})
print(prompt.to_messages())
response = model.invoke(prompt)
return response
请注意,
ChatPromptTemplate
在单个模板中支持多种消息角色。在本例中,我们将language
参数格式化为系统消息,将text
格式化为用户消息。
我们调用一下这个方法,看看输出效果:
response = translate_2("First up, let's learn how to use a language model by itself.","Chinese")
print(response)
让我们先学习如何使用语言模型。
代码
- github
- gitee
🪐祝好运🪐