Введение

Делать заметки и обобщать протоколы совещаний — неотъемлемая часть повседневного бизнеса. Используя функции экспорта стенограмм программного обеспечения для совещаний и современные модели большого языка, мы можем автоматизировать скучную работу и позволить нам тратить больше времени на творческую и интересную работу. В этом сообщении блога я собираюсь показать вам, как создать инструмент для создания протоколов собраний с использованием ChatGPT и LangChain.

Совещания не доставляют удовольствия, а делать заметки и протоколы совещаний еще хуже. Ведение заметок добавляет дополнительную нагрузку участникам, когда они пытаются участвовать в общении. Было бы еще хуже, если бы вы печатали медленнее, как я. Чаще всего составление протоколов совещаний является ответом организаторов собраний, некоторые хорошие организаторы умеют их писать. Однако, если совещаний много, эта задача может быть утомительной и занимать много времени.

Благодаря инновациям моделей больших языков, особенно созданию ChatGPT, у нас появилось больше игрушек для автоматизации нашего рабочего процесса. LangChain — это платформа для разработки приложений на основе языковых моделей. Мы можем создавать приложения, используя LangChain, чтобы уменьшить шаблонный код при разработке приложений LLM.

Выполнение

В следующей реализации я собираюсь использовать ChatGPT в качестве LLM, вы можете выбрать другие модели, такие как Claude, Falcon-40B-Instruct или FLAN-T5. Стоит отметить, что вам нужно выбрать проинструктированного LLM, чтобы убедиться, что он может следовать вашей команде.

Создать фиктивный набор данных

В вашем реальном рабочем процессе вы можете включить стенограммы и экспортировать стенограммы собраний из вашего программного обеспечения для собраний. Например, Google Meet экспортирует запись в путь на диске Google. Zoom поддерживает аналогичные функции. В демонстрационных целях мы можем создать имитацию записи собрания для создания приложения. Самый простой способ сделать это — использовать ChatGPT для генерации данных. Мы используем следующую подсказку

Could you generate a fake Meeting Transcript related to a technical discussion about comparing using Bigquery, SnowFlake and Redshift for data warehouse. You can create four participants names. 

Вы можете использовать эту подсказку Could you contintue the discussion?, чтобы попросить ChatGPT продолжить обсуждение. После того, как вы повторите это пару раз, у вас будет достойный отчет о встречах. Затем вы можете скопировать и вставить имитированную запись собрания в файл TXT, скажем, файл record.txt.

Создайте сценарий сводки собрания

Сначала вам нужно импортировать Langchain.

from langchain.chains.summarize import load_summarize_chain
from langchain.docstore.document import Document
from langchain.llms.openai import OpenAI, OpenAIChat
from langchain.prompts import PromptTemplate
from langchain.text_splitter import CharacterTextSplitter

Затем вам нужно настроить ключ API OpenAI.

import os
import openai

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
openai.api_key = os.environ['OPENAI_API_KEY']

Затем вы можете прочитать файл и использовать CharacterTextSplitter, чтобы разрезать необработанный текст на небольшие куски. Это гарантирует, что каждый отдельный вызов API будет иметь менее 4 000 токенов на входе. Этот предел варьируется от модели к модели.

    target_len = 500
    chunk_size = 3000
    chunk_overlap = 200
    with open("record.txt", "r") as f:
        raw_text = f.read()
    # Split the source text
    text_splitter = CharacterTextSplitter(
        chunk_size=chunk_size,
        chunk_overlap=chunk_overlap,
        length_function=len,
    )
    texts = text_splitter.split_text(
        source_text,
    )

    # Create Document objects for the texts
    docs = [Document(page_content=t) for t in texts[:]]

Далее вы собираетесь инициализировать объект ChatGPT и использовать его в load_summarize_chain. Каждый фрагмент текста отправляется в ChatGPT для независимого суммирования. Вы используете prompt_template в качестве шаблона подсказки для создания сводки первого фрагмента. Для следующих исполнений сводка предыдущего фрагмента и шаблон подсказки refine_template будут объединены в подсказку и отправлены в ChatGPT для подведения итогов. Это позволяет ChatGPT суммировать текущий фрагмент с учетом предыдущего контекста. Это поведение определяется параметром type как refine в функции load_summarize_chain. Рабочий процесс представлен на следующей схеме, аннотации с первой по четвертую показывают порядок выполнения.

    openaichat = OpenAIChat(temperature=0, model="gpt-3.5-turbo")
    prompt_template = """Act as a professional technical meeting minutes writer. 
    Tone: formal
    Format: Technical meeting summary
    Length:  200 ~ 300
    Tasks:
    - highlight action items and owners
    - highlight the agreements
    - Use bullet points if needed
    {text}
    CONCISE SUMMARY IN ENGLISH:"""
    PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
    refine_template = (
        "Your job is to produce a final summary\n"
        "We have provided an existing summary up to a certain point: {existing_answer}\n"
        "We have the opportunity to refine the existing summary"
        "(only if needed) with some more context below.\n"
        "------------\n"
        "{text}\n"
        "------------\n"
        f"Given the new context, refine the original summary in English within {target_len} words: following the format"
        "Participants: <participants>"
        "Discussed: <Discussed-items>"
        "Follow-up actions: <a-list-of-follow-up-actions-with-owner-names>"
        "If the context isn't useful, return the original summary. Highlight agreements and follow-up actions and owners."
    )
    refine_prompt = PromptTemplate(
        input_variables=["existing_answer", "text"],
        template=refine_template,
    )
    chain = load_summarize_chain(
        openaichat,
        chain_type="refine",
        return_intermediate_steps=True,
        question_prompt=PROMPT,
        refine_prompt=refine_prompt,
    )
    resp = chain({"input_documents": docs}, return_only_outputs=True)

После выполнения скрипта вы можете проверить вывод из resp["output_text"]. Например:

Participants: John Anderson, Sarah Roberts, Michael Johnson, Emily Wilson

Discussed: The technical meeting discussed the three popular data warehouse options: BigQuery, Snowflake, and Redshift. The group compared the platforms based on performance, pricing, ease of use, integration capabilities, security and compliance features, scalability, data loading, query optimization, vendor support, and community resources. Each platform has its strengths, but Snowflake stood out for its intuitive web-based console, built-in security features, scalability, and performance. The group agreed to further evaluate which solution aligns best with their requirements.

John thanked the group for their insights on vendor support and community resources, emphasizing the importance of these factors for a successful implementation. The group then shifted their focus to cost and data governance considerations.

Sarah provided insights on cost considerations for each platform. BigQuery's pricing model is based on usage, while Snowflake and Redshift follow a pay-as-you-go pricing model. Snowflake's ability to automatically suspend and resume compute resources during idle periods helps optimize costs. Redshift offers both on-demand and reserved instance pricing options, providing flexibility based on usage patterns and workload requirements.

Michael highlighted the importance of data governance and the security and compliance features offered by each platform. BigQuery provides robust access controls, encryption, and auditing capabilities, while Snowflake offers advanced access controls, data masking, and secure data sharing. Redshift integrates with AWS Identity and Access Management (IAM) for access control and encryption of data at rest and in transit.

Emily added that data governance involves managing data quality and lineage. BigQuery provides tools for data quality assessment and integrates with Data Catalog for data discovery and lineage tracking. Snowflake offers features like Time Travel and Zero-Copy Cloning for data versioning and lineage. Redshift integrates with AWS Glue for data cataloging and integrates with AWS Lake Formation for data lake governance.

The group agreed that carefully evaluating the pricing models and features offered by each platform is crucial for cost optimization and meeting their data governance requirements. They also agreed to further evaluate which solution aligns best with their requirements.

Follow-up actions:
- Further evaluate which solution aligns best with their requirements (all)
- Consider Snowflake's cloud-based architecture for dynamic resource allocation based on workload demands (Emily)
- Consider Snowflake's various loading options, including bulk, streaming, and data sharing (Sarah)
- Consider Snowflake's user community for knowledge sharing (Michael)

Теперь вы можете просмотреть сводку, уточнить ее и поделиться ею со своими заинтересованными сторонами!

Заключение

В этом посте мы обсудили использование LangChain и ChatGPT для суммирования протоколов собраний. Надеюсь, это поможет вам сэкономить 15 минут после каждой встречи!

Рабочая нагрузка может быть дополнительно настроена в соответствии с вашими особыми требованиями. Вы можете настроить prompt_template и refine_template в соответствии со стилем вашей организации и личным стилем, чтобы создать более персонализированную сводку. Если у вас есть проблемы с безопасностью данных при обмене данными записей собраний с ChatGPT, вы можете разместить свою собственную модель LLM, например FLAN-T5, с SageMaker Endpoint, следуя этому блогу, чтобы лучше контролировать поток данных в своем собственном VPC.