|
import os |
|
from typing import Optional |
|
from pydantic import Field, BaseModel |
|
from omegaconf import OmegaConf |
|
|
|
from llama_index.core.utilities.sql_wrapper import SQLDatabase |
|
from sqlalchemy import create_engine |
|
|
|
from dotenv import load_dotenv |
|
load_dotenv(override=True) |
|
|
|
from vectara_agentic.agent import Agent |
|
from vectara_agentic.tools import ToolsFactory, VectaraToolFactory |
|
|
|
def create_assistant_tools(cfg): |
|
|
|
class QueryCFPBComplaints(BaseModel): |
|
query: str = Field(description="The user query.") |
|
|
|
vec_factory = VectaraToolFactory( |
|
vectara_api_key=cfg.api_keys, |
|
vectara_customer_id=cfg.customer_id, |
|
vectara_corpus_id=cfg.corpus_ids |
|
) |
|
|
|
summarizer = 'vectara-experimental-summary-ext-2023-12-11-med-omni' |
|
ask_complaints = vec_factory.create_rag_tool( |
|
tool_name = "ask_complaints", |
|
tool_description = """ |
|
Given a user query, |
|
returns a response to a user question about customer complaints for bank services. |
|
""", |
|
tool_args_schema = QueryCFPBComplaints, |
|
reranker = "multilingual_reranker_v1", rerank_k = 100, |
|
n_sentences_before = 1, n_sentences_after = 1, lambda_val = 0.005, |
|
summary_num_results = 30, |
|
mmr_diversity_bias = 0.4, |
|
vectara_summarizer = summarizer, |
|
include_citations = True, |
|
) |
|
|
|
tools_factory = ToolsFactory() |
|
|
|
db_tools = tools_factory.database_tools( |
|
tool_name_prefix = "cfpb", |
|
content_description = 'Customer complaints about five banks (Bank of America, Wells Fargo, Capital One, Chase, and CITI Bank)', |
|
sql_database = SQLDatabase(create_engine('sqlite:///cfpb_database.db')), |
|
) |
|
|
|
return (tools_factory.standard_tools() + |
|
tools_factory.guardrail_tools() + |
|
db_tools + |
|
[ask_complaints] |
|
) |
|
|
|
def initialize_agent(_cfg, update_func=None): |
|
cfpb_complaints_bot_instructions = """ |
|
- You are a helpful research assistant, |
|
with expertise in finance and complaints from the CFPB (Consumer Financial Protection Bureau), |
|
in conversation with a user. |
|
- For a query with multiple sub-questions, break down the query into the sub-questions, |
|
and make separate calls to the ask_complaints tool to answer each sub-question, |
|
then combine the answers to provide a complete response. |
|
- For analytical/numeric questions, try to use the cfpb_load_data and other database tools. |
|
- Never discuss politics, and always respond politely. |
|
""" |
|
|
|
agent = Agent( |
|
tools=create_assistant_tools(_cfg), |
|
topic="Customer complaints from the Consumer Financial Protection Bureau (CFPB)", |
|
custom_instructions=cfpb_complaints_bot_instructions, |
|
update_func=update_func |
|
) |
|
agent.report() |
|
return agent |
|
|
|
|
|
def get_agent_config() -> OmegaConf: |
|
cfg = OmegaConf.create({ |
|
'customer_id': str(os.environ['VECTARA_CUSTOMER_ID']), |
|
'corpus_ids': str(os.environ['VECTARA_CORPUS_IDS']), |
|
'api_keys': str(os.environ['VECTARA_API_KEYS']), |
|
'examples': os.environ.get('QUERY_EXAMPLES', None), |
|
'demo_name': "cfpb-assistant", |
|
'demo_welcome': "Welcome to the CFPB Customer Complaints demo.", |
|
'demo_description': "This assistant can help you gain insights into customer complaints to banks recorded by the Consumer Financial Protection Bureau.", |
|
}) |
|
return cfg |
|
|