MariTalk
簡介
MariTalk 是由巴西公司 Maritaca AI 開發的助理。MariTalk 基於經過特殊訓練以良好理解葡萄牙語的語言模型。
本筆記本示範如何透過兩個範例將 MariTalk 與 LangChain 一起使用
- 如何使用 MariTalk 執行任務的簡單範例。
- LLM + RAG:第二個範例展示如何回答問題,其答案可在不符合 MariTalk 符記限制的長文件中找到。為此,我們將使用簡單的搜尋器 (BM25) 首先搜尋文件中最相關的部分,然後將其饋送給 MariTalk 以進行回答。
安裝
首先,使用以下命令安裝 LangChain 函式庫(及其所有依賴項)
!pip install langchain langchain-core langchain-community httpx
API 金鑰
您將需要一個 API 金鑰,可以從 chat.maritaca.ai(「Chaves da API」部分)取得。
範例 1 - 寵物名稱建議
讓我們定義我們的語言模型 ChatMaritalk,並使用您的 API 金鑰進行配置。
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", # Available models: sabia-2-small and sabia-2-medium
api_key="", # Insert your API key here
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) # should answer something like "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)
API 參考:HumanMessage
非同步:
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")
API 參考:HumanMessage
範例 2 - RAG + LLM:UNICAMP 2024 入學考試問題回答系統
對於此範例,我們需要安裝一些額外的函式庫
!pip install unstructured rank_bm25 pdf2image pdfminer-six pikepdf pypdf unstructured_inference fastapi kaleido uvicorn "pillow<10.1.0" pillow_heif -q
載入資料庫
第一步是使用通知中的資訊建立資料庫。為此,我們將從 COMVEST 網站下載通知,並將提取的文字分段為 500 個字元的視窗。
from langchain_community.document_loaders import OnlinePDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# Loading the COMVEST 2024 notice
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)
建立搜尋器
現在我們有了資料庫,我們需要一個搜尋器。對於此範例,我們將使用簡單的 BM25 作為搜尋系統,但這可以替換為任何其他搜尋器(例如透過嵌入進行搜尋)。
from langchain_community.retrievers import BM25Retriever
retriever = BM25Retriever.from_documents(texts)
API 參考:BM25Retriever
結合搜尋系統 + 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}
) # Should output something like: "O tempo máximo para realização da prova é de 5 horas."
API 參考:load_qa_chain