Construindo um correspondente estrangeiro com MongoDB, laudo do Aconnection, Python
Avalie esse Artigo
No final de 2024, parece que a corrida de modelos de linguagem grandes (LLMs) ainda é um dos tópicos mais interessantes ao redor. Enquanto pequenas e grandes empresas estão encontrando cada vez mais maneiras de integrar essas poderosas redes generativas em seu próprio sistema, neste artigo, exploraremos um cenário em que um dos melhores (e mais semelhantes aos humanos) LLMs - a família Class da Athropic - é usado para criar breves resumos de notícias em inglês (ou qualquer outro idioma) a partir de uma lista de artigos de notícias Sérvios.
De acordo com a Wikipedia, o idioma Sérvio (a linguagem nativa do autor) está atualmente localizado em torno do 30terceiro lugar, com aproximadamente.0 1% de sites on-line. Simplificando, isso é muito pequeno 50em comparação com o inglês (aproximadamente 4 5):
Neste artigo, vamos acreditar que estamos criando um simples aplicação da web com o objetivo de ajudar nosso amigo (virtual): um correspondente estrangeiro localizado em um país cuja linguagem é (ainda) um deleite desconhecido para ele.
O fluxo de dados será simplificado: começaremos com um arquivo CSV simples contendo os artigos. Os artigos, potencialmente originados de diferentes fontes de notícias, têm uma estrutura mínima: um título, um corpo de conteúdo e uma data. Eles estão em serviço. O princípio é simples: os artigos são curtos o suficiente para não serem divisão e agrupados. Cada artigo terá seu próprio vetor de incorporação e será armazenado em uma coleção MongoDB .
As incorporações que usaremos - Embedic - são criadas especificamente para o idioma Sérvio.
Conforme indicado:
Novak Givanic fez uma contribuição significativa para o campo do processamento de linguagem natural com o lançamento do Embedi?, um conjunto de modelos de incorporação de texto em Sérvio. Esses modelos são projetados especificamente para tarefas de recuperação de informações e geração aumentada de recuperação (RAG).
Os modelos de incorporação são fundamentais ao trabalhar com o significado de palavras, frases e texto em geral. Matematicamente, as incorporações são bastante simples. Elas representam dados de alta dimensionamento (em nosso caso, texto, mas podem ser imagens, áudios ou outras estruturas de dados significativas) em um espaço vetorial de dimensionamento inferior, mas mais denso, enquanto preserva relações semânticas. Há uma ótima introdução à incorporação de vetores e eu a recomendamos se você quiser aprender todo o conceito. Alguns fornecedores de modelos LLM, como a OpenAI, geram incorporações vetoriais, enquanto outros, como a Athropic, não.
Como queremos usar incorporações específicas - apropriadamente chamadas de Embedi?- usaremos o Transformador de frases HuggingFace, uma biblioteca que ajuda a converter texto em vetores numéricos com significado semântica. Os transformadores de frases se destacam nas tarefas de que precisamos: encontrar frases semelhantes, pesquisa semântica e cluster de texto. Os transformação de frases fornecem uma variedade de modelos atualizados ou lançados com frequência, eles são gratuitos para usar — não há custos de API envolvidos — e podem ser ajustados. Eles podem não fornecer desempenho de última geração, como OpenAI ou Voyage.
Depois que os artigos forem "traduzidos" em seu formato universalmente legível (vetorizado), nós os salvaremos em uma collection do MongoDB no Atlas cluster e criaremos um índice vetorial. O índice vetorial do MongoDB permite uma pesquisa vetorial rápida e eficiente e está [documentado] (https://www.mongodb.com/pt-br/docs/atlas/atlas-vector-search/vector-search-overview/).
Finalmente, com o índice vetorial em vigor e após o MongoDB Atlas concluir o processo de indexação, o banco de banco de dados MongoDB está pronto para se tornar a base de nosso sistema correspondente. Digite Class, uma das família LLM de melhor desempenho, fornecida pela Aconnection. Embora você possa alternar facilmente essa configuração com o OpenAI ou algum modelo fornecido pelo GROQ, usaremos o modelo Athropic Class Opus, que funciona particularmente bem com texto sincronizado e resumo.
Para gerar o texto final, implementaremos uma versão simples da metodologia RAG, muito semelhante à descrita no ótimo livro Construindo aplicativos Python com uso intensivo de IA. Simplificando, geração aumentada de recuperação, ou RAG, é uma abordagem na qual um número de documentos (ou partes de um documento) que são semelhantes (matematicamente falando, próximos em um espaço vetorial) à query (também um vetor!), são retornou de um banco de dados de dados e depois passou para o modelo com um conjunto de instruções, a fim de obter uma resposta combinada que contenha (esperamos) todos os dados relevantes dos documentos recuperados.
Depois que um pipeline do MongoDB recupera os artigos de notícias relevantes (e aqui, estamos realmente apenas raspando a superfície da flexibilidade e escalabilidade do MongoDB), as peças são unidas por Classe por meio de um prompt. Novamente, essas etapas podem ser otimizadas de várias maneiras diferentes, mas esse não é o tópico deste artigo. O processo de recuperação pode ser melhorado por meio de uma reclassificação (embora, nesse caso, quando cada artigo é tratado como uma unidade e recebe uma única incorporação, isso não é tão importante). A query de recuperação pode criar "topics" ou "stories" e fazer referências a eles mantendo uma consistência lógica e cronológica e assim por diante. O tamanho do contexto dos modelos LLM mais recentes aumentou e nos permite implementar várias abordagens para esse tipo de projeto, mas nos limitaremos a uma solução simples e ilustrativa.
Este projeto está organizado como um bloco de notas Jupyter e está disponível no Github. O repositório também contém o arquivo CSV contendo as notícias usadas no tutorial, bem como o arquivo derequisitos com os pacotes necessários.
Para executar este projeto, precisaremos instalar algumas dependências. Se você deseja reproduzir o bloco de anotações Jupyter, crie um novo diretório (o meu se chama Correspondente) e, dentro dele, crie um novo ambiente virtual com o comando:
1 python -m venv venv
Ative o ambiente virtual e crie um arquivorequires.txt:
1 anthropic==0.38.0 2 ipykernel==6.29.5 3 ipython==8.28.0 4 pandas==2.2.3 5 pymongo==4.10.1 6 python-dotenv==1.0.1 7 scikit-learn==1.5.2 8 tqdm==4.66.5 9 transformers==4.46.0
As versões dos pacotes mudam com o tempo. Para garantir a reprodução exata deste bloco de notas, devem ser usadas versões específicas. No momento em que você estiver lendo este artigo, é muito provável que alguns desses pacotes tenham versões mais recentes. Observe, no entanto, que o pacote SciKit-Saiba mais é opcional (e bastante pesado), portanto, se você não quiser jogar com algoritmos clássicos de aprendizado de máquina, pode ignorá-lo.
Embora a instalação do driver PyMongo e do pacote Athropic seja simples, a biblioteca de transformação será usada para gerar as incorporações, e os pacotes restantes são necessários para que o bloco de anotações Jupyter funcione sem problemas.
Agora vem a instalação dos pacotes:
1 pip install -r requirements.txt
Agora, você está pronto para criar um bloco de anotações Jupyter e importar os pacotes necessários na primeira célula:
1 import json 2 import logging 3 import os 4 import time 5 from datetime import datetime 6 from typing import Dict, List, Optional, Tuple 7 8 # Third-party 9 import pandas as pd 10 from anthropic import Anthropic 11 from dotenv import load_dotenv 12 from pymongo import MongoClient 13 from pymongo.errors import BulkWriteError, ConnectionFailure 14 from sentence_transformers import SentenceTransformer 15 from tqdm.autonotebook import tqdm, trange
Primeiro, vamos ler o arquivo CSV de notícias com Pandas:
1 articles = pd.read_csv('fa_articles.csv', encoding='utf-8') 2 articles.head()
Os artigos não média muito para você, a menos que você seja fluente em serviço. São artigos que abrangem política, economia, questões sociais e tópicos semelhantes. Eles foram filtrados — portanto, nada de arte, entretenimento ou esportes.
Agora, vamos importar e instalar os transformação de frases e nosso modelo de incorporação de escolha — Embedic. Sim, essa é a letra c, e é pronunciada como na palavra italian cappccchino.
1 # Initialize Embedić model for Serbian language embeddings 2 # !pip install -U sentence-transformers 3 from sentence_transformers import SentenceTransformer 4 from tqdm.notebook import tqdm 5 from datetime import datetime 6 from typing import List, Dict 7 import json 8 9 model = SentenceTransformer('djovak/embedic-large')
Agora, criaremos uma função para concatenar o título e o conteúdo do artigo e passá-lo para a função de incorporação do transformação de frases, pois eles precisam representar uma única unidade compacta:
1 def generate_embeddings(df: pd.DataFrame, batch_size: int = 32) -> pd.DataFrame: 2 """ 3 Generate embeddings for concatenated title and content using Embedić. 4 5 Args: 6 df: DataFrame with 'title' and 'content' columns 7 batch_size: Number of texts to process at once 8 9 Returns: 10 DataFrame with added 'embedding' column 11 """ 12 # Create a copy of the dataframe 13 df_emb = df.copy() 14 15 # Concatenate title and content 16 print("Concatenating title and content...") 17 df_emb['text_for_embedding'] = df_emb['title'] + " " + df_emb['content'] 18 19 # Generate embeddings in batches 20 print("Generating embeddings...") 21 embeddings = [] 22 23 # Convert texts to list for batch processing 24 texts = df_emb['text_for_embedding'].tolist() 25 26 # Process in batches with progress bar 27 for i in tqdm(range(0, len(texts), batch_size)): 28 batch_text = texts[i:i + batch_size] 29 batch_embeddings = model.encode(batch_text) 30 embeddings.extend(batch_embeddings.tolist()) 31 32 # Add embeddings to dataframe 33 df_emb['embedding'] = embeddings 34 35 # Remove temporary concatenated text column 36 df_emb = df_emb.drop('text_for_embedding', axis=1) 37 38 print(f"Generated embeddings for {len(df_emb)} articles") 39 print(f"Embedding dimension: {len(embeddings[0])}") 40 41 return df_emb
A função é muito comentada e tem algumas declarações de impressão informativas. Se você executá-lo, verá que a incorporação específica (a versão grande) tem 1024 dimensões.
Para visualizar as incorporações geradas, podemos usar a seguinte célula Jupyter:
1 print("\nDataFrame shape:", df_with_embeddings.shape) 2 print("\nColumns:", df_with_embeddings.columns.tolist()) 3 4 print("\nSample embedding (first 5 dimensions):") 5 print(df_with_embeddings['embedding'].iloc[0][:5]) 6 7 embedding_lengths = df_with_embeddings['embedding'].apply(len) 8 print("\nAll embeddings have same dimension:", embedding_lengths.nunique() == 1) 9 print("Embedding dimension:", embedding_lengths.iloc[0])
Os dados agora estão prontos para serem inseridos em uma coleção do MongoDB , mas precisam ser processados um pouco para se tornar uma lista de dicionários:
1 def prepare_for_mongodb(df: pd.DataFrame) -> List[Dict]: 2 documents = [] 3 4 for _, row in tqdm(df.iterrows(), total=len(df)): 5 document = { 6 'title': row['title'], 7 'content': row['content'], 8 'date': row['artDate'], # Assuming you have a date column 9 'embedding': row['embedding'], 10 'metadata': { 11 'embedding_model': 'djovak/embedic-large', 12 'created_at': datetime.now(), 13 'last_updated': datetime.now() 14 } 15 } 16 documents.append(document) 17 18 return documents
Agora é o momento de finalmente acessar nosso banco de banco de dados MongoDB . Vamos adicionar algumas importações:
1 import os 2 from datetime import datetime 3 from dotenv import load_dotenv 4 from pymongo import MongoClient 5 from typing import Dict, List, Optional, Tuple 6 import logging 7 8 load_dotenv() 9 MONGODB_URI = os.getenv("MONGODB_URI") 10 DB_NAME = os.getenv("DB_NAME") 11 COLLECTION_NAME = os.getenv("COLLECTION_NAME") 12 13 logging.basicConfig(level=logging.INFO) 14 logger = logging.getLogger(__name__)
A biblioteca dotenv será usada para ler as variáveis do arquivo .env com o seguinte formato:
1 MONGODB_URI = "youURI" 2 COLLECTION_NAME="articles" 3 DB_NAME="rag_articles" 4 ANTHROPIC_API_KEY=sk-xxx…
Finalmente, vamos encerrar o processo de conexão ao nosso banco de banco de dados MongoDB :
1 def get_mongodb_connection(): 2 try: 3 client = MongoClient(MONGODB_URI) 4 client.admin.command('ping') 5 logger.info("Successfully connected to MongoDB") 6 7 db = client[DB_NAME] 8 collection = db[COLLECTION_NAME] 9 return client, db, collection 10 11 except Exception as e: 12 logger.error(f"Failed to connect to MongoDB. Error: {str(e)}") 13 raise ConnectionFailure(f"MongoDB connection failed: {str(e)}") 14 15 client, db, collection = get_mongodb_connection()
Depois de um pouco de preparação, agora estamos prontos para consumir os dados na collection:
1 def insert_documents_to_mongodb(documents: List[Dict], batch_size: int = 1000)->Tuple[int, int]: 2 successful = 0 3 failed = 0 4 5 for i in tqdm(range(0, len(documents), batch_size)): 6 batch = documents[i:i + batch_size] 7 try: 8 # Insert batch with ordered=False for better performance 9 result = collection.insert_many(batch, ordered=False) 10 successful += len(result.inserted_ids) 11 except BulkWriteError as e: 12 # Handle partial failures in batch 13 successful += e.details['nInserted'] 14 failed += len(batch) - e.details['nInserted'] 15 print(f"Batch {i//batch_size + 1} had {e.details['nInserted']} successful and " 16 f"{len(batch) - e.details['nInserted']} failed insertions") 17 18 return successful, failed
Vamos usar nossa função de inserção recém-criada e executar a inserção real dos dados, garantindo que a coleção esteja vazia:
1 collection.delete_many({}) 2 # Insert documents 3 successful, failed = insert_documents_to_mongodb(mongodb_documents) 4 print(f"Successfully inserted: {successful} documents") 5 print(f"Failed insertions: {failed} documents")
Agora que nossos dados estão inseridos, vamos criar o índice vetorial:
1 def create_vector_index( 2 connection_string: str, 3 database_name: str, 4 collection_name: str, 5 index_name: str = "vector_index" 6 ) -> None: 7 """ 8 Create a vector search index in MongoDB using PyMongo. 9 10 Args: 11 connection_string: MongoDB connection string 12 database_name: Name of the database 13 collection_name: Name of the collection 14 index_name: Name of the vector index 15 """ 16 # Connect to MongoDB 17 client = client 18 19 # Get database and collection 20 db = db 21 collection = collection 22 23 # Define the index configuration 24 index_config = { 25 "name": index_name, 26 "definition": { 27 "fields": [ 28 { 29 "numDimensions": 1024, 30 "path": "embedding", 31 "similarity": "cosine", 32 "type": "vector" 33 } 34 ] 35 } 36 } 37 38 try: 39 # Create the vector search index 40 collection.create_search_index(index_config) 41 print(f"Successfully created vector index '{index_name}'") 42 43 except Exception as e: 44 print(f"Error creating vector index: {str(e)}") 45 finally: 46 client.close()
A criação do índice vetorial no Python é deliberadamente um pouco mais detalhada do que deveria ser, mas é importante notar como o processo de criação do índice vetorial é simples e direto. Precisamos fornecer a conexão, o banco de dados de dados e os dados de coleta, e o seguinte:
- O nomedo índice desejado —no nosso caso, é vector_index
- O caminho ou o campo que você precisa ser indexado e que contém a array vetorial — no caso de nossos artigos, ele é chamado de incorporação
- A função de similaridade usada para medir distâncias entre vetores — estamos usando a similaridade do cosseno, uma medida rápida e simples que compara apenas os cossenos do ângulo que dois vetores inseridos fazem, usando como vértice a origem do espaço vetorial. Outra opção pode ser a distância euclideana.
- O tipo do índice é vetorial, e essa parte é direta
Com tudo, especialmente nosso estimado índice vetorial, em vigor, agora estamos prontos para implementar a função de pesquisa semântica. A função usará um pipeline de agregação muito simples do MongoDB para fornecer a pontuação de similaridade junto com os resultados:
1 def semantic_search(collection, query: str, k: int = 5) -> List[Dict]: 2 """ 3 Perform semantic search using Embedić vector similarity. 4 5 Args: 6 collection: MongoDB collection 7 query: Search query text - in Serbian! 8 k: Number of results to return 9 10 Returns: 11 List of matching documents 12 """ 13 try: 14 # Generate embedding for query using Embedić 15 query_embedding = model.encode(query).tolist() 16 17 pipeline = [ 18 { 19 "$vectorSearch": { 20 "index": "vector_index", 21 "queryVector": query_embedding, 22 "path": "embedding", 23 "numCandidates": 100, 24 "limit": k 25 } 26 }, 27 { 28 "$project": { 29 "title": 1, 30 "content": 1, 31 "date": 1, 32 "score": { "$meta": "vectorSearchScore" } 33 } 34 } 35 ] 36 37 results = list(collection.aggregate(pipeline)) 38 return results 39 40 except Exception as e: 41 logger.error(f"Search error: {str(e)}") 42 raise
Esta função de pesquisa é bastante simples. Ele executa apenas a pesquisa vetorial, mas espera uma query em Sérvio que deve ser passada para o modelo de incorporação. Mais tarde, usaremos o cliente Athropic para fazer uma chamada extra e traduzir a query de um idioma arbitrário para o sérievo. Por enquanto, vamos nos limitar a isso. Algumas palavras para começar podem serlitijum“” (para o Lírio),ekonomija“” (economização) e assim por diante.
Vamos adicionar uma função para formatar os resultados:
1 def display_search_results(query: str, results: List[Dict]): 2 """ 3 Display search results in a readable format 4 """ 5 print(f"\nQuery: {query}") 6 print("=" * 80) 7 8 for i, doc in enumerate(results, 1): 9 print(f"\n{i}. {doc['title']}") 10 print(f"Score: {doc['score']:.3f}") 11 print("-" * 80) 12 13 # Let's test the search 14 queries = [ 15 "Novi Sad","Litijum", "Ekonomija" 16 ] 17 18 for query in queries: 19 results = semantic_search(collection, query, k=6) 20 display_search_results(query, results) 21 print("\n" + "=" * 100 + "\n")
Depois de executar a célula anterior, você deve obter uma saída bem formatada com o título do artigo e uma pontuação de similaridade. A documentação do MongoDB sobre pesquisa de vetores fornece um guia eficiente e completo. O livro Construindo aplicativos intensivos de Python em IA é um envolvente conto de ficção científica e fornece diretrizes excelentes sobre as melhores práticas ao usar a pesquisa vetorial.
Se você dedicar um tempo e examinar o bloco de anotações Juyter fornecido, encontrará um subcapítulo sobre a realização de um cluster simples de K-means nas incorporações. Os vetores são muito adequados para esses tipos de algoritmos clássicos de aprendizado de máquina, e combiná-los com LLMs modernos pode produzir resultados ainda melhores em campos específicos. Não vamos esquecer que os modelos de conjunto, por exemplo, ainda estão dominando vários campos de classificação. Aqui, não vamos nos afundar mais no agrupamento, mas é interessante notar que o algoritmo, emparelhado com um LLM poderoso como o Class Opus, é capaz de identificar e descrever com muita precisão de cinco a seis clusters com relacionamentos muito coesos.
É hora de apresentar nosso segundo ator principal ao palco: ] laudo do Aconnection:
1 #!pip install anthropic 2 from anthropic import Anthropic 3 import os 4 from typing import List, Dict, Optional 5 import time 6 7 load_dotenv() 8 9 # Initialize Claude client 10 anthropic = Anthropic(api_key=os.getenv('ANTHROPIC_API_KEY'))
Este artigo simples se concentrará somente no MongoDB (com PyMongo) e no cliente Athropic , mas você é mais que bem-vindo para adaptar isso às suas necessidades, aproveitando algumas das estruturas LLM, como LangChain ou Llamaindex, que oferecem integrações incríveis, reutilização de código, e flexibilidade.
A função a seguir é um pouco longa, mas é intencionalmente verbosa e encapsula explicitamente alguns prompts de Classe. Em um aplicação do mundo real, esses prompts seriam extraídos e inseridos na própria função após algumas tentativas e testes, mas, neste caso, apenas os codificaremos:
1 def generate_news_report( 2 query: str, 3 collection, 4 model: SentenceTransformer, 5 anthropic_client: Anthropic, 6 language: str = "English", 7 top_k: int = 10, 8 max_retries: int = 3, 9 retry_delay: int = 2 10 ) -> str: 11 # Translate query to Serbian using Claude 12 translation_prompt = f"Translate the following {language} text to Serbian latin. Provide only the translation, nothing else: '{query}'" 13 try: 14 translation_response = anthropic_client.messages.create( 15 model="claude-3-opus-20240229", 16 max_tokens=100, 17 temperature=0, 18 messages=[{ 19 "role": "user", 20 "content": translation_prompt 21 }] 22 ) 23 24 serbian_query = translation_response.content[0].text.strip() 25 except Exception as e: 26 raise Exception(f"Translation failed: {str(e)}") 27 28 # Generate embedding for Serbian query 29 query_embedding = model.encode(serbian_query).tolist() 30 31 # Perform vector search 32 pipeline = [ 33 { 34 "$vectorSearch": { 35 "index": "vector_index", 36 "queryVector": query_embedding, 37 "path": "embedding", 38 "numCandidates": 100, 39 "limit": top_k 40 } 41 }, 42 { 43 "$project": { 44 "title": 1, 45 "content": 1, 46 "date": 1, 47 "score": { "$meta": "vectorSearchScore" } 48 } 49 } 50 ] 51 52 results = list(collection.aggregate(pipeline)) 53 54 # Prepare content for Claude 55 articles_text = "\n\n".join([ 56 f"Article {i+1}:\nDate: {doc['date']}\nTitle: {doc['title']}\nContent: {doc['content'][:500]}..." 57 for i, doc in enumerate(results) 58 ]) 59 60 # Create prompt for report generation 61 prompt = f"""You are an expert journalist and news analyst. Based on the following {top_k} most relevant Serbian news articles about "{query}" (translated to Serbian as "{serbian_query}"), 62 create a concise, well-structured news report in {language}. The report should: 63 - Be around 250-300 words 64 - Start with a clear headline 65 - Include key facts, dates, and relevant context 66 - Maintain journalistic neutrality 67 - Focus on the most newsworthy aspects 68 - Include a brief conclusion or outlook 69 Here are the articles: 70 {articles_text} 71 Please write the report in a professional journalistic style.""" 72 73 # Get response from Claude with retries 74 for attempt in range(max_retries): 75 try: 76 response = anthropic_client.messages.create( 77 model="claude-3-opus-20240229", 78 max_tokens=1000, 79 temperature=0.3, 80 messages=[{ 81 "role": "user", 82 "content": prompt 83 }] 84 ) 85 86 report = response.content[0].text.strip() 87 return report 88 89 except Exception as e: 90 if attempt == max_retries - 1: 91 raise Exception(f"Failed to generate report: {str(e)}") 92 time.sleep(retry_delay) 93 continue
Embora longa, a função é bastante simples. Ele executa algumas tarefas:
- A query e o idioma do relatório são fornecidos, então, primeiro, usamos Class para traduzir a query de pesquisa para o Sérvio para ser avaliada adequadamente no espaço de incorporações.
- A query convertida é alimentada no pipeline de pesquisa semântica que usamos antes, e uma lista de artigos relevantes é retornada.
- O etapa milag cada é a solicitação de laudo. Os LLMs já existem há algum tempo, e estou certo de que você encontrará guias excelentes sobre como criar prompts significativos e úteis. É um pouco uma mistura entre ciência e arte, mas, neste caso, estamos optando por uma solução simples.
- Finalmente, a API Class é chamada e o resultado é retornado.
Se você tentar a função de geração de relatório com os seguintes parâmetros:
1 try: 2 query = "Investments in mining" 3 4 report = generate_news_report( 5 query=query, 6 collection=collection, 7 model=model, # our existing sentence transformer model 8 anthropic_client=anthropic, 9 top_k=10, 10 ) 11 12 print("\nGenerated News Report:") 13 print("=" * 80) 14 print(report) 15 16 except Exception as e: 17 print(f"Error generating report: {str(e)}")
E, se você usar o conjunto fornecido de artigos de notícias, o relatório resultante deverá ser algo como o seguinte:
Manchete: A Sérvia lida com projetos de Mineração em meio a preocupações ambientais e debates políticas
Nas últimas semanas, o tópico dos projetos de Mineração na Sérvia tem estado na linha da frente do discurso público, com um foco particular na potencial Mina de Lítion no vale de Jadar. O governo da Sérvia e a gigante da extração de Minerva têm apoiado o projeto, enquanto a militâncias ambientais e alguns política da oposição expressaram suas preocupações...
Você também deve tentar a função com outros idiomas. Experimentei com o italian e os resultados foram satisfações.
Embora seja um projeto pequeno e simples que pode e deve ser implementado de forma muito mais concisa, ele oferece muito espaço para experimentação. . . . . . . . . . . . . . . . . . . . . . . . , em , oferecem três modelos: Opus, Sonnet e Hakuku. Cada um deles tem características diferentes e vale a pena experimentar. A arte de solicitar já foi mencionada - poderia haver muitas melhorias e muita experimentação. Outros modelos podem ser usados, como modelos OpenAI ou Llama. O sistema, como está, não foi feito para ser executado como um servidor, portanto, vale a pena tentar um LLM hospedado localmente por meio do Ollama ou de uma solução semelhante.
Nesse tipo de configuração, o MongoDB demonstra ser um banco de banco de dados ideal. Os relatórios criados podem ser salvos após a geração, revistos ou revistos por um ser humano (pelo menos, para verificação de dados), e podem ser vinculados aos artigos originais, criando uma cascata de escritas mais complexas que seguem um caminho lógico e cronológico que pode então ser novamente alimentada para um LLM. As possibilidades são realmente intermináveis, e experimentar com MongoDB e IA AI desbloqueia cenários interessantes e também é Diversão!
É realmente surpreendente a rapidez com que podemos criar um protótipo de um aplicação não trivial movido a AI IA generativa com um LLM LLM e um MongoDB apropriados como banco de banco de dados, aproveitando os poderosos recursos de pesquisa vetorial!
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.