dsmultimedika's picture
fix : update code
0767396
from typing import List
from llama_index.core.vector_stores import (
MetadataFilter,
MetadataFilters,
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.agent.openai import OpenAIAgent
from llama_index.llms.openai import OpenAI
from llama_index.core.query_engine import CitationQueryEngine
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.multi_modal_llms.openai import OpenAIMultiModal
from llama_index.core import Settings
from core.chat.chatstore import ChatStore
from core.multimodal import MultimodalQueryEngine
from config import GPTBOT_CONFIG
from core.prompt import SYSTEM_BOT_TEMPLATE, ADDITIONAL_INFORMATIONS,SYSTEM_BOT_GENERAL_TEMPLATE, SYSTEM_BOT_IMAGE_TEMPLATE
from core.parser import join_list
class Engine:
def __init__(self):
self.llm = OpenAI(
temperature=GPTBOT_CONFIG.temperature,
model=GPTBOT_CONFIG.model,
max_tokens=GPTBOT_CONFIG.max_tokens,
api_key=GPTBOT_CONFIG.api_key,
)
self.chat_store = ChatStore()
Settings.llm = self.llm
embed_model = OpenAIEmbedding(model="text-embedding-3-large")
Settings.embed_model = embed_model
def get_citation_engine(self, titles:List, index):
model_multimodal = OpenAIMultiModal(model="gpt-4o-mini", max_new_tokens=4096)
filters = [
MetadataFilter(
key="title",
value=title,
operator="==",
)
for title in titles
]
filters = MetadataFilters(filters=filters, condition="or")
# Create the QueryEngineTool with the index and filters
kwargs = {"similarity_top_k": 10, "filters": filters}
retriever = index.as_retriever(**kwargs)
# citation_engine = CitationQueryEngine(retriever=retriever)
# return CitationQueryEngine.from_args(index, retriever=retriever)
return MultimodalQueryEngine(retriever=retriever, multi_modal_llm=model_multimodal)
def get_chat_engine(self, session_id, index, titles=None, type_bot="general"):
# Create the QueryEngineTool based on the type
if type_bot == "general":
# query_engine = index.as_query_engine(similarity_top_k=3)
# citation_engine = CitationQueryEngine.from_args(index, similarity_top_k=5)
model_multimodal = OpenAIMultiModal(model="gpt-4o-mini", max_new_tokens=4096)
retriever = index.as_retriever(similarity_top_k=10)
citation_engine = MultimodalQueryEngine(retriever=retriever, multi_modal_llm=model_multimodal)
# description = "A book containing information about medicine"
else:
citation_engine = self.get_citation_engine(titles, index)
# description = "A book containing information about medicine"
# metadata = ToolMetadata(name="bot-belajar", description=description)
# vector_query_engine = QueryEngineTool(
# query_engine=citation_engine, metadata=metadata
# )
vector_tool = QueryEngineTool.from_defaults(
query_engine=citation_engine,
name="vector_tool",
description=(
"Useful for retrieving specific context from the data from a book containing information about medicine"
),
)
# Initialize the OpenAI agent with the tools
# if type_bot == "general":
# system_prompt = SYSTEM_BOT_GENERAL_TEMPLATE
# else:
# additional_information = ADDITIONAL_INFORMATIONS.format(titles=join_list(titles))
# system_prompt = SYSTEM_BOT_TEMPLATE.format(additional_information=additional_information)
# chat_engine = OpenAIAgent.from_tools(
# tools=[vector_query_engine],
# llm=self.llm,
# memory=self.chat_store.initialize_memory_bot(session_id),
# system_prompt=system_prompt,
# )
if type_bot == "general":
system_prompt = SYSTEM_BOT_IMAGE_TEMPLATE
else:
additional_information = ADDITIONAL_INFORMATIONS.format(titles=join_list(titles))
system_prompt = SYSTEM_BOT_IMAGE_TEMPLATE.format(additional_information=additional_information)
chat_engine = OpenAIAgent.from_tools(
tools=[vector_tool],
llm=self.llm,
memory=self.chat_store.initialize_memory_bot(session_id),
system_prompt=system_prompt,
)
return chat_engine