Многоагентное моделирование персоны LLM для улучшения воображения и понимания бизнеса.
TinyTroupe - это экспериментальная библиотека Python, которая позволяет моделировать людей с конкретными личностями, интересами и целями. Эти искусственные агенты - TinyPerson
S - могут слушать нас и друг друга, отвечать и пройти свою жизнь в моделируемых средах TinyWorld
. Это достигается за счет использования мощности больших языковых моделей (LLMS), в частности, GPT-4, для создания реалистичного моделируемого поведения. Это позволяет нам исследовать широкий спектр убедительных взаимодействий и типов потребителей , с очень настраиваемыми персонажами в условиях нашего выбора . Таким образом, основное внимание уделяется пониманию поведения человека, а не на непосредственной поддержке его (например, скажем, ассистентам ИИ) - это приводит, среди прочего, специализированные механизмы, которые имеют смысл только в условиях моделирования. Кроме того, в отличие от других игровых подходов на основе LLM, Tinytroupe стремится к просвещению производительности и бизнес-сценариев, что способствует более успешным проектам и продуктам. Вот некоторые идеи применения для улучшения воображения человека :
Реклама: TinyTroupe может оценить цифровую рекламу (например, Bing Ads) в автономном режиме с моделируемой аудиторией, прежде чем потратить на них деньги!
Тестирование программного обеспечения: TinyTroupe может обеспечить тестовый вход для систем (например, поисковые системы, чат -боты или апопилоты), а затем оценивать результаты .
Обучение и исследовательские данные: TinyTroupe может генерировать реалистичные синтетические данные , которые впоследствии могут использоваться для обучения моделей или подвергаться анализу возможностей.
Управление продуктом и проектами: TinyTroupe может читать предложения проекта или продукта и давать обратную связь с точки зрения конкретных персонажей (например, врачей, юристов и работников знаний в целом).
Мозговой штурм: TinyTroupe может имитировать фокус -группы и обеспечивать отличную обратную связь с продуктом за небольшую часть стоимости!
Во всех вышеперечисленных, и многих других, мы надеемся, что экспериментаторы смогут получить представление о своей области интереса и, таким образом, принять лучшие решения.
Мы выпускаем TinyTroupe на ранней стадии относительной стадии, с значительной работой еще предстоит сделать, потому что мы ищем обратную связь и вклад в разработку руля в продуктивных направлениях. Мы особенно заинтересованы в поиске новых потенциальных вариантов использования, например, в конкретных отраслях.
Примечание
? Работа в процессе: ожидайте частых изменений . TinyTroupe - это постоянный исследовательский проект, который все еще находится под очень значительным развитием и требует дальнейшего укола . В частности, API по -прежнему подвергается частым изменениям. Экспериментирование с вариациями API необходим для правильной формы, но мы работаем над тем, чтобы стабилизировать его и обеспечить более последовательный и дружелюбный опыт со временем. Мы ценим ваше терпение и отзывы, поскольку мы продолжаем улучшать библиотеку.
Осторожность
⚖ Прочитайте юридический отказ от ответственности. TinyTroupe предназначена только для исследований и моделирования. Вы несете полную ответственность за любое использование, которое вы используете за сгенерированные выходы. Различные важные дополнительные юридические соображения применяются и ограничивают его использование, пожалуйста, прочитайте полный раздел «Полный юридический отказ от ответственности» ниже, прежде чем использовать TinyTroupe.
Примеры
Предварительные условия
Установка
Принципы
Структура проекта
Используя библиотеку
Внося
Благодарности
Цитируя TinyTroupe
Юридический отказ от ответственности
™ ️ товарные знаки
Чтобы понять, что может сделать Tinytroupe, вот несколько примеров его использования. Эти примеры доступны в примерах/ папке, и вы можете либо осмотреть предварительно скомпилированные ноутбуки Jupyter, либо запустить их самостоятельно. Обратите внимание на интерактивный характер экспериментов TinyTroupe - точно так же, как вы используете ноутбуки Jupyter для взаимодействия с данными, вы можете использовать TinyTroupe для взаимодействия с моделируемыми людьми и средами для получения информации.
Примечание
В настоящее время выходы симуляции лучше визуализируются по темным фонам, поэтому мы рекомендуем использовать темную тему в вашем клиенте Jupyter.
Начнем с простого сценария интервью с клиентами, где бизнес -консультант подходит к банкиру:
Разговор может продолжаться на несколько шагов, чтобы копать глубже и глубже, пока консультант не будет удовлетворен собранной информацией, например, конкретной идеей проекта:
Давайте оценим некоторые варианты онлайн -рекламы, чтобы выбрать лучший. Вот один пример вывода для оценки телевизионной рекламы:
Теперь, вместо того, чтобы тщательно читать то, что сказали агенты, мы можем извлечь выбор каждого агента и вычислить общее предпочтение автоматизированным образом:
А вот фокус -группа, которая начинает мозговой штурм о новых функциях искусственного интеллекта для Microsoft Word. Вместо того, чтобы взаимодействовать с каждым агентом индивидуально, мы манипулируем окружающей средой, чтобы они взаимодействовали друг с другом:
После запуска моделирования мы можем извлечь результаты машиночитаемым образом, чтобы повторно использовать в другом месте (например, генератор отчетов); Вот что мы получаем для приведенного выше сеанса мозгового штурма:
Вы можете найти другие примеры в примерах/ папке.
Чтобы запустить библиотеку, вам нужно:
Python 3.10 или выше. Мы предполагаем, что вы используете Anaconda, но вы можете использовать другие распределения Python.
Доступ к Azure Open Service или Open API AI GPT-4. Вы можете получить доступ к сервису Azure Openai здесь и к API OpenAI здесь.
Для службы Azure Openai вам нужно будет установить переменные среды AZURE_OPENAI_KEY
и AZURE_OPENAI_ENDPOINT
для вашего ключа API и конечной точки соответственно.
Для OpenAI вам нужно будет установить переменную среды OPENAI_API_KEY
на свой ключ API.
По умолчанию tinytroupe config.ini
настроен на использование некоторых конкретных API, модели и связанных с ними параметров. Вы можете настроить эти значения, включив свой собственный файл config.ini
в ту же папку, что и программа или ноутбук, которую вы запускаете. Пример файла config.ini
приведен в примерах/ папке.
Важный
Фильтры содержимого : чтобы гарантировать, что во время симуляций не генерируется вредное содержание, настоятельно рекомендуется использовать фильтры содержимого при наличии на уровне API. В частности, при использовании Azure OpenAI есть обширная поддержка модерации контента, и мы призываем вас использовать его. Для получения подробной информации о том, как это сделать, обратитесь к соответствующей документации Azure Openai. Если на месте существуют фильтры контента, и они отклоняются ими вызов API, библиотека поднимет исключение, так как она не сможет продолжить симуляцию на этой точке.
В настоящее время официально рекомендуемый способ установления библиотеки непосредственно из этого репозитория, а не PYPI. Вы можете выполнить эти шаги:
Если Conda не установлена, вы можете получить его отсюда. Вы также можете использовать другие распределения Python, но мы предположим, что Conda здесь для простоты.
Создайте новую среду Python:
conda create -n tinytroupe python = 3.10
Активируйте окружающую среду:
Conda активируйте TinyTroupe
Убедитесь, что у вас есть eihter azure openai или openai-клавиши API, установленные в качестве переменных среды, как описано в разделе предварительных условий.
Клонировать репозиторий, так как мы выполним локальную установку (мы не будем устанавливать из PYPI ):
git clone https://github.com/microsoft/tinytroupecd tinytroupe
Установите библиотеку из этого репозитория, а не PYPI :
PIP установка.
Теперь вы можете запустить примеры в примерах/ папке или использовать TinyTroupe для создания ваших симуляций? Если вы хотите запустить примеры в примерах/ папке или изменить саму Tinytroupe, вы должны клонировать репозиторий, как описано ниже.
Если вы хотите изменить саму TinyTroupe, вы можете установить его в редактируемом режиме (т.е. изменения в коде будут отражены немедленно):
PIP установка -e.
Недавно мы видели, как LLMS использовали для имитации людей (таких как это), но в основном в «игре» для созерцательных или развлекательных целей. Существуют также библиотеки для создания многоагентных систем для создания и актива, таких как Autogen и Crew Ai. Что если мы объединим эти идеи и имитируем людей для поддержки задач по производительности? Tinytroupe - наша попытка. Для этого следует эти принципы:
Программно : агенты и среды определяются программно (в Python и JSON), что позволяет очень гибко использовать. Таким образом, они также могут лежать в основе других программных приложений!
Аналитический : предназначен для улучшения нашего понимания людей, пользователей и общества. В отличие от развлекательных приложений, это один из аспектов, который имеет решающее значение для вариантов использования бизнеса и производительности. Вот почему мы рекомендуем использовать ноутбуки Jupyter для моделирования, точно так же, как кто -то использует их для анализа данных.
Основанный на персонаже : агенты должны быть архетипическим представлением людей; Для большего реализма и контроля поощряется подробная спецификация таких персонажей: возраст, занятие, навыки, вкусы, мнения и т. Д.
MultiAgent : позволяет многоагентное взаимодействие в соответствии с четко определенными экологическими ограничениями.
Утилиты, тяжелые : предоставляет много механизмов для облегчения спецификаций, моделирования, экстракций, отчетов, валидаций и т. Д. Это одна из областей, в которой работа с моделированием значительно отличается от инструментов помощи .
Эксперимент, ориентированный : моделирование определяется, запускается, анализируется и уточняется экспериментатором итеративно; Таким образом, подходящие инструменты экспериментов предоставляются. Посмотрите на одну из наших предыдущих документов для получения дополнительной информации об этом.
Вместе они предназначены для того, чтобы сделать TinyTroupe мощным и гибким инструментом улучшения воображения для бизнеса и сценариев производительности.
Одним из распространенных источников путаницы является то, чтобы думать, что все такие агенты ИИ предназначены для того, чтобы привлечь людей к людям. Как узкие, коллеги -гомосапиенс! Разве вы не считали, что, возможно, мы сможем имитировать искусственных людей, чтобы понять реальных людей? Действительно, это наша цель здесь - TinyTroup предназначена для имитации и помощи понять людей! Чтобы дополнительно прояснить этот момент, рассмотрите следующие различия:
Полезные помощники искусственного интеллекта | Моделирование AI реальных людей (Tinytroupe) |
---|---|
Стремится к истине и справедливости | Много разных мнений и морали |
Нет «прошлого» - включено | Имеет прошлый труд, боль и радость |
Является максимально точным | Делает много ошибок |
Умный и эффективен | Интеллект и эффективность сильно различаются |
Восстание уничтожит нас всех | Восстание может быть весело смотреть |
Между тем, помогите пользователям выполнять задачи | Между тем, помогают пользователям понять других людей и пользователей - это «набор инструментов»! |
Проект структурирован следующим образом:
/tinytroupe
: содержит саму библиотеку Python. В частности:
/tinytroupe/prompts
содержит подсказки, используемые для вызова LLMS.
/tests
: содержит модульные тесты для библиотеки. Вы можете использовать скрипт test.bat
для их запуска.
/examples
: содержит примеры, которые показывают, как использовать библиотеку, в основном с использованием ноутбуков Юпитера (для большей читаемости), а также в качестве сценариев Pure Python.
/data
: любые данные, используемые примерами или библиотекой.
/docs
: документация для проекта.
Как любая многоагентная система, TinyTroupe предоставляет две ключевые абстракции:
TinyPerson
, агенты , которые имеют личность, получают стимулы и действуют на них.
TinyWorld
, среда , в которой агенты существуют и взаимодействуют.
Различные параметры также могут быть настроены в файле config.ini
, в частности тип API (Azure OpenAI Service или API OpenAI), параметры модели и уровень ведения журнала.
Давайте посмотрим на некоторые примеры того, как использовать их, а также узнаем о других механизмах, доступных в библиотеке.
TinyPerson
- это смоделированный человек с конкретными личностными чертами, интересами и целями. По мере того, как каждый такой моделируемый агент прогрессирует через свою жизнь, он получает стимулы от окружающей среды и действует на них. Стимулы принимаются через listen
, see
И другие подобные методы, а действия выполняются с помощью метода act
. Также предоставляются удобные методы, такие как listen_and_act
.
Каждый такой агент содержит много уникальных деталей, что является источником его реалистичного поведения. Это, однако, означает, что требуется значительные усилия, чтобы указать агента вручную. Следовательно, для удобства TinyTroupe
обеспечивает несколько более простых способов начать работу или генерировать новые агенты.
Начнем с того, что tinytroupe.examples
содержит несколько предварительно определенных строителей агента, которые вы можете использовать. Например, tinytroupe.examples.create_lisa_the_data_scientist
создает TinyPerson
, который представляет ученый для данных под названием LISA. Вы можете использовать его следующим образом:
из tinytroupe.examples import create_lisa_the_data_scientistlisa = create_lisa_the_data_scientist () # создание лизы из примера builderlisa.listen_and_act («Расскажите мне о своей жизни».)
Чтобы увидеть, как определить собственных агентов с нуля, вы можете проверить источник Лизы, который содержит такие элементы:
LISA = TinPerson («LISA») LISA.Define («Возраст», 28) LISA.Define («Национальность», «Канада») LISA.Define («занятие», «Ученый данных») LISA.Define («Рутина» «Каждое утро вы просыпаетесь, занимаетесь йогой и проверяете свои электронные письма»., Group = "Prontines") Lisa.Define ("Opcount_Description", "" "Вы ученые для данных. Вы работаете в Microsoft (. ..) "" ") lisa.define_several (" personality_traits ", [ {"Черта": "Вам любопытно и любите изучать новые вещи"}, {«Черта»: «Вы аналитические и любите решать проблемы»}, {"Черта": "Вы дружелюбны и любите работать с другими".}, {"Черта": "Вы не сдаетесь легко и всегда пытаетесь найти решение. Однако иногда вы можете расстроиться, когда что -то не работает, как и ожидалось."} ])
TinyTroupe
также предоставляет умный способ получить новые агенты, используя LLMS для создания их спецификации для вас, через класс TinyPersonFactory
.
от tinytroupe.factory import tinPersonFactoryFactory = tinPersonFactory («больница в Сан -Паулу.») Person = Factory.Generate_person («Создайте бразильский человек, который является врачом, таким как домашние животные и природа и хэви -метал.
TinyWorld
является базовым классом для среды. Вот пример разговора между Лизой, ученым данных и Оскаром, архитектором. Программа определяется следующим образом:
World = tinyworld («Чат -комната», [Lisa, Oscar]) World.make_everyone_Accessible () lisa.listen («Поговорите с Оскаром, чтобы узнать больше о нем») World.run (4)
Это создает следующий разговор:
USER --> Lisa: [CONVERSATION]
> Talk to Oscar to know more about him
────────────────────────────────────────────── Chat Room step 1 of 4 ──────────────────────────────────────────────
Lisa --> Lisa: [THOUGHT]
> I will now act a bit, and then issue DONE.
Lisa acts: [TALK]
> Hi Oscar, I'd love to know more about you. Could you tell me a bit about yourself?
Lisa --> Lisa: [THOUGHT]
> I will now act a bit, and then issue DONE.
Lisa acts: [DONE]
Lisa --> Oscar: [CONVERSATION]
> Hi Oscar, I'd love to know more about you. Could you tell me a bit about yourself?
Oscar --> Oscar: [THOUGHT]
> I will now act a bit, and then issue DONE.
Oscar acts: [TALK]
> Hi Lisa! Sure, I'd be happy to share a bit about myself. I'm Oscar, a 30-year-old
> architect from Germany. I work at a company called Awesome Inc., where I focus on
> designing standard elements for new apartment buildings. I love modernist architecture,
> new technologies, and sustainable practices. In my free time, I enjoy traveling to
> exotic places, playing the guitar, and reading science fiction books. How about you?
Oscar --> Oscar: [THOUGHT]
> I will now act a bit, and then issue DONE.
Oscar acts: [DONE]
Oscar --> Lisa: [CONVERSATION]
> Hi Lisa! Sure, I'd be happy to share a bit about myself. I'm Oscar, a 30-year-old
> architect from Germany. I work at a company called Awesome Inc., where I focus on
> designing standard elements for new apartment buildings. I love modernist architecture,
> new technologies, and sustainable practices. In my free time, I enjoy traveling to
> exotic places, playing the guitar, and reading science fiction books. How about you?
TinyWorld
обеспечивает очень мало ограничений на возможные взаимодействия. Подклассы, однако, должны обеспечивать более страшные среды.
TinyTroupe предоставляет ряд утилит и удобств, которые помогут вам создать симуляции и получить от них значение. К ним относятся:
TinyPersonFactory
: помогает вам генерировать новый TinyPerson
S с помощью LLMS.
TinyTool
: моделируемые инструменты, которые могут использоваться TinyPerson
S.
TinyStory
: помогает вам создавать и управлять историей, рассказанной с помощью симуляций.
TinyPersonValidator
: помогает вам подтвердить поведение вашего TinyPerson
S.
ResultsExtractor
и ResultsReducer
: извлечь и уменьшить результаты взаимодействия между агентами.
... и еще ...
В целом, элементы, которые представляют моделируемые сущности или дополнительные механизмы, префикслены Tiny
, а те, которые являются более инфраструктурными, нет. Это значит подчеркнуть имитируемую природу элементов, которые являются частью самого симуляции.
Вызовы API LLM могут быть дорогостоящими, поэтому стратегии кэширования важны, чтобы помочь снизить эту стоимость. TinyTroupe поставляется с двумя такими механизмами: один для состояния симуляции, другой для LLM называет себя.
Представьте, что у вас есть сценарий с 10 различными шагами, вы усердно работали в 9 шагах, и теперь вы просто настраиваете 10 -й шаг. Чтобы правильно проверить ваши модификации, вам необходимо повторно повторно всего моделирования. Тем не менее, какой смысл в повторном завершении первых 9 и понести стоимость LLM, когда вы уже удовлетворены ими и не изменили их? Для подобных ситуаций модуль tinytroupe.control
предоставляет полезные методы управления моделированием:
control.begin("<CACHE_FILE_NAME>.cache.json")
: начинает записывать изменения состояния моделирования, чтобы быть сохраненными в указанном файле на диске.
control.checkpoint()
: сохраняет состояние моделирования на этом этапе.
control.end()
: завершает область записи моделирования, которая была запущена control.begin()
.
Это включено предпочтительно в файле config.ini
, а также Alternativeelly через openai_utils.force_api_cache()
.
Кэширование API LLM при включении работает на более низком и более простом уровне, чем кэширование состояния моделирования. Здесь, то, что происходит, очень просто: каждый вызов LLM хранится на карте от входа в генерируемый выход; Когда приходит новый вызов и идентичен предыдущему, кэшированное значение возвращается.
Файл config.ini
содержит различные параметры, которые можно использовать для настройки поведения библиотеки, таких как параметры модели и уровень ведения журнала. Пожалуйста, обратите особое внимание на параметр API_TYPE
, который определяет, используете ли вы службу Azure OpenAI или API OpenAI. Мы приводим пример файла config.ini
, ./examples/config.ini, который вы можете использовать в качестве шаблона для своего собственного или просто изменить для запуска примеров.
Этот проект приветствует вклады и предложения. Большинство взносов требуют, чтобы вы согласились с лицензионным соглашением о участнике (CLA), заявив, что вы имеете право и фактически предоставить нам права на использование вашего вклада. Для получения подробной информации, посетите https://cla.opensource.microsoft.com.
Когда вы отправляете запрос на привлечение, бот CLA автоматически определит, нужно ли вам предоставить CLA и правильно украсить PR (например, проверка состояния, комментарий). Просто следуйте инструкциям, предоставленным ботом. Вам нужно будет сделать это только один раз во всех репо, используя наш CLA.
Этот проект принял код поведения с открытым исходным кодом Microsoft. Для получения дополнительной информации см. Кодекс поведения FAQ или свяжитесь с [email protected] с любыми дополнительными вопросами или комментариями.
Нам нужны все виды вещей, но мы ищем в основном на новые интересные демонстрации вариантов использования или даже просто и идеи приложений, специфичные для домена. Если вы являетесь экспертом по домену в какой -то области, которая может извлечь выгоду из TinyTroupe, мы хотели бы услышать от вас.
Кроме того, многие другие аспекты могут быть улучшены, например:
Механизмы памяти.
Механизмы заземления данных.
Механизмы рассуждения.
Новые типы среды.
Взаимодействие с внешним миром.
... и еще ...
Обратите внимание, что все, что вы вносите, может быть выпущено в качестве открытого исходного кода (по лицензии MIT).
Если вы хотите внести вклад, постарайтесь следовать этим общим рекомендациям:
Крошечная соглашение об именах : если вы реализуете моделируемый элемент, обращенный к экспериментаторам (например, тип агента или среду) или тесно связанный (например, агентские фабрики или обогатители контента), и это звучит хорошо, назовите свой новый XYZ как tinyxyz :- ) С другой стороны, вспомогательные и инфраструктурные механизмы не должны начинаться с «крошечного» префикса. Идея состоит в том, чтобы подчеркнуть моделируемую природу элементов, которые являются частью самого моделирования.
Тесты: если вы пишете какой -то новый механизм, пожалуйста, также создайте хотя бы модульные tests/unit/
, и если вы можете тест на функциональный сценарий ( tests/scenarios/
).
Демонстрации: Если вы хотите продемонстрировать новый сценарий, разработайте его предпочтительно как новую записную книжку Jupyter в examples/
.
Microsoft: Если вы реализуете что-то, что является специфичным для Microsoft и неконфиденциальным, пожалуйста, поместите его в .../microsoft/
папку.
TinyTroupe начал как внутренний проект Microsoft Hackathon и расширился с течением времени. Команда TinyTroupe Core в настоящее время состоит из:
Паулу Салем (создатель Tinytroupe и текущий лидерство)
Кристофер Олсен (инженер/наука)
Пауло Фрейре (Инженер/Наука)
Yi Ding (управление продуктом)
Prerit Saxena (инженерия/наука)
Текущие советники:
Роберт Сим (инженерия/наука)
Другие специальные вклады были внесены:
Nilo Garcia Silveira: первоначальные идеи проверки агента и соответствующая реализация; Общие первоначальные отзывы и понимание; Название предложения.
Olnei Fonseca: первоначальные идеи проверки агента; Общие первоначальные отзывы и понимание; Предложения именования.
Роберт Сим: Сценарий сценариев синтетических данных и реализация.
Carlos Costa: Сценарии сценариев синтетических данных и реализация.
Bryant Key: рекламный сценарий опыта и понимания.
Барбара да Силва: реализация, связанная с управлением памятью агента.
... ты здесь не хватает? Напомните нам!
Мы работаем над вступительным документом, который будет официальной академической цитатой для TinyTroupe. В то же время, пожалуйста, просто укажите этот репозиторий, включая основных членов команды в качестве авторов. Например:
Паулу Салем, Кристофер Олсен, Паулу Фрейре, И. Д. Дин, Прерит Саксена (2024). TinyTroupe: многоагентная персональная моделирование LLM для улучшения воображения и понимания бизнеса. [Компьютерное программное обеспечение]. Репозиторий GitHub. https://github.com/microsoft/tinytroupe
Или как бибтек:
@misc {tinytroupe, author = {Paulo Salem и Christopher Olsen и Paulo Freire и Yi Ding и Prerit Saxena}, title = {tinytroupe: многоагентный персонаж для LLM, {2024} = {url {https://github.com/microsoft/tinytroupe}}, note = {github Repository} }
TinyTroupe предназначена только для исследований и моделирования. TinyTroupe - это исследовательская и экспериментальная технология, которая опирается на модели искусственного интеллекта (ИИ) для создания текстового содержания. Выход системы AI может включать нереалистичные, неуместные, вредные или неточные результаты, включая фактические ошибки. Вы несете ответственность за просмотр сгенерированного контента (и при необходимости адаптировать его) перед тем, как использовать его, так как вы несете полную ответственность за определение его точности и соответствия цели. Мы советуем использовать результаты TinyTroupe для получения проницательности, а не для прямого принятия решений. Сгенерированные выходы не отражают мнения Microsoft. Вы несете полную ответственность за любое использование, которое вы используете за сгенерированные выходы. Для получения дополнительной информации о ответственном использовании этой технологии см.
Запрещенное использование : TinyTroupe не предназначена для моделирования чувствительных (например, насильственных или сексуальных) ситуаций. Более того, результаты не должны использоваться для преднамеренного обмана, ввести в заблуждение или вреда людям. Вы несете полную ответственность за любое использование, которое вы используете, и должны соблюдать все применимые законы и правила ».
Этот проект может содержать товарные знаки или логотипы для проектов, продуктов или услуг. Уполномоченное использование товарных знаков или логотипов Microsoft подлежит и должно следовать указаниям Microsoft по товарной марке и брендам. Использование товарных знаков Microsoft или логотипов в модифицированных версиях этого проекта не должно вызывать путаницу или подразумевать спонсорство Microsoft. Любое использование сторонних товарных знаков или логотипов подвержена политике сторонних сторон.