Haystack에서 Mistral AI 사용하기
Haystack에서 Mistral AI 사용하기 (Using Mistral AI with Haystack)
Mistral 임베딩과 생성 모델을 2개의 Haystack 파이프라인에 사용하는 방법을 배우는 문서예요. URL 내용을 인덱싱해 벡터 데이터베이스에 저장하는 인덱싱 파이프라인과, 그 URL 내용과 채팅하는 검색 증강 채팅 파이프라인을 만듭니다.
출처: 문서
본문
이 쿡북에서는 2개의 [Haystack] 파이프라인에서 Mistral 임베딩과 생성 모델을 사용할 거예요.
- URL 내용의 임베딩을 생성해 벡터 데이터베이스에 인덱싱하는 인덱싱 파이프라인
- URL 내용과 채팅하는 검색 증강(retrieval-augmented) 채팅 파이프라인
먼저 의존성을 설치해요.
!pip install mistral-haystack
!pip install trafilatura
from haystack import version
version.__version__
다음으로 MISTRAL_API_KEY 환경 변수를 설정해야 해요 👇
import os
from getpass import getpass
os.environ["MISTRAL_API_KEY"] = getpass("Mistral API Key:")
Mistral 임베딩으로 URL 인덱싱 (Index URLs with Mistral Embeddings)
아래에서는 전체 Haystack 인덱싱 파이프라인에서 mistral-embed를 사용해요. 선택한 URL의 내용에 mistral-embed로 임베딩을 생성하고, [MistralDocumentEmbedder]를 사용해 [InMemoryDocumentStore]에 작성합니다.
💡 이 문서 스토어는 설정 요구사항이 없어 시작하기 가장 간단해요. 이 문서 스토어를 [Haystack 2.0에서 사용 가능한 벡터 데이터베이스] 중 Weaviate, Chroma, AstraDB 등 어떤 것으로든 바꿀 수 있어요.
from haystack import Pipeline
from haystack.components.converters import HTMLToDocument
from haystack.components.fetchers import LinkContentFetcher
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack_integrations.components.embedders.mistral.document_embedder import MistralDocumentEmbedder
document_store = InMemoryDocumentStore()
fetcher = LinkContentFetcher()
converter = HTMLToDocument()
embedder = MistralDocumentEmbedder()
writer = DocumentWriter(document_store=document_store)
indexing = Pipeline()
indexing.add_component(name="fetcher", instance=fetcher)
indexing.add_component(name="converter", instance=converter)
indexing.add_component(name="embedder", instance=embedder)
indexing.add_component(name="writer", instance=writer)
indexing.connect("fetcher", "converter")
indexing.connect("converter", "embedder")
indexing.connect("embedder", "writer")
urls = ["https://mistral.ai/news/la-plateforme/", "https://mistral.ai/news/mixtral-of-experts"]
indexing.run({"fetcher": {"urls": urls}})
Mistral 생성 모델로 URL과 채팅하기 (Chat With the URLs with Mistral Generative Models)
이제 다양한 URL의 내용과 임베딩을 인덱싱했으니, mistral-small과 함께 [MistralChatGenerator] 컴포넌트를 사용하는 RAG 파이프라인을 만들 수 있어요. 이 파이프라인에 대해 알아둘 몇 가지:
- [
MistralTextEmbdder]를 사용해 질문을 임베딩하고 가장 관련 있는 1개 문서를 검색해요. streaming_callback을 제공해 스트리밍 응답을 활성화해요.documents는 검색기에 의해 채팅 템플릿에 제공되고,query는 파이프라인을 실행할 때 우리가 제공해요.
from haystack.dataclasses import ChatMessage
chat_template = """Answer the following question based on the contents of the documents.\n
Question: {{query}}\n
Documents: {{documents[0].content}}
"""
user_message = ChatMessage.from_user(chat_template)
from haystack import Pipeline
from haystack.components.builders import ChatPromptBuilder
from haystack.components.generators.utils import print_streaming_chunk
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack_integrations.components.embedders.mistral.text_embedder import MistralTextEmbedder
from haystack_integrations.components.generators.mistral import MistralChatGenerator
text_embedder = MistralTextEmbedder()
retriever = InMemoryEmbeddingRetriever(document_store=document_store, top_k=1)
prompt_builder = ChatPromptBuilder(template=user_message, variables=["query", "documents"], required_variables=["query", "documents"])
llm = MistralChatGenerator(model='mistral-small', streaming_callback=print_streaming_chunk)
rag_pipeline = Pipeline()
rag_pipeline.add_component("text_embedder", text_embedder)
rag_pipeline.add_component("retriever", retriever)
rag_pipeline.add_component("prompt_builder", prompt_builder)
rag_pipeline.add_component("llm", llm)
rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
rag_pipeline.connect("prompt_builder.prompt", "llm.messages")
question = "What generative endpoints does the Mistral platform have?"
messages = [ChatMessage.from_user(chat_template)]
result = rag_pipeline.run(
{
"text_embedder": {"text": question},
"prompt_builder": {"template": messages, "query": question},
"llm": {"generation_kwargs": {"max_tokens": 165}},
},
include_outputs_from=["text_embedder", "retriever", "llm"],
)
이 파이프라인은 질문을 임베딩해 인덱싱된 문서와 유사도 검색을 하고, 가장 관련 있는 문서를 컨텍스트로 채팅 템플릿에 넣어 Mistral mistral-small 모델이 답변하도록 해요.