Pesquisa conversacional com OCI Generative AI

Siga as etapas neste passo a passo para configurar e usar um pipeline completo de Geração Aumentada de Recuperação (RAG) no OCI Search com OpenSearch, usando um conector do OCI Generative AI.

Você pode aproveitar o conector para ter acesso a todos os recursos do serviço Generative AI, como Geração Aumentada de Recuperação (RAG), resumo de texto, geração de texto, pesquisa de conversação e pesquisa semântica.

As seguintes etapas necessárias para criar um conector de IA Generativa:

Além dessas etapas básicas, este tópico continua com as etapas necessárias para configurar e usar um pipeline completo de Geração Aumentada de Recuperação (RAG) no OCI Search com OpenSearch, usando um conector do OCI Generative AI. Cada etapa inclui um modelo genérico do código necessário. Você pode usar a Console para gerar automaticamente esse código com valores configurados para seu ambiente. Consulte Criando um pipeline de RAG para Pesquisa com OpenSearch.

O conector usa o modelo de incorporação Cohere hospedado pela IA generativa. A IA generativa também suporta o modelo Llma2 que você também pode experimentar.

Pré-requisitos

  • Para usar a OCI Generative AI, a tenancy deve estar inscrita na região Centro-Oeste dos EUA (Chicago) ou na região Central da Alemanha (Frankfurt). Não é necessário criar o cluster em nenhuma dessas regiões; certifique-se de que a tenancy esteja inscrita em uma das regiões.
  • Para usar um conector do OCI Generative AI com o OCI Search com o OpenSearch, você precisa de um cluster configurado para usar o OpenSearch versão 2.11. Por padrão, novos clusters são configurados para usar a versão 2.11. Para criar um cluster, consulte Criando um Cluster OpenSearch.

    Para clusters existentes configurados para a versão 2.3, você pode executar um upgrade em linha para a versão 2.11. Para obter mais informações, consulte OpenSearch Upgrade de Software do Cluster.

    Para fazer upgrade de clusters existentes configurados para a versão 1.2.3 para 2.11, use o processo de upgrade descrito em OpenSearch Upgrades de Software do Cluster.

  • Crie uma política para conceder acesso a recursos do serviço Generative AI. O exemplo de política a seguir inclui as permissões necessárias:
    ALLOW ANY-USER to manage generative-ai-family in tenancy WHERE ALL {request.principal.type='opensearchcluster', request.resource.compartment.id='<cluster_compartment_id>'}

    Se você não conhece as políticas, consulte Conceitos Básicos de Políticas e Políticas Comuns.

  • Use a operação settings das APIs do Cluster para configurar as definições de cluster recomendadas que permitem criar um conector. O exemplo a seguir inclui as configurações recomendadas:
    PUT _cluster/settings
    {
      "persistent": {
        "plugins": {
          "ml_commons": {
            "only_run_on_ml_node": "false",
            "model_access_control_enabled": "true",
            "native_memory_threshold": "99",
            "rag_pipeline_feature_enabled": "true",
            "memory_feature_enabled": "true",
            "allow_registering_model_via_local_file": "true",
            "allow_registering_model_via_url": "true",
            "model_auto_redeploy.enable":"true",
            "model_auto_redeploy.lifetime_retry_times": 10
          }
        }
      }
      }

Registrar o Grupo de Modelos

Registre um grupo de modelos usando a operação registrar nas APIs do Grupo de Modelos, conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/model_groups/_register
{
   "name": "public_model_group-emb",
   "description": "This is a public model group"
}

Anote o model_group_id retornado na resposta:

{
  "model_group_id": "<model_group_ID>",
  "status": "CREATED"
}

Criar o Conector

Você pode criar um conector para qualquer um dos modelos LLM remotos suportados pelo serviço GenAI. Existem vários modelos hospedados na ON-DEMAND, mas esses modelos às vezes ficam obsoletos. Se preferir, você pode configurar e usar um ponto final de modelo GENAI DEDICADO.

Observação

Se você estiver usando o modelo ON-DEMAND, mantenha-se atualizado com as notificações de descontinuação do modelo do serviço GenAI e atualize seu conector quando necessário para evitar possíveis interrupções de serviço. Consulte Modelos Básicos Pré-treinados no Serviço Generative AI para selecionar um Modelo de Linguagem Grande na lista de modelos suportados.

Se você estiver usando o modelo DEDICATED, altere o parâmetro servingType no exemplo de payload a seguir de ON-DEMAND para DEDICATED.

As seções a seguir mostram o modelo de carga útil para as classes de modelo Cohere e Llama.

Modelo de Conector GenAI para modelos Cohere.Command

Forneça as informações para os seguintes placeholders em sua carga útil:

  • <connector_name>: Informe um nome exclusivo para identificar seu conector. Por exemplo, "conector command-r-plus do cohere v01".
  • <connector_description>: Informe uma descrição curta para o seu conector com até 30 caracteres. Por exemplo, "Meu conector para modelo GenAI cohere.command-r-plus."
  • <compartment_OCID>: Informe o OCID do compartimento no qual reside o cluster OpenSearch.
  • <genai_cohere_model>: Informe o nome do modelo Cohere que você deseja usar. Por exemplo, "cohere.command-r-plus".
POST _plugins/_ml/connectors/_create
{
     "name": "<connector_name>",
     "description": "<connector_description>",
     "version": 2,
     "protocol": "oci_sigv1",
     "parameters": {
         "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
         "auth_type": "resource_principal"
     },
     "credential": {
     },
     "actions": [
         {
             "action_type": "predict",
             "method": "POST",
             "url": "https://${parameters.endpoint}/20231130/actions/chat",
             "request_body": "{\"compartmentId\":\"<compartment_OCID>\",\"servingMode\":{\"modelId\":\"<genai_cohere_model>\",\"servingType\":\"ON_DEMAND\"},\"chatRequest\":{\"message\":\"${parameters.prompt}\",\"maxTokens\":600,\"temperature\":1,\"frequencyPenalty\":0,\"presencePenalty\":0,\"topP\":0.75,\"topK\":0,\"isStream\":false,\"chatHistory\":[],\"apiFormat\":\"COHERE\"}}",
             "post_process_function": "def text = params['chatResponse']['text'].replace('\n', '\\\\n').replace('\"','');\n return '{\"name\":\"response\",\"dataAsMap\":{\"inferenceResponse\":{\"generatedTexts\":[{\"text\":\"' + text + '\"}]}}}'"
  
         }
     ]
 }

GenAI Modelo de Conector para modelos Meta LLAMA

Forneça as informações para os seguintes placeholders em sua carga útil:

  • <connector_name>: Informe um nome exclusivo para identificar seu conector. Por exemplo, "conector meta-llama v1".
  • <connector_description>: Informe uma descrição curta para o seu conector com até 30 caracteres. Por exemplo, "Meu conector para GenAI meta.llama."
  • <compartment_OCID>: Informe o OCID do compartimento no qual reside o cluster OpenSearch.
  • <genai_llama_model>: Informe o nome do modelo LLAMA que você deseja usar. Por exemplo, "conector meta-llama v1".
POST _plugins/_ml/connectors/_create
{
     "name": "<connector_name>",
     "description": "<connector_description>",
     "version": 2,
     "protocol": "oci_sigv1",
     "parameters": {
         "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
         "auth_type": "resource_principal"
     },
     "credential": {
     },
     "actions": [
         {
             "action_type": "predict",
             "method": "POST",
             "url": "https://${parameters.endpoint}/20231130/actions/chat",
             "request_body": "{\"compartmentId\":\<compartment_OCID>\",\"servingMode\":{\"modelId\":\"<genai_llama_model>\",\"servingType\":\"ON_DEMAND\"},\"chatRequest\":{\"maxTokens\":600,\"temperature\":1,\"frequencyPenalty\":0,\"presencePenalty\":0,\"topP\":0.75,\"topK\":-1,\"isStream\":false,\"apiFormat\":\"GENERIC\",\"messages\":[{\"role\":\"USER\",\"content\":[{\"type\":\"TEXT\",\"text\":\"${parameters.prompt}\"}]}]}}",
              
              "post_process_function": "def text = params['chatResponse']['choices'][0]['message']['content'][0]['text'].replace('\n', '\\\\n').replace('\"','');\n return '{\"name\":\"response\",\"dataAsMap\":{\"inferenceResponse\":{\"generatedTexts\":[{\"text\":\"' + text + '\"}]}}}'"
 
 
 
         }
     ]
 }

Modelos de Conector GenAI para Modelos OpenAI

Veja a seguir exemplos de modelos do conector GenAI para modelos OpenAI:

4o/4o-mini

POST _plugins/_ml/connectors/_create
{
     "name": "rag-connector",
     "description": "OpenAI connector for RAG pipeline",
     "version": 2,
     "protocol": "oci_sigv1",
     "parameters": {
         "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
         "auth_type": "resource_principal"
     },
     "credential": {
     },
     "actions": [
         {
             "action_type": "predict",
             "method": "POST",
             "url": "https://${parameters.endpoint}/20231130/actions/chat",
             "request_body": "{\"compartmentId\":\"<compartment_OCID>\",\"servingMode\":{\"modelId\":\"<MODEL NAME>\",\"servingType\":\"ON_DEMAND\"},\"chatRequest\":{\"maxCompletionTokens\":600,\"temperature\":0.5,\"frequencyPenalty\":0,\"presencePenalty\":0,\"topP\":1.0,\"isStream\":false,\"apiFormat\":\"GENERIC\",\"messages\":[{\"role\":\"USER\",\"content\":[{\"type\":\"TEXT\",\"text\":\"${parameters.prompt}\"}]}]}}",
              "post_process_function": "def text = params['chatResponse']['choices'][0]['message']['content'][0]['text'].replace('\n', '\\\\n').replace('\"','');\n return '{\"name\":\"response\",\"dataAsMap\":{\"inferenceResponse\":{\"generatedTexts\":[{\"text\":\"' + text + '\"}]}}}'"
         }
     ]
}

o3-mini/o1

POST _plugins/_ml/connectors/_create
{
     "name": "o3-mini-rag-connector",
     "description": "OpenAI o3-mini connector for RAG pipeline",
     "version": 2,
     "protocol": "oci_sigv1",
     "parameters": {
         "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
         "auth_type": "resource_principal"
     },
     "credential": {
     },
     "actions": [
         {
             "action_type": "predict",
             "method": "POST",
             "url": "https://${parameters.endpoint}/20231130/actions/chat",
             "request_body": "{\"compartmentId\":\"<compartment_OCID>\",\"servingMode\":{\"modelId\":\"<MODEL_NAME>\",\"servingType\":\"ON_DEMAND\"},\"chatRequest\":{\"isStream\":false,\"apiFormat\":\"GENERIC\",\"reasoningEffort\":\"LOW\",\"messages\":[{\"role\":\"USER\",\"content\":[{\"type\":\"TEXT\",\"text\":\"${parameters.prompt}\"}]}]}}",
              "post_process_function": "def text = params['chatResponse']['choices'][0]['message']['content'][0]['text'].replace('\n', '\\\\n').replace('\"','');\n return '{\"name\":\"response\",\"dataAsMap\":{\"inferenceResponse\":{\"generatedTexts\":[{\"text\":\"' + text + '\"}]}}}'"
         }
     ]
 } 

Registrar o Modelo

Registre o modelo remoto usando o conector de IA Generativa com o ID do conector e o ID do grupo de modelos das etapas anteriores, conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/models/_register
{
   "name": "oci-genai-embed-test",
   "function_name": "remote",
   "model_group_id": "<model_group_ID>",
   "description": "test semantic",
   "connector_id": "<connector_ID>"
}

Implantar o Modelo

Implante o modelo usando o ID do modelo retornado na resposta das etapas anteriores, conforme mostrado no seguinte exemplo:

POST /_plugins/_ml/models/<embedding_model_ID>/_deploy

Criar um Pipeline RAG

Crie um pipeline de RAG usando o model_id da etapa anterior, conforme mostrado no seguinte exemplo:

PUT /_search/pipeline/demo_rag_pipeline
{
  "response_processors": [
    {
      "retrieval_augmented_generation": {
        "tag": "genai_conversational_search_demo",
        "description": "Demo pipeline for conversational search Using Genai Connector",
        "model_id": "<llm_model_ID>",
        "conversation_id": "<conversation_ID>",
        "context_field_list": ["<text_field_name>"],
        "system_prompt":"hepfull assistant",
        "user_instructions":"generate concise answer"
      }
    }
  ]
}

Criar o Índice de Pesquisa

Depois que o pipeline de RAG for criado, você poderá executar RAG mais pesquisa de conversação em qualquer índice. Você também pode aproveitar um pipeline de ingestão de dados com um modelo pré-treinado para usar a pesquisa híbrida como parte da recuperação.

Criar o Índice de Pesquisa sem o plug-in k-NN

Esta seção descreve as etapas para criar um índice sem usar um pipeline de ingestão.

Use esta opção para criar dados sem incorporação,

  1. Crie um índice de pesquisa, como mostrado no exemplo a seguir:
    PUT /conversation-demo-index
    {
      "settings": {
        "index": {
          "number_of_shards": 1,
          "number_of_replicas": 0
        }
      },
      "mappings": {
        "properties": {
          "title": {
            "type": "text"
          },
          "text": {
            "type": "text"
          }
        }
      }
    }
  2. Faça a ingestão de dados no índice, conforme mostrado no seguinte exemplo:
    PUT /conversation-demo-index/_doc/1
    {
        "text": "The emergence of resistance of bacteria to antibiotics is a common phenomenon. Emergence of resistance often reflects evolutionary processes that take place during antibiotic therapy. The antibiotic treatment may select for bacterial strains with physiologically or genetically enhanced capacity to survive high doses of antibiotics. Under certain conditions, it may result in preferential growth of resistant bacteria, while growth of susceptible bacteria is inhibited by the drug. For example, antibacterial selection for strains having previously acquired antibacterial-resistance genes was demonstrated in 1943 by the Luria–Delbrück experiment. Antibiotics such as penicillin and erythromycin, which used to have a high efficacy against many bacterial species and strains, have become less effective, due to the increased resistance of many bacterial strains."
       
    }
    GET /conversation-demo-index/_doc/1
    PUT /conversation-demo-index/_doc/2
    {
      "text": "The successful outcome of antimicrobial therapy with antibacterial compounds depends on several factors. These include host defense mechanisms, the location of infection, and the pharmacokinetic and pharmacodynamic properties of the antibacterial. A bactericidal activity of antibacterials may depend on the bacterial growth phase, and it often requires ongoing metabolic activity and division of bacterial cells. These findings are based on laboratory studies, and in clinical settings have also been shown to eliminate bacterial infection. Since the activity of antibacterials depends frequently on its concentration, in vitro characterization of antibacterial activity commonly includes the determination of the minimum inhibitory concentration and minimum bactericidal concentration of an antibacterial. To predict clinical outcome, the antimicrobial activity of an antibacterial is usually combined with its pharmacokinetic profile, and several pharmacological parameters are used as markers of drug efficacy."
    }
     
    PUT /conversation-demo-index/_doc/3
    {
      "text": "Antibacterial antibiotics are commonly classified based on their mechanism of action, chemical structure, or spectrum of activity. Most target bacterial functions or growth processes. Those that target the bacterial cell wall (penicillins and cephalosporins) or the cell membrane (polymyxins), or interfere with essential bacterial enzymes (rifamycins, lipiarmycins, quinolones, and sulfonamides) have bactericidal activities. Those that target protein synthesis (macrolides, lincosamides and tetracyclines) are usually bacteriostatic (with the exception of bactericidal aminoglycosides). Further categorization is based on their target specificity. Narrow-spectrum antibacterial antibiotics target specific types of bacteria, such as Gram-negative or Gram-positive bacteria, whereas broad-spectrum antibiotics affect a wide range of bacteria. Following a 40-year hiatus in discovering new classes of antibacterial compounds, four new classes of antibacterial antibiotics have been brought into clinical use in the late 2000s and early 2010s: cyclic lipopeptides (such as daptomycin), glycylcyclines (such as tigecycline), oxazolidinones (such as linezolid), and lipiarmycins (such as fidaxomicin)"
    }
     
     
    PUT /conversation-demo-index/_doc/4
    {
      "text": "The Desert Land Act of 1877 was passed to allow settlement of arid lands in the west and allotted 640 acres (2.6 km2) to settlers for a fee of $.25 per acre and a promise to irrigate the land. After three years, a fee of one dollar per acre would be paid and the land would be owned by the settler. This act brought mostly cattle and sheep ranchers into Montana, many of whom grazed their herds on the Montana prairie for three years, did little to irrigate the land and then abandoned it without paying the final fees. Some farmers came with the arrival of the Great Northern and Northern Pacific Railroads throughout the 1880s and 1890s, though in relatively small numbers"
    }
     
    PUT /conversation-demo-index/_doc/5
    {
      "text": "In the early 1900s, James J. Hill of the Great Northern began promoting settlement in the Montana prairie to fill his trains with settlers and goods. Other railroads followed suit. In 1902, the Reclamation Act was passed, allowing irrigation projects to be built in Montana's eastern river valleys. In 1909, Congress passed the Enlarged Homestead Act that expanded the amount of free land from 160 to 320 acres (0.6 to 1.3 km2) per family and in 1912 reduced the time to prove up on a claim to three years. In 1916, the Stock-Raising Homestead Act allowed homesteads of 640 acres in areas unsuitable for irrigation.  This combination of advertising and changes in the Homestead Act drew tens of thousands of homesteaders, lured by free land, with World War I bringing particularly high wheat prices. In addition, Montana was going through a temporary period of higher-than-average precipitation. Homesteaders arriving in this period were known as Honyockers, or scissorbills. Though the word honyocker, possibly derived from the ethnic slur hunyak, was applied in a derisive manner at homesteaders as being greenhorns, new at his business or unprepared, the reality was that a majority of these new settlers had previous farming experience, though there were also many who did not"
    }
     
    PUT /conversation-demo-index/_doc/6
    {
      "text": "In June 1917, the U.S. Congress passed the Espionage Act of 1917 which was later extended by the Sedition Act of 1918, enacted in May 1918. In February 1918, the Montana legislature had passed the Montana Sedition Act, which was a model for the federal version. In combination, these laws criminalized criticism of the U.S. government, military, or symbols through speech or other means. The Montana Act led to the arrest of over 200 individuals and the conviction of 78, mostly of German or Austrian descent. Over 40 spent time in prison. In May 2006, then-Governor Brian Schweitzer posthumously issued full pardons for all those convicted of violating the Montana Sedition Act."
    }
     
    PUT /conversation-demo-index/_doc/7
    {
      "text": "When the U.S. entered World War II on December 8, 1941, many Montanans already had enlisted in the military to escape the poor national economy of the previous decade. Another 40,000-plus Montanans entered the armed forces in the first year following the declaration of war, and over 57,000 joined up before the war ended. These numbers constituted about 10 percent of the state's total population, and Montana again contributed one of the highest numbers of soldiers per capita of any state. Many Native Americans were among those who served, including soldiers from the Crow Nation who became Code Talkers. At least 1500 Montanans died in the war. Montana also was the training ground for the First Special Service Force or Devil's Brigade a joint U.S-Canadian commando-style force that trained at Fort William Henry Harrison for experience in mountainous and winter conditions before deployment. Air bases were built in Great Falls, Lewistown, Cut Bank and Glasgow, some of which were used as staging areas to prepare planes to be sent to allied forces in the Soviet Union. During the war, about 30 Japanese balloon bombs were documented to have landed in Montana, though no casualties nor major forest fires were attributed to them"
    }

Como este procedimento não usa um pipeline de ingestão com este índice, as incorporações não são geradas para documentos de texto durante a ingestão. Isto significa que apenas a pesquisa BM25 é usada para recuperar documentos relevantes.

Depois de criar um índice de pesquisa sem o plugin k-NN, quando você executa o seguinte comando para verificar um documento indexado, apenas o texto é retornado, da seguinte forma:

Solicitação:

GET /conversation-demo-index/_doc/1

Resposta :

{
  "_index": "conversation-demo-index",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "text": "The emergence of resistance of bacteria to antibiotics is a common phenomenon. Emergence of resistance often reflects evolutionary processes that take place during antibiotic therapy. The antibiotic treatment may select for bacterial strains with physiologically or genetically enhanced capacity to survive high doses of antibiotics. Under certain conditions, it may result in preferential growth of resistant bacteria, while growth of susceptible bacteria is inhibited by the drug. For example, antibacterial selection for strains having previously acquired antibacterial-resistance genes was demonstrated in 1943 by the Luria–Delbrück experiment. Antibiotics such as penicillin and erythromycin, which used to have a high efficacy against many bacterial species and strains, have become less effective, due to the increased resistance of many bacterial strains."
  }
}

Criar o Índice de Pesquisa com o Plug-in k-NN

Para aproveitar a pesquisa híbrida em vez de BM25 para enriquecer a parte do recuperador do pipeline de RAG, configure um pipeline de ingestão e use um modelo pré-treinado importado para que as incorporações de documentos sejam criadas no momento da ingestão.

Use esta opção para criar o índice com um pipeline de ingestão para gerar automaticamente a incorporação dos dados durante a ingestão.

  1. Para efeitos deste passo a passo, use uma das seguintes opções:
    • Opção 1: Registre e implante um modelo pré-treinado hospedado no OCI Search com OpenSearch usando as etapas descritas em Usando um Modelo Pré-treinado OpenSearch. Esta opção é a mais simples de usar, você não precisa configurar nenhuma política adicional do IAM e o payload não é tão complexo quanto o payload da próxima opção.

    • Opção 2: Importe, registre e implante um modelo pré-treinado OpenSearch usando as etapas descritas em Modelos Personalizados. Isso inclui fazer upload do arquivo de modelo para um bucket do serviço Object Storage e, em seguida, especificar o URL do serviço Object Storage do arquivo de modelo quando você registra o modelo.

    • Opção 3: Você também pode registrar e implantar um modelo de incorporação GenAI remoto, como o cohere.embed-english-v3.0, no seu cluster usando nosso Conector GenAI. Você deve criar um conector primeiro e, em seguida, registrar e implantar o modelo usando o ID do conector, conforme descrito nas etapas a seguir.

      Observação

      Se você estiver usando o modelo ON-DEMAND, mantenha-se atualizado com as notificações de descontinuação do modelo do serviço GenAI e atualize seu conector quando necessário para evitar possíveis interrupções de serviço. Consulte Modelos Básicos Pré-treinados no Serviço Generative AI para obter os modelos de incorporação suportados e selecionar um modelo de incorporação na lista de modelos suportados.

      Se você estiver usando o modelo DEDICATED, altere o parâmetro servingType no exemplo de payload a seguir de ON-DEMAND para DEDICATED.

    Anote o ID do modelo retornado quando você registrar e implantar o modelo.

  2. Crie um pipeline de ingestão usando o model id da etapa anterior, conforme mostrado no seguinte exemplo:
    PUT _ingest/pipeline/minil12-test-pipeline
    {
      "description": "pipeline for RAG demo index",
      "processors" : [
        {
          "text_embedding": {
            "model_id": "<embedding_model_ID>",
            "field_map": {
               "text": "passage_embedding"
            }
          }
        }
      ]
    }
  3. Crie um índice de pesquisa com um pipeline de ingestão, conforme mostrado no seguinte exemplo:
    PUT /conversation-demo-index-knn
    {
        "settings": {
            "index.knn": true,
            "default_pipeline": "minil12-test-pipeline"
        },
        "mappings": {
            "properties": {
                "passage_embedding": {
                    "type": "knn_vector",
                    "dimension": <model_dimension>,
                    "method": {
                        "name":"hnsw",
                        "engine":"lucene",
                        "space_type": "l2",
                        "parameters":{
                            "m":512,
                            "ef_construction": 245
                        }
                    }
                },
                "text": {
                    "type": "text"
                }
            }
        }
    }
  4. Ingerir os dados usando o pipeline de ingestão da etapa anterior, conforme mostrado no exemplo a seguir

    PUT /conversation-demo-index-knn/_doc/1
    {
        "text": "The emergence of resistance of bacteria to antibiotics is a common phenomenon. Emergence of resistance often reflects evolutionary processes that take place during antibiotic therapy. The antibiotic treatment may select for bacterial strains with physiologically or genetically enhanced capacity to survive high doses of antibiotics. Under certain conditions, it may result in preferential growth of resistant bacteria, while growth of susceptible bacteria is inhibited by the drug. For example, antibacterial selection for strains having previously acquired antibacterial-resistance genes was demonstrated in 1943 by the Luria–Delbrück experiment. Antibiotics such as penicillin and erythromycin, which used to have a high efficacy against many bacterial species and strains, have become less effective, due to the increased resistance of many bacterial strains."
       
    }
    GET /conversation-demo-index-knn/_doc/1
    PUT /conversation-demo-index-knn/_doc/2
    {
      "text": "The successful outcome of antimicrobial therapy with antibacterial compounds depends on several factors. These include host defense mechanisms, the location of infection, and the pharmacokinetic and pharmacodynamic properties of the antibacterial. A bactericidal activity of antibacterials may depend on the bacterial growth phase, and it often requires ongoing metabolic activity and division of bacterial cells. These findings are based on laboratory studies, and in clinical settings have also been shown to eliminate bacterial infection. Since the activity of antibacterials depends frequently on its concentration, in vitro characterization of antibacterial activity commonly includes the determination of the minimum inhibitory concentration and minimum bactericidal concentration of an antibacterial. To predict clinical outcome, the antimicrobial activity of an antibacterial is usually combined with its pharmacokinetic profile, and several pharmacological parameters are used as markers of drug efficacy."
    }
     
    PUT /conversation-demo-index-knn/_doc/3
    {
      "text": "Antibacterial antibiotics are commonly classified based on their mechanism of action, chemical structure, or spectrum of activity. Most target bacterial functions or growth processes. Those that target the bacterial cell wall (penicillins and cephalosporins) or the cell membrane (polymyxins), or interfere with essential bacterial enzymes (rifamycins, lipiarmycins, quinolones, and sulfonamides) have bactericidal activities. Those that target protein synthesis (macrolides, lincosamides and tetracyclines) are usually bacteriostatic (with the exception of bactericidal aminoglycosides). Further categorization is based on their target specificity. Narrow-spectrum antibacterial antibiotics target specific types of bacteria, such as Gram-negative or Gram-positive bacteria, whereas broad-spectrum antibiotics affect a wide range of bacteria. Following a 40-year hiatus in discovering new classes of antibacterial compounds, four new classes of antibacterial antibiotics have been brought into clinical use in the late 2000s and early 2010s: cyclic lipopeptides (such as daptomycin), glycylcyclines (such as tigecycline), oxazolidinones (such as linezolid), and lipiarmycins (such as fidaxomicin)"
    }
     
     
    PUT /conversation-demo-index-knn/_doc/4
    {
      "text": "The Desert Land Act of 1877 was passed to allow settlement of arid lands in the west and allotted 640 acres (2.6 km2) to settlers for a fee of $.25 per acre and a promise to irrigate the land. After three years, a fee of one dollar per acre would be paid and the land would be owned by the settler. This act brought mostly cattle and sheep ranchers into Montana, many of whom grazed their herds on the Montana prairie for three years, did little to irrigate the land and then abandoned it without paying the final fees. Some farmers came with the arrival of the Great Northern and Northern Pacific Railroads throughout the 1880s and 1890s, though in relatively small numbers"
    }
     
    PUT /conversation-demo-index-knn/_doc/5
    {
      "text": "In the early 1900s, James J. Hill of the Great Northern began promoting settlement in the Montana prairie to fill his trains with settlers and goods. Other railroads followed suit. In 1902, the Reclamation Act was passed, allowing irrigation projects to be built in Montana's eastern river valleys. In 1909, Congress passed the Enlarged Homestead Act that expanded the amount of free land from 160 to 320 acres (0.6 to 1.3 km2) per family and in 1912 reduced the time to prove up on a claim to three years. In 1916, the Stock-Raising Homestead Act allowed homesteads of 640 acres in areas unsuitable for irrigation.  This combination of advertising and changes in the Homestead Act drew tens of thousands of homesteaders, lured by free land, with World War I bringing particularly high wheat prices. In addition, Montana was going through a temporary period of higher-than-average precipitation. Homesteaders arriving in this period were known as Honyockers, or scissorbills. Though the word honyocker, possibly derived from the ethnic slur hunyak, was applied in a derisive manner at homesteaders as being greenhorns, new at his business or unprepared, the reality was that a majority of these new settlers had previous farming experience, though there were also many who did not"
    }
     
    PUT /conversation-demo-index-knn/_doc/6
    {
      "text": "In June 1917, the U.S. Congress passed the Espionage Act of 1917 which was later extended by the Sedition Act of 1918, enacted in May 1918. In February 1918, the Montana legislature had passed the Montana Sedition Act, which was a model for the federal version. In combination, these laws criminalized criticism of the U.S. government, military, or symbols through speech or other means. The Montana Act led to the arrest of over 200 individuals and the conviction of 78, mostly of German or Austrian descent. Over 40 spent time in prison. In May 2006, then-Governor Brian Schweitzer posthumously issued full pardons for all those convicted of violating the Montana Sedition Act."
    }
     
    PUT /conversation-demo-index-knn/_doc/7
    {
      "text": "When the U.S. entered World War II on December 8, 1941, many Montanans already had enlisted in the military to escape the poor national economy of the previous decade. Another 40,000-plus Montanans entered the armed forces in the first year following the declaration of war, and over 57,000 joined up before the war ended. These numbers constituted about 10 percent of the state's total population, and Montana again contributed one of the highest numbers of soldiers per capita of any state. Many Native Americans were among those who served, including soldiers from the Crow Nation who became Code Talkers. At least 1500 Montanans died in the war. Montana also was the training ground for the First Special Service Force or Devil's Brigade a joint U.S-Canadian commando-style force that trained at Fort William Henry Harrison for experience in mountainous and winter conditions before deployment. Air bases were built in Great Falls, Lewistown, Cut Bank and Glasgow, some of which were used as staging areas to prepare planes to be sent to allied forces in the Soviet Union. During the war, about 30 Japanese balloon bombs were documented to have landed in Montana, though no casualties nor major forest fires were attributed to them"
    }

Depois de criar o índice de pesquisa com o plug-in k-NN, quando você executa o seguinte comando para verificar um documento indexado, a resposta inclui incorporações, da seguinte forma:

Solicitação:

GET /conversation-demo-index-knn/_doc/1

Resposta :

{
  "_index": "conversation-demo-index-knn",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "passage_embedding": [
      -0.02929831,
      -0.04421867,
      -0.10647401,
      0.07105031,
      0.004921746,
      -0.04529944,
      -0.092778176,
      0.14189903,
      -0.0016610072,
      0.08001712,
      0.053442925,
      -0.022703059,
      0.039608333,
      0.042299673,
      ..............

Criar ID da Conversa

Execute este comando para criar o ID da conversa:

POST /_plugins/_ml/memory/conversation
{
  "name": "rag-conversation"
}

Resposta :

{
  "conversation_id": "<conversation_ID>"
}

Executar RAG com BM25

Depois que os documentos forem indexados, você poderá executar o RAG usando o nome do pipeline de RAG especificado em Criar um Pipeline de RAG, conforme mostrado no exemplo a seguir.

Se você estiver usando um conector do serviço Data Science, precisará alterar o valor "llm_model" para "oci_datascience/<your_llm_model_name>".

GET /conversation-demo-index/_search?search_pipeline=<pipeline_name>
{
    "query": {
        "match": {
            "text": {
                "query": "when did us pass espionage act?"
            }
        }
    },
    "ext": {
        "generative_qa_parameters": {
            "llm_model": "oci_genai/<your_llm_model_name>",
            "llm_question": "when did us pass espionage act? answer only in two sentences using provided context.",
            "conversation_id": "<conversation_ID>",
            "context_size": 2,
            "interaction_size": 1,
            "timeout": 15
        }
    }
}

A primeira parte é a recuperação com a consulta para o índice para encontrar os documentos mais relevantes com base na consulta do usuário. A segunda parte aumenta a consulta do usuário com mais instruções e, em seguida, usa a resposta da parte de recuperação como contexto. Em seguida, todos eles são passados para o modelo de linguagem grande para gerar a resposta usando apenas o conhecimento nos dados do caso de uso.

Especifique o nome do modelo que você usou no payload em Criar o Conector para <your_llm_model_name>. Estes são exemplos de nomes de modelo:

  • oci_genai/cohere.command-r-plus-08-2024
  • oci_genai/cohere.command-08-2024
  • oci_genai/meta.llama-3.1-70b-instruct
  • oci_genai/meta.llama-3.2-90b-vision-instruct

Na resposta a seguir, a primeira parte é um conjunto de documentos retornados pelo recuperador (o mecanismo de pesquisa em OpenSearch). Isso é seguido pela grande resposta do modelo de linguagem (LLM), que é a resposta real do modelo de LLM usando geração de texto e aprendizado contextual para aumentar a base de conhecimento do LLM. O mecanismo de pesquisa usado aqui é BM25 porque o índice conversation-demo-index não usa um modelo implantado para gerar incorporações de documentos durante a ingestão.

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": 3.6364775,
    "hits": [
      {
        "_index": "conversation-demo-index",
        "_id": "6",
        "_score": 3.6364775,
        "_source": {
          "text": "In June 1917, the U.S. Congress passed the Espionage Act of 1917 which was later extended by the Sedition Act of 1918, enacted in May 1918. In February 1918, the Montana legislature had passed the Montana Sedition Act, which was a model for the federal version. In combination, these laws criminalized criticism of the U.S. government, military, or symbols through speech or other means. The Montana Act led to the arrest of over 200 individuals and the conviction of 78, mostly of German or Austrian descent. Over 40 spent time in prison. In May 2006, then-Governor Brian Schweitzer posthumously issued full pardons for all those convicted of violating the Montana Sedition Act."
        }
      },
      {
        "_index": "conversation-demo-index",
        "_id": "4",
        "_score": 2.675274,
        "_source": {
          "text": "The Desert Land Act of 1877 was passed to allow settlement of arid lands in the west and allotted 640 acres (2.6 km2) to settlers for a fee of $.25 per acre and a promise to irrigate the land. After three years, a fee of one dollar per acre would be paid and the land would be owned by the settler. This act brought mostly cattle and sheep ranchers into Montana, many of whom grazed their herds on the Montana prairie for three years, did little to irrigate the land and then abandoned it without paying the final fees. Some farmers came with the arrival of the Great Northern and Northern Pacific Railroads throughout the 1880s and 1890s, though in relatively small numbers"
        }
      },
      {
        "_index": "conversation-demo-index",
        "_id": "5",
        "_score": 2.5380564,
        "_source": {
          "text": "In the early 1900s, James J. Hill of the Great Northern began promoting settlement in the Montana prairie to fill his trains with settlers and goods. Other railroads followed suit. In 1902, the Reclamation Act was passed, allowing irrigation projects to be built in Montana's eastern river valleys. In 1909, Congress passed the Enlarged Homestead Act that expanded the amount of free land from 160 to 320 acres (0.6 to 1.3 km2) per family and in 1912 reduced the time to prove up on a claim to three years. In 1916, the Stock-Raising Homestead Act allowed homesteads of 640 acres in areas unsuitable for irrigation.  This combination of advertising and changes in the Homestead Act drew tens of thousands of homesteaders, lured by free land, with World War I bringing particularly high wheat prices. In addition, Montana was going through a temporary period of higher-than-average precipitation. Homesteaders arriving in this period were known as Honyockers, or scissorbills. Though the word honyocker, possibly derived from the ethnic slur hunyak, was applied in a derisive manner at homesteaders as being greenhorns, new at his business or unprepared, the reality was that a majority of these new settlers had previous farming experience, though there were also many who did not"
        }
      },
      {
        "_index": "conversation-demo-index",
        "_id": "7",
        "_score": 1.4905708,
        "_source": {
          "text": "When the U.S. entered World War II on December 8, 1941, many Montanans already had enlisted in the military to escape the poor national economy of the previous decade. Another 40,000-plus Montanans entered the armed forces in the first year following the declaration of war, and over 57,000 joined up before the war ended. These numbers constituted about 10 percent of the state's total population, and Montana again contributed one of the highest numbers of soldiers per capita of any state. Many Native Americans were among those who served, including soldiers from the Crow Nation who became Code Talkers. At least 1500 Montanans died in the war. Montana also was the training ground for the First Special Service Force or Devil's Brigade a joint U.S-Canadian commando-style force that trained at Fort William Henry Harrison for experience in mountainous and winter conditions before deployment. Air bases were built in Great Falls, Lewistown, Cut Bank and Glasgow, some of which were used as staging areas to prepare planes to be sent to allied forces in the Soviet Union. During the war, about 30 Japanese balloon bombs were documented to have landed in Montana, though no casualties nor major forest fires were attributed to them"
        }
      }
    ]
  },
  "ext": {
    "retrieval_augmented_generation": {
      "answer": " Through the Espionage Act of 1917 and the Sedition Act of 1918, passed in May of 1918, the U.S. Congress outlawed criticism of the military, government, or symbols through speech or other means. The Montana Sedition Act was enacted in February 1918, serving as a model for the federal version, and resulting in the arrest of over 200 people, chiefly of German or Austrian descent, with over 40 imprisoned. "
    }
  }
}