探索MariTalk与LangChain的结合:强大的葡萄牙语AI助手
引言
在自然语言处理的世界中,语言模型的能力正在不断提升。尤其是针对特定语言进行优化的模型,如MariTalk,为特定地区的用户提供了更加贴心的服务。这篇文章将深入探讨MariTalk这个由巴西公司Maritaca AI开发的语言助手,并展示如何通过LangChain框架利用MariTalk来完成不同的任务,尤其是在葡萄牙语环境下。
主要内容
安装
在开始之前,我们需要先安装LangChain及其相关依赖。可以使用以下命令进行安装:
!pip install langchain langchain-core langchain-community httpx
获取API密钥
要使用MariTalk的服务,首先需要获得API密钥,可以通过访问chat.maritaca.ai的"Chaves da API"部分获取。
示例1 - 宠物名字建议
首先,我们定义语言模型ChatMaritalk并配置API密钥。这个简单示例展示了如何使用MariTalk为宠物建议名字:
from langchain_community.chat_models import ChatMaritalk
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts.chat import ChatPromptTemplate
# 配置语言模型
llm = ChatMaritalk(
model="sabia-2-medium", # 可选模型:sabia-2-small和sabia-2-medium
api_key="", # 填入你的API密钥
temperature=0.7,
max_tokens=100,
)
output_parser = StrOutputParser()
chat_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are an assistant specialized in suggesting pet names. Given the animal, you must suggest 4 names.",
),
("human", "I have a {animal}"),
]
)
chain = chat_prompt | llm | output_parser
response = chain.invoke({"animal": "dog"})
print(response) # 应该返回类似于 "1. Max\n2. Bella\n3. Charlie\n4. Rocky" 的结果
流式生成
当需要生成长文本时,流式生成可以提高应用响应速度。我们提供同步和异步两种方式:
同步流式生成
from langchain_core.messages import HumanMessage
messages = [HumanMessage(content="Suggest 3 names for my dog")]
for chunk in llm.stream(messages):
print(chunk.content, end="", flush=True)
异步流式生成
from langchain_core.messages import HumanMessage
import asyncio
async def async_invoke_chain(animal: str):
messages = [HumanMessage(content=f"Suggest 3 names for my {animal}")]
async for chunk in llm._astream(messages):
print(chunk.message.content, end="", flush=True)
await async_invoke_chain("dog")
示例2 - LLM + RAG:答题系统
在这个示例中,我们将使用MariTalk构建一个针对UNICAMP 2024入学考试的答题系统。此系统将长文档分割为小段落,使用BM25搜索器找到最相关的内容,再结合LLM提供答案。
数据库加载
from langchain_community.document_loaders import OnlinePDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = OnlinePDFLoader(
"https://www.comvest.unicamp.br/wp-content/uploads/2023/10/31-2023-Dispoe-sobre-o-Vestibular-Unicamp-2024_com-retificacao.pdf"
)
data = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=100, separators=["\n", " ", ""]
)
texts = text_splitter.split_documents(data)
创建搜索器
from langchain_community.retrievers import BM25Retriever
retriever = BM25Retriever.from_documents(texts)
组合搜索系统与LLM
from langchain.chains.question_answering import load_qa_chain
prompt = """Baseado nos seguintes documentos, responda a pergunta abaixo.
{context}
Pergunta: {query}
"""
qa_prompt = ChatPromptTemplate.from_messages([("human", prompt)])
chain = load_qa_chain(llm, chain_type="stuff", verbose=True, prompt=qa_prompt)
query = "Qual o tempo máximo para realização da prova?"
docs = retriever.invoke(query)
chain.invoke(
{"input_documents": docs, "query": query}
) # 应输出类似 "O tempo máximo para realização da prova é de 5 horas." 的结果
常见问题和解决方案
- API访问稳定性:由于某些地区网络限制,开发者在使用API时可能需要考虑使用API代理服务,以提高访问的稳定性。
- 文本长度限制:在处理超过模型token限制的长文档时,使用RAG(检索增强生成)策略可有效应对。
总结和进一步学习资源
本文详细介绍了如何利用MariTalk结合LangChain,在葡萄牙语环境下执行各种任务。通过引入流式生成和检索增强生成技术,我们能够大幅提升AI助手的实用性和用户体验。
进一步学习资源
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---