"}},"componentScriptGroups({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCoverImage\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeTitle\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTimeToRead\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeDescription\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505309836"}],"message({\"id\":\"message:3997961\"})":{"__ref":"BlogReplyMessage:message:3997961"},"message({\"id\":\"message:3993093\"})":{"__ref":"BlogReplyMessage:message:3993093"},"message({\"id\":\"message:3974978\"})":{"__ref":"BlogReplyMessage:message:3974978"},"message({\"id\":\"message:3974105\"})":{"__ref":"BlogReplyMessage:message:3974105"},"message({\"id\":\"message:4101328\"})":{"__ref":"BlogReplyMessage:message:4101328"},"message({\"id\":\"message:4094067\"})":{"__ref":"BlogReplyMessage:message:4094067"},"message({\"id\":\"message:4081110\"})":{"__ref":"BlogReplyMessage:message:4081110"},"message({\"id\":\"message:4078511\"})":{"__ref":"BlogReplyMessage:message:4078511"},"message({\"id\":\"message:4060106\"})":{"__ref":"BlogReplyMessage:message:4060106"},"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505309836"}],"cachedText({\"lastModified\":\"1745505309836\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505309836"}]},"CachedAsset:pages-1745487429128":{"__typename":"CachedAsset","id":"pages-1745487429128","value":[{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730142000000,"localOverride":null,"page":{"id":"AllEvents","type":"CUSTOM","urlPath":"/Events","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730142000000,"localOverride":null,"page":{"id":"CommunityHub.Page","type":"CUSTOM","urlPath":"/Directory","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730142000000,"localOverride":null,"page":{"id":"AllBlogs.Page","type":"CUSTOM","urlPath":"/blogs","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429128,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Deleted","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"MMM dd yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"Category:category:EducationSector":{"__typename":"Category","id":"category:EducationSector","entityType":"CATEGORY","displayId":"EducationSector","nodeType":"category","depth":3,"title":"Education Sector","shortTitle":"Education Sector","parent":{"__ref":"Category:category:solutions"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Category:category:communities":{"__typename":"Category","id":"category:communities","displayId":"communities","nodeType":"category","depth":1,"parent":{"__ref":"Category:category:top"},"title":"Communities","entityType":"CATEGORY","shortTitle":"Communities"},"Category:category:solutions":{"__typename":"Category","id":"category:solutions","displayId":"solutions","nodeType":"category","depth":2,"parent":{"__ref":"Category:category:communities"},"title":"Topics","entityType":"CATEGORY","shortTitle":"Topics"},"Blog:board:EducatorDeveloperBlog":{"__typename":"Blog","id":"board:EducatorDeveloperBlog","entityType":"BLOG","displayId":"EducatorDeveloperBlog","nodeType":"board","depth":4,"conversationStyle":"BLOG","title":"Educator Developer Blog","description":"","avatar":null,"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:EducationSector"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:gxcuf89792"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:communities"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:solutions"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:EducationSector"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}}},"shortTitle":"Educator Developer Blog","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"REVERSE_PUBLISH_TIME","repliesFormat":"threaded"},"eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/","tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":false,"tagType":"FREEFORM_ONLY"},"Rank:rank:35":{"__typename":"Rank","id":"rank:35","position":16,"name":"Iron Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:2076234":{"__typename":"User","id":"user:2076234","uid":2076234,"login":"Minseok_Song","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0yMDc2MjM0LTUyMTI2MmlDRjAzQ0Q1OUIwNDRFOTJB"},"rank":{"__ref":"Rank:rank:35"},"email":"","messagesCount":28,"biography":null,"topicsCount":8,"kudosReceivedCount":17,"kudosGivenCount":65,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2023-10-11T02:25:07.343-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":1,"entityType":"USER","eventPath":"community:gxcuf89792/user:2076234"},"BlogTopicMessage:message:3969713":{"__typename":"BlogTopicMessage","uid":3969713,"subject":"Teach ChatGPT to Answer Questions: Using Azure AI Search & Azure OpenAI (Lang Chain)","id":"message:3969713","revisionNum":58,"repliesCount":9,"author":{"__ref":"User:user:2076234"},"depth":0,"hasGivenKudo":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"conversation":{"__ref":"Conversation:conversation:3969713"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:3969713"},"teaser":"
\n
In this two-part series, we will explore how to build intelligent service using Azure. In Series 1, we'll use Azure AI Search to extract keywords from unstructured data stored in Azure Blob Storage. In Series 2, we'll Create a feature to answer questions based on PDF documents using Azure OpenAI.
\n
","body":"
Teach ChatGPT to Answer Questions Based on PDF content: Using Azure AI Search and Azure OpenAI (Lang Chain.ver)
Can't I just copy and paste text from a PDF file to teach ChatGPT?
\n
\n
The purpose of this tutorial is to explain how to efficiently extract and use information from large amounts of PDFs. Dealing with a 5-page PDF can be straightforward, but it's a different story when you're dealing with complex documents of 100+ pages. In these situations, the integration of Azure AI Search with Azure OpenAI enables fast and accurate information retrieval and processing. In this tutorial, we handle 5 PDFs, but you can apply this method to scale to handle more than 10,000 files. In this two-part series, we will explore how to build intelligent service using Azure. In Series 1, we'll use Azure AI Search to extract keywords from unstructured data stored in Azure Blob Storage. In Series 2, we'll Create a feature to answer questions based on PDF documents using Azure OpenAI. Here is an overview of this tutorial.
\n
\n
\n
\n
This tutorial is related to the following topics
\n
\n
- AI Engineer
\n
- Developer
\n
- Azure Blob Storage
\n
- Azure AI Search
\n
- Azure OpenAI
\n
\n
Learning objectives
\n
\n
In this tutorial, you'll learn the following:
\n
- How to store your unstructured data in Azure Blob Storage.
\n
\n
- How to create search experiences based on data stored in Blob Storage with Azure AI Search.
\n
- Learn how to teach ChatGPT to answer questions based on your PDF content using Azure AI search and Azure OpenAI.
Microsoft Cloud Technologies used in this Tutorial
\n
\n
\n
\n
- Azure Blob Storage
\n
- Azure AI Search
\n
- Azure OpenAI Service
\n
\n
\n
\n
Table of Contents
\n
\n
Series 1: Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
1. Create a Blob Container
\n
2. Store PDF Documents in Azure Blob Storage
\n
3. Create an AI Search Service
\n
4. Connect to Data from Azure Blob Storage
\n
5. Add Cognitive Skills
\n
6. Customize Target Index and Create an Indexer
\n
7. Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
Series 2: Implement a ChatGPT Service with Azure OpenAI
\n
\n
\n
1. Change your indexer settings to use Azure OpenAI
\n
2. Create an Azure OpenAI
\n
3. Set up the project and install the libraries
\n
4. Set up the project in VS Code
\n
5. Search with Azure AI Search
\n
6. Get answers from PDF content using Azure OpenAI and AI Search
\n
7. Note: Full code for example.py and config.py
\n
\n
\n
\n
Series 1: Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
In Series 1, we'll use Azure AI Search to extract key phrases from unstructured data stored in Azure Blob Storage.
\n
\n
\n
\n
\n
\n
\n
\n
This series is designed to guide you through the essential steps of storing, connecting, and searching data in the cloud.
\n
\n
\n
\n
Overview of Series 1
\n
\n
\n
\n
\n
\n
1. Store Unstructured Data in the Cloud
\n
\n
We'll begin by exploring how to store unstructured data, such as PDFs, in the cloud. This section covers the basics of uploading data in Azure Blob Storage.
\n \n
2. Connect Stored Data to Azure AI Search
\n \n
Once our data is stored in the cloud, the next step is to connect that data to Azure AI Search.
\n \n
3. Search Stored Data
\n \n
In this final step of Series 1, we'll set up an index on the data you connect to and search based on the data you store in the cloud to retrieve results in Azure AI Search. So we can efficiently retrieve and use the data stored in Azure Blob Storage.
\n
\n
\n
\n
1. Create a Blob Container
\n
\n
\n
Azure Blob Storage is a service designed for storing large amounts of unstructured data, such as PDFs.
\n \n
\n
\n
1. To begin, create an Azure Storage account by typing `storage accounts` in the search bar and selecting Services - Storage accounts.
\n
\n
\n \n
\n \n
2. Select the +Create button.
\n
\n
\n
3. Enter the resource group name that will serve as the folder for the storage account, enter the storage account name, and select a region. When you're done, select the Review button.
\n
\n
\n
\n
\n
4. Select the Createbutton.
\n
\n
\n
\n
\n
\n
2. Store PDF Documents in Azure Blob Storage
\n
\n
1. After your storage account is set up, navigate to Storage Browser by typing `storage browser` in the search bar.
\n
\n
\n
\n
2. In the Storage Browser, select the blob storage you created.
\n
\n
\n
\n
\n
3. Add a new container to store PDF documents.
\n
\n
- Select your storage account.
\n
- Select the Blob containers button.
\n
- Select the +Add Container button to create a new container.
\n
\n
3. Once the container is set up, upload your PDFs into this container.
\n
- Select the container you created.
\n
\n
\n
\n
\n
- Select the Upload button and upload your PDF documents.
\n
\n
\n
\n
For the tutorial, I downloaded 5 PDF documents of recent papers on GPT from Microsoft Academic and uploaded them to the container.
\n
\n
\n
\n
3. Create a AI Search Service
\n
\n
\n
1. Type `ai search` into the search bar and select Services – AI Search.
\n
\n
\n \n
2. Select the +Create button.
\n
\n \n
3. Create a new AI Search Service.
\n \n
- Select your Resource Group.
\n
- Specify the Service name.
\n
- Select your Location.
\n
\n
\n
\n
NOTE:
\n
Azure OpenAI resource is currently available in limited regions.
\n
If Azure OpenAI resource is not available in your region, I recommend setting your location to East US.
\n \n
- Choose a Pricing tier that suits your needs; since semantic ranker is available from the basic tier, I recommend setting your Pricing tier to basic for the tutorial.
\n
\n
NOTE:
\n
\n
\n
In this tutorial we will use the Basic tier to explore semantic ranker with Azure AI Search. You can expect a cost of approximately $2.50 per 100 program runs with this tier.
\n
If you plan to use the free tier, please note that the code demonstrated in this tutorial may differ from what you'll need.
\n
(Azure AI Search is priced even when you're not using it. If you're just going through the tutorial for practice, I recommend deleting the Azure AI Search you created when you're done all tutorial.)
\n
\n \n
- Select the Review + create button.
\n
\n
\n
\n
\n
4. Navigate to the AI Search service you created and select Semantic ranker, then select the Free plan. (If you choose the free tier, you can skip it.)
\n
\n
\n
\n
\n
4. Connect to Data from Azure Blob Storage
\n
\n
1. Navigate to the AI Search service you created and select Import data.
\n
\n
\n
\n
\n
2. Select Azure Blob Storage as the data source and connect it to the Blob Storage where your PDFs are stored.
\n
\n
\n
\n
3. Specify your Data source name.
\n \n
4. Select Choose an existing connection and select the blob storage container you created.
\n \n
5. Select Next: Add cognitive skills button.
\n
\n
\n
\n
\n
\n
5. Add Cognitive Skills
\n \n
1. Attach AI Services
\n
- To power your cognitive skills, select an existing AI Services resource or create a new one; the Free resource(default) is sufficient for this tutorial.
\n
\n
\n \n
2. Specify the Skillset name.
\n
\n
TIP:
\n
If you want to search for text in a photo, you need to check Enable OCR and merge all text into merged_content field. In this tutorial, we will not check it because we will search based on the text in the paper.
\n \n
3. Select Enrichment granularity level. (In this tutorial, we'll use a page-by-page granularity, so we'll select Pages (5000 characters chunk).)
\n \n
4. Select Extract Key phrases. (You can select additional checkboxes depending on the type of PDF data.)
\n \n
5. Select Next: Customize target index button.
\n
\n
\n
\n \n
NOTE:
\n
Why set the Enrichment granularity level to Pages (5000 characters chunk)?
\n
To get ChatGPT responses based on a PDF, We need to call the GPT-3.5-turbo model of ChatGPT API. The GPT-3.5-turbo model can handle up to 4096 tokens, including both the text you use as input and the length of the answer the ChatGPT API returns. For this reason, documents that are too long cannot be entered all at once, but must be broken into multiple chunks and processed after multiple calls to the ChatGPT API. (Tokens can be words, punctuation, spaces, etc.)
\n
\n
TIP: \n
How to keep sensitive data private?
\n
\n
To ensure the privacy of sensitive data, Azure Cognitive Search provides a Personally Identifiable Information (PII) detection skill. This cognitive skill is specifically designed to identify and protect PII in your data. To learn more about Azure Cognitive Search's PII detection skill, read the following article.
- To enable this feature, selectExtract Personally identifiable information.
\n\n
\n
\n
6. Customize Target Index and Create an Indexer
\n
\n
1. Customize target Index.
\n \n
- Specify your Index name.
\n
- Check the boxes as shown in the image below.
\n \n
\n
TIP:
\n
\n
You can change the fields to suit your data. I have attached a document with a description of each field in the index. (Depending on your settings for the index fields, the code you implement may differ from the tutorial.)
In this tutorial, we have selected the Enrichment granularity level of Pages (5000 characters chunk). So, we need to create a field to search for pages that are separated by 5000 character chunks.
\n \n
- Select + Add field button.
\n
- Create a field named `pages`.
\n
- Select Collection(Edm.String) as the type for the `pages` field.
\n
- Check the box Retrievable.
\n
\n
\n
3. Delete unnecessary fields.
\n
\n
\n
\n
4. Create an Indexer.
\n
\n
- Specify your Indexer Name.
\n
- Select the Schedule – Once.
\n
(For data coming in in real time, you'll need to set up a schedule periodically, but since we're dealing with unchanging PDF data in this tutorial, we'll only need to schedule Once.)
\n
- Select the Submit button.
\n
\n
\n
\n
7. Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
1. Once your indexer and index creation are complete, navigate to your AI Search service and select the Indexes page.
\n
\n
2. Select the index you created.
\n
\n
\n
\n
3. You can use a query string or simply enter text to perform a search.
\n
Ex) In this tutorial, I entered the following question: `How to prompt GPT to be reliable?`
\n
\n
\n
\n
4. Set Semantic configurations.
\n
- Semantic configurations are available from the basic price tier onwards. If you chose the free tier, you can skip it.
\n
- Select Semantic configurations, then select + Add semantic configuration.
\n
\n
\n
\n
- Specify your semantic configuration Name.
\n
- Select the Title field – content.
\n
- Select the Save button.
\n
\n
\n
\n
- When you've finished setting up your semantic configuration, return and select the Save button.
\n
\n
\n
\n
\n
\n
We completed extracting key phrases based on our questions using Azure AI Search.
\n
In the next series, we'll connect this AI Search service with Azure Open AI to make a ChatGPT that answers questions based on PDFs stored in blob storage.
\n
\n
Series 2: Implement a ChatGPT Service with Azure OpenAI
\n
\n
In series2, we will implement the feature to answer questions based on PDFs using Azure AI Search and Azure OpenAI, and implement this feature in code.
\n
\n
\n
\n
\n
\n
\n
Intent of the Code Design
\n
The primary goal of the code design in this tutorial is to construct the code in a way that is easy to understand, especially for first-time viewers. Each segment of the code is encapsulated as a separate function. This modularization ensures that the main function acts as a clear, coherent guide through the logic of the system.
\n
\n
Ex. Part of the main function. (Semantic Kernel.ver)
We'll use Azure AI Search to retrieve documents related to our question, score them for relevance to our question, and extract documents with a certain score or higher.
\n
\n
Part 2: Document Embedding and Vector Database Storage
\n
We'll embed the documents we extracted in part 1. We will then store these embedded documents in a vector database, organizing them into pages (chunks of 5,000 characters each).
You must click the Savebutton with your mouse. Using the shortcut Ctrl + S doesn't actually save your changes, it just changes the color of the icon.
\n
\n
\n
6. Select the Reset button.
\n
\n
7. Select the Run button.
\n
\n
\n
\n
\n
\n \n
TIP:
\n
Description of “outputFieldMappings”
\n
\"outputFieldMappings\" are settings that map data processed by the Cognitive Search service to specific fields in the index.
\n
For example, in the path \"/document/content/pages//keyphrases/\", keywords are extracted from each page and mapped to the \"keyphrases\" field.
\n
>Similarly, for the “pages” field that we created earlier, we need to specify what data will be mapped to this field. In this tutorial, we have selected the Enrichment granularity level of Pages (5000 characters chunk). So, we need to specify that 5000-character chunks from \"/document/content/pages/\" are mapped to the \"pages\" field. We need to add JSON code to map the data to the \"pages\" field so that we can send chunks of 5000 characters to OpenAI instead of sending entire pages.
\n
\n
2. Create an Azure OpenAI
\n
\n
Currently, access to the Azure OpenAI service is granted by request only. You can request access to the Azure OpenAI service by filling out the form at https://aka.ms/oai/access/ .
\n \n
1. Type 'azure openai' in the search bar and select Services - Azure OpenAI.
\n
\n
\n
\n
2. Select the + Create button.
\n
\n
\n
\n
3. Fill in Basics.
\n
\n
\n
\n
NOTE:
\n
\n
\n
Azure OpenAI resource is currently available in limited regions.
\n
If Azure OpenAI resource is not available in your region, I recommend setting your location to East US.
\n
\n
\n
\n
4. Select a network security Type.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
5. Select the Create button.
\n
\n
\n
\n
6. Deploy your Azure OpenAI model.
\n
\n
- Navigate to your Azure OpenAI, then Select the Go to Azure OpenAI Studio button.
\n
\n
\n
\n
- In Azure openAI Studio, select the Deployments button.
\n
\n
\n
\n
- Select the + Create new deployment button, then create the gpt-35-turbo and text-embedding-ada-002 models
\n \n
NOTE:
\n
In this tutorial we will use the gpt-35-turbo and text-embedding-ada-002 models. I recommend using the same name for both the deployment name and the model name.
\n
\n
\n
\n
\n
\n
\n
3. Set up the project and install the libraries
\n \n
1. Create a folder where you can work.
\n \n
- We will create an `azure-proj` folder inside the `User` folder and work inside the `gpt-proj1` folder.
\n
- Open a command prompt window and create a folder named `azure-proj` in the default path.
\n
\n
\n
mkdir azure-proj
\n
\n
- Navigate to the `azure-proj` folder you just created.
\n
\n
\n
cd azure-proj
\n
\n
- In the same way, create a `gpt-proj1` folder inside the `azure-proj` folder. Navigate to the `gpt-proj1` folder.
\n
\n
mkdir gpt-proj\ncd gpt-proj1
\n
\n
\n
\n
2. Create a virtual environment.
\n \n
- Type the following command to create a virtual environment named `.venv`.
\n
\n
\n
Python -m venv .venv
\n
\n
- Once the virtual environment is created, type the following command to activate the virtual environment.
\n
\n
\n
.venv\\Scripts\\activate.bat
\n
\n
- Once activated, the name of the virtual environment will appear on the far left of the command prompt window.
\n
\n
\n
\n
3. Install the required packages.
\n
- At the Command prompt, type the following command.
Select TERMINAL at the bottom of VS Code, then select the + button, then select the Command Prompt.
\n
\n
\n
4. Set up the project in VS Code
\n
\n
1. In VS Code, select the folder that you have created.
\n \n
- Open VS Code and select File > Open Folder from the menu. Select the gpt-proj1 folder that you created earlier, which is located at C:\\Users\\yourUserName\\azure-proj\\gpt-proj1.
\n
\n
\n
\n
2. Create a new file.
\n \n
- In the left pane of VS Code, right-click and select New File to create a new file named example.py.
\n
\n
\n
\n
3. Import the required packages.
\n \n
- Type the following code in the example.py file in VS Code.
- Create a config.py file. This file should contain information about your Azure.
\n
- Add the code below to your config.py file.
\n
\n
\n
# Azure AI Search service settings\nSEARCH_SERVICE_NAME = 'your-search-service-name' # 'teachchatgpt-search'\nSEARCH_SERVICE_ENDPOINT = f'https://{SEARCH_SERVICE_NAME.lower()}.search.windows.net/'\nSEARCH_SERVICE_KEY = 'your-search-service-key'\nSEARCH_SERVICE_API_VERSION = 'your-API-version' # '2023-10-01-Preview'\n\n# Azure AI Search service index settings\nSEARCH_SERVICE_INDEX_NAME1 = 'your-search-service-index-name' # 'teachchatgpt-index'\n\n# Azure AI Search service semantic configuration settings\nSEARCH_SERVICE_SEMANTIC_CONFIG_NAME = 'your-semantic-configuration-name' # 'teachchatgpt-config'\n\n# Azure OpenAI settings\nAZURE_OPENAI_NAME = 'your-openai-name' # 'teachchatgpt-azureopenai'\nAZURE_OPENAI_ENDPOINT = f'https://{AZURE_OPENAI_NAME.lower()}.openai.azure.com/'\nAZURE_OPENAI_KEY = 'your-openai-key'\nAZURE_OPENAI_API_VERSION = 'your-API-version' # '2024-02-15-preview'
\n
\n
\n
5. Fill in your config.py file with your Azure information.
\n \n
NOTE:
\n
You'll need to include information about your Azure AI Search Service name, index name, semantic configuration name, key, and API version, and Azure OpenAI name, key, and API version.
\n \n
TIP:
\n
Find your Azure information
\n
1. Find the Azure AI Search Keys.
\n
\n
- Navigate to your AI Search service, then select Keys, then copy and paste your key into the config.py file.
\n
\n
\n
\n
2. Find the Azure AI Search Index name.
\n
\n
- Navigate to your AI Search service, then select Indexes, then copy and paste your index name into the config.py file.
\n
\n
\n
\n
3. Find the Azure AI Search Semantic configuration name.
\n
\n
- Navigate to your AI Search service, select Indexes, and then click your index name.
\n
- Select Semantic configurations and copy and paste your Semantic configuration name into the config.py file.
\n
\n
\n
\n
4. Find the Azure OpenAI Keys.
\n
\n
- Navigate to your Azure OpenAI, then select Keys and Endpoint, then copy and paste your key into the config.py file
\n
\n
\n
\n
5. Choose your Azure AI Search API and Azure OpenAI version.
\n
\n
- Select your version of the Azure AI Search API and Azure OpenAI API using the hyperlinks below.
- I have selected the latest version of the Azure AI Search API, 2023-10-01-Preview, and the Azure OpenAI API, 2024-02-15-Preview.
\n
\n
5. Search with Azure AI Search
\n
\n
\n
\n
In this section, we'll use Azure Cognitive Search within VS Code. We have already installed all the necessary packages in the previous chapter. Now we will focus on how to use Azure AI Search and Azure OpenAI in VS Code.
\n
In Chapters 5 and 6, we'll create functions that use Azure AI Service and Azure OpenAI and use them in example.py.
\n
To use Azure AI Search and Azure OpenAI, we need to import the information from Azure that we entered in config.py into example.py that we created earlier.
\n
All the following code comes from example.py.
\n
The full code is provided at the end of the chapter for your convenience.
\n
\n
1. Add code to example.py that imports the values from config.py.
# Azure AI Search service header settings\nHEADERS = {\n 'Content-Type': 'application/json',\n 'api-key': SEARCH_SERVICE_KEY\n}
\n
\n
3. Now, we will create functions related to Azure AI Search and run them from the main function.
\n \n
- Add the following code to the example.py file to create the `search_documents` function that retrieves documents related to your question.
\n
\n
\n
\ndef search_documents(question):\n \"\"\"Search documents using Azure AI Search.\"\"\"\n # Construct the Azure AI Search service access URL.\n url = (SEARCH_SERVICE_ENDPOINT + 'indexes/' +\n SEARCH_SERVICE_INDEX_NAME1 + '/docs')\n \n # Create a parameter dictionary.\n params = {\n 'api-version': SEARCH_SERVICE_API_VERSION,\n 'search': question,\n 'select': '*',\n # '$top': 5, Extract the top 5 documents from your storage.\n '$top': 5,\n 'queryLanguage': 'en-us',\n 'queryType': 'semantic',\n 'semanticConfiguration': SEARCH_SERVICE_SEMANTIC_CONFIG_NAME,\n '$count': 'true',\n 'speller': 'lexicon',\n 'answers': 'extractive|count-3',\n 'captions': 'extractive|highlight-false'\n }\n # Make a GET request to the Azure AI Search service and store the response in a variable.\n resp = requests.get(url, headers=HEADERS, params=params)\n # Return the JSON response containing the search results.\n search_results = resp.json()\n\n return search_results
\n
\n
\n
\n
- Add the following code to the example.py file to create the `filter_documents` function that extracts documents with a certain score or higher based on how relevant it is to your question.
\n
\n
def filter_documents(search_results):\n \"\"\"Filter documents with a reranker score above a certain threshold.\"\"\"\n documents = OrderedDict()\n for result in search_results['value']:\n # The '@search.rerankerScore' range is 0 to 4.00, where a higher score indicates a stronger semantic match.\n if result['@search.rerankerScore'] > 0.8:\n documents[result['metadata_storage_path']] = {\n 'chunks': result['pages'][:10],\n 'captions': result['@search.captions'][:10],\n 'score': result['@search.rerankerScore'],\n 'file_name': result['metadata_storage_name']\n }\n\n return documents
\n
\n
\n
\n
\n
4. Now we'll run the code using the above functions in the main function.
\n \n
- Add the following code to the example.py file to create the `main` function.
\n
- When you run it, you'll see the total number of PDFs in the blob storage, the top few documents adopted, and the number of chunks.
\n
- I asked the question, 'Tell me about effective prompting strategies' based on the paper I had stored on the blob storage.
\n
- If you want to see the full search results, add `print(search_results)` to your main function.
\n
\n
\n
\n
\n
def main():\n\n QUESTION = 'Tell me about effective prompting strategies'\n\n # Search for documents with Azure AI Search\n\n search_results = search_documents(QUESTION)\n\n documents = filter_documents(search_results)\n\n print('Total Documents Found: {}, Top Documents: {}'.format(\n search_results['@odata.count'], len(search_results['value'])))\n\n\n # 'chunks' is the value that corresponds to the Pages field that you set up in the AI Search service.\n docs = []\n for key,value in file_content.items():\n for page in value['chunks']:\n docs.append(Document(page_content = page,\n metadata={\"source\": value[\"file_name\"]}))\n\n# execute the main function\nif __name__ == \"__main__\":\n main()
\n
6. Get answers from PDF content using Azure OpenAI and AI Search
\n
\n
Now that Azure AI Search is working well in VS Code, it's time to start using Azure OpenAI. In this chapter, we'll create functions related to Azure OpenAI and ultimately create and run a program in example.py file that answers a question with Azure OpenAI based on the search information from Azure AI Search.
\n
1. We will create functions related to Azure OpenAI and Lang Chain and run them from the main function.
\n
- Add the following code to the example.py file to create the `create_embeddings` function that creates an embedding model.
- Add the following code to the example.py file to create the `store_documents` function that stores the extracted documents in a vector database.
\n
\n
\ndef store_documents(docs, embeddings):\n \"\"\"Create vector store and store documents in the vector store.\"\"\"\n return FAISS.from_documents(docs, embeddings)\n
\n
\n
- Add the following code to the example.py file to create the `answer_with_langchain` function that extracts the chunk associated with a question stored in the vector database and answers the question based on it.
\n
\n
def answer_with_langchain(vector_store, question):\n \"\"\"Search for documents related to your question from the vector store\n and answer question with search result using Lang Chain.\"\"\"\n\n # Add a chat service.\n llm = AzureChatOpenAI(\n openai_api_key = AZURE_OPENAI_KEY,\n azure_endpoint = AZURE_OPENAI_ENDPOINT,\n openai_api_version= AZURE_OPENAI_API_VERSION,\n azure_deployment = 'gpt-35-turbo',\n temperature=0.0,\n max_tokens=500\n )\n\n chain = RetrievalQAWithSourcesChain.from_chain_type(\n llm=llm,\n chain_type='stuff',\n retriever=vector_store.as_retriever(),\n return_source_documents=True\n )\n\n answer = chain.invoke({'question': question})\n\n return answer
\n
2. Modify the `main` function to match this code.
\n
\n
\n
def main():\n\n QUESTION = 'Tell me about effective prompting strategies'\n\n # Search for documents with Azure AI Search.\n\n search_results = search_documents(QUESTION)\n\n documents = filter_documents(search_results)\n\n print('Total Documents Found: {}, Top Documents: {}'.format(\n search_results['@odata.count'], len(search_results['value'])))\n\n\n # 'chunks' is the value that corresponds to the Pages field that you set up in the AI Search service.\n docs = []\n for key,value in documents.items():\n for page in value['chunks']:\n docs.append(Document(page_content = page,\n metadata={\"source\": value[\"file_name\"]}))\n\n # Answer your question using Lang Chain.\n\n embeddings = create_embeddings()\n\n vector_store = store_documents(docs, embeddings)\n\n result = answer_with_langchain(vector_store, QUESTION)\n\n print('Question: ', QUESTION)\n print('Answer: ', result['answer'])\n print('Reference: ', result['sources'].replace(\",\",\"\\n\"))
\n
\n
\n
3. Now let's run it and see if it answers your question. - The result of executing the code.
\n
Total Documents Found: 5, Top Documents: 3 Number of chunks: 10 Question: Tell me about effective prompting strategies Answer: Effective prompting strategies for improving the reliability of GPT-3 include establishing simple prompts that improve GPT-3's reliability in terms of generalizability, social biases, calibration, and factuality. These strategies include prompting with randomly sampled examples from the source domain, using examples sampled from a balanced demographic distribution and natural language intervention to reduce social biases, calibrating output probabilities, and updating the LLM's factual knowledge and reasoning chains. Natural language intervention can also effectively guide model predictions towards better fairness. Reference: Prompting GPT-3 To Be Reliable.pdf
\n
\n
\n
NOTE: Full code for example.py and config.py
\n
\n
This chapter is designed to provide all the code used in the tutorial. It is a separate section from the rest of the tutorial.
\n
For your convenience, I've attached the full code used in the tutorial.
\n
\n
1. config.py
\n
\n
# Azure AI Search service settings\nSEARCH_SERVICE_NAME = 'teachchatgpt-search' # 'teachchatgpt-search'\nSEARCH_SERVICE_ENDPOINT = f'https://{SEARCH_SERVICE_NAME.lower()}.search.windows.net/'\nSEARCH_SERVICE_KEY = 'lDdgBQSnG4f0uAZixTMgr9nSOa4VvmeVux4Nac9iQXAzSeBm7ToL'\nSEARCH_SERVICE_API_VERSION = '2023-10-01-Preview' # '2023-10-01-Preview'\n\n# Azure AI Search service index settings\nSEARCH_SERVICE_INDEX_NAME1 = 'teachchatgpt-index' # 'teachchatgpt-index'\n\n# Azure AI Search service semantic configuration settings\nSEARCH_SERVICE_SEMANTIC_CONFIG_NAME = 'teachchatgpt-config' # 'teachchatgpt-config'\n\n# Azure OpenAI settings\nAZURE_OPENAI_NAME = 'teachchatgpt-azureopenai' # 'teachchatgpt-azureopenai'\nAZURE_OPENAI_ENDPOINT = f'https://{AZURE_OPENAI_NAME.lower()}.openai.azure.com/'\nAZURE_OPENAI_KEY = 'fdfcd358b26343c293d3dff4643f1aee'\nAZURE_OPENAI_API_VERSION = '2024-02-15-preview' # '2024-02-15-preview'\n
\n
\n
\n
2. example.py
\n
\n
\n
\n
# Library imports\nfrom collections import OrderedDict\nimport requests\n\n# Lang Chain library imports\nfrom langchain.chains import RetrievalQAWithSourcesChain\nfrom langchain_openai import AzureOpenAIEmbeddings\nfrom langchain_openai.chat_models import AzureChatOpenAI\nfrom langchain.docstore.document import Document\nfrom langchain_community.vectorstores import FAISS\n\n# Configuration imports\nfrom config import (\n SEARCH_SERVICE_ENDPOINT,\n SEARCH_SERVICE_KEY,\n SEARCH_SERVICE_API_VERSION,\n SEARCH_SERVICE_INDEX_NAME1,\n SEARCH_SERVICE_SEMANTIC_CONFIG_NAME,\n AZURE_OPENAI_ENDPOINT,\n AZURE_OPENAI_KEY,\n AZURE_OPENAI_API_VERSION,\n)\n\n# Azure AI Search service header settings\nHEADERS = {\n 'Content-Type': 'application/json',\n 'api-key': SEARCH_SERVICE_KEY\n}\n\ndef search_documents(question):\n \"\"\"Search documents using Azure AI Search.\"\"\"\n # Construct the Azure AI Search service access URL.\n url = (SEARCH_SERVICE_ENDPOINT + 'indexes/' +\n SEARCH_SERVICE_INDEX_NAME1 + '/docs')\n \n # Create a parameter dictionary.\n params = {\n 'api-version': SEARCH_SERVICE_API_VERSION,\n 'search': question,\n 'select': '*',\n # '$top': 5, Extract the top 5 documents from your storage.\n '$top': 5,\n 'queryLanguage': 'en-us',\n 'queryType': 'semantic',\n 'semanticConfiguration': SEARCH_SERVICE_SEMANTIC_CONFIG_NAME,\n '$count': 'true',\n 'speller': 'lexicon',\n 'answers': 'extractive|count-3',\n 'captions': 'extractive|highlight-false'\n }\n # Make a GET request to the Azure AI Search service and store the response in a variable.\n resp = requests.get(url, headers=HEADERS, params=params)\n # Return the JSON response containing the search results.\n search_results = resp.json()\n\n return search_results\n\ndef filter_documents(search_results):\n \"\"\"Filter documents with a reranker score above a certain threshold.\"\"\"\n documents = OrderedDict()\n for result in search_results['value']:\n # The '@search.rerankerScore' range is 0 to 4.00, where a higher score indicates a stronger semantic match.\n if result['@search.rerankerScore'] > 0.8:\n documents[result['metadata_storage_path']] = {\n 'chunks': result['pages'][:10],\n 'captions': result['@search.captions'][:10],\n 'score': result['@search.rerankerScore'],\n 'file_name': result['metadata_storage_name']\n }\n\n return documents\n\ndef create_embeddings():\n \"\"\"Create an embedding model.\"\"\"\n embeddings = AzureOpenAIEmbeddings(\n openai_api_key = AZURE_OPENAI_KEY,\n azure_endpoint = AZURE_OPENAI_ENDPOINT,\n openai_api_version = AZURE_OPENAI_API_VERSION,\n openai_api_type = 'azure',\n azure_deployment = 'text-embedding-ada-002',\n model = 'text-embedding-ada-002',\n chunk_size=1\n )\n return embeddings\n\ndef store_documents(docs, embeddings):\n \"\"\"Create vector store and store documents in the vector store.\"\"\"\n return FAISS.from_documents(docs, embeddings)\n\ndef answer_with_langchain(vector_store, question):\n \"\"\"Search for documents related to your question from the vector store\n and answer question with search result using Lang Chain.\"\"\"\n\n # Add a chat service.\n llm = AzureChatOpenAI(\n openai_api_key = AZURE_OPENAI_KEY,\n azure_endpoint = AZURE_OPENAI_ENDPOINT,\n openai_api_version= AZURE_OPENAI_API_VERSION,\n azure_deployment = 'gpt-35-turbo',\n temperature=0.0,\n max_tokens=500\n )\n\n chain = RetrievalQAWithSourcesChain.from_chain_type(\n llm=llm,\n chain_type='stuff',\n retriever=vector_store.as_retriever(),\n return_source_documents=True\n )\n\n answer = chain.invoke({'question': question})\n\n return answer\n\ndef main():\n QUESTION = 'Tell me about effective prompting strategies'\n\n # Search for documents with Azure AI Search.\n\n search_results = search_documents(QUESTION)\n\n documents = filter_documents(search_results)\n\n print('Total Documents Found: {}, Top Documents: {}'.format(\n search_results['@odata.count'], len(search_results['value'])))\n\n \n # 'chunks' is the value that corresponds to the Pages field that you set up in the AI Search service.\n docs = []\n for key,value in documents.items():\n for page in value['chunks']:\n docs.append(Document(page_content = page,\n metadata={\"source\": value[\"file_name\"]}))\n\n # Answer your question using Lang Chain.\n\n embeddings = create_embeddings()\n\n vector_store = store_documents(docs, embeddings)\n\n result = answer_with_langchain(vector_store, QUESTION)\n\n print('Question: ', QUESTION)\n print('Answer: ', result['answer'])\n print('Reference: ', result['sources'].replace(\",\",\"\\n\"))\n\n# Execute the main function.\nif __name__ == \"__main__\":\n main()
\n
Congratulations!
\n
\n
You've completed this tutorial
\n \n
\n
\n
Congratulations! You've learned the integration tutorial of Azure AI Search with Azure OpenAI
\n
\n
\n
\n
\n
\n
\n
In this tutorial, we have navigated through a practical journey of integrating Azure Blob Storage, Azure AI Search, and Azure OpenAI to create a powerful search and response mechanism.
\n
\n
\n \n
1. Storing Data in Azure Blob Storage
\n \n
Our first step was to efficiently store PDF files in Azure Blob Storage, an unstructured data store known for its scalability and security. This storage served as a foundational base, housing the search material that would later be indexed and queried to retrieve relevant information.
\n \n
2. Implementing Azure AI Search
\n \n
\n
\n
In the next step, we used Azure AI Search to search based on the data we had stored in Azure Blob Storage. This powerful service was instrumental in indexing and searching the data stored in Azure Blob Storage.
\n
\n
\n \n
3. Integrating Azure OpenAI with VS Code
\n \n
\n
The final step of our tutorial was to integrate Azure OpenAI through a program created in VS Code. This program was designed to use the search information processed and refined by Azure AI Search to generate accurate and contextually relevant answers. The synergy between these technologies illustrated the seamless interplay of storage, search, and response mechanisms.
\n
I hope that the knowledge and skills imparted will serve as invaluable tools in your future projects. The harmonious integration of Azure Blob Storage, Azure AI Search, and Azure OpenAI represents the pinnacle of unstructured data management and utilization.
\n
Thank you for your commitment and hard work throughout this learning journey.
\n
\n
\n
\n
\n
\n
\n
Clean Up Azure Resources
\n
\n
Cleanup your Azure resources to avoid additional charges to your account. Go to the Azure portal and delete the following resources:
Can't I just copy and paste text from a PDF file to teach ChatGPT?
\n
\n
The purpose of this tutorial is to explain how to efficiently extract and use information from large amounts of PDFs. Dealing with a 5-page PDF can be straightforward, but it's a different story when you're dealing with complex documents of 100+ pages. In these situations, the integration of Azure AI Search with Azure OpenAI enables fast and accurate information retrieval and processing. In this tutorial, we handle 5 PDFs, but you can apply this method to scale to handle more than 10,000 files. In this two-part series, we will explore how to build intelligent service using Azure. In Series 1, we'll use Azure AI Search to extract keywords from unstructured data stored in Azure Blob Storage. In Series 2, we'll Create a feature to answer questions based on PDF documents using Azure OpenAI. Here is an overview of this tutorial.
\n
\n
\n
\n
This tutorial is related to the following topics
\n
\n
- AI Engineer
\n
- Developer
\n
- Azure Blob Storage
\n
- Azure AI Search
\n
- Azure OpenAI
\n
\n
Learning objectives
\n
\n
In this tutorial, you'll learn the following:
\n
- How to store your unstructured data in Azure Blob Storage.
\n
\n
- How to create search experiences based on data stored in Blob Storage with Azure AI Search.
\n
- Learn how to teach ChatGPT to answer questions based on your PDF content using Azure AI search and Azure OpenAI.
Microsoft Cloud Technologies used in this Tutorial
\n
\n
\n
\n
- Azure Blob Storage
\n
- Azure AI Search
\n
- Azure OpenAI Service
\n
\n
\n
\n
Table of Contents
\n
\n
Series 1: Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
1. Create a Blob Container
\n
2. Store PDF Documents in Azure Blob Storage
\n
3. Create an AI Search Service
\n
4. Connect to Data from Azure Blob Storage
\n
5. Add Cognitive Skills
\n
6. Customize Target Index and Create an Indexer
\n
7. Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
Series 2: Implement a ChatGPT Service with Azure OpenAI
\n
\n
\n
1. Change your indexer settings to use Azure OpenAI
\n
2. Create an Azure OpenAI
\n
3. Set up the project and install the libraries
\n
4. Set up the project in VS Code
\n
5. Search with Azure AI Search
\n
6. Get answers from PDF content using Azure OpenAI and AI Search
\n
7. Note: Full code for example.py and config.py
\n
\n
\n
\n
Series 1: Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
In Series 1, we'll use Azure AI Search to extract key phrases from unstructured data stored in Azure Blob Storage.
\n
\n
\n
\n
\n
\n
\n
\n
This series is designed to guide you through the essential steps of storing, connecting, and searching data in the cloud.
\n
\n
\n
\n
Overview of Series 1
\n
\n
\n
\n
\n
\n
1. Store Unstructured Data in the Cloud
\n
\n
We'll begin by exploring how to store unstructured data, such as PDFs, in the cloud. This section covers the basics of uploading data in Azure Blob Storage.
\n \n
2. Connect Stored Data to Azure AI Search
\n \n
Once our data is stored in the cloud, the next step is to connect that data to Azure AI Search.
\n \n
3. Search Stored Data
\n \n
In this final step of Series 1, we'll set up an index on the data you connect to and search based on the data you store in the cloud to retrieve results in Azure AI Search. So we can efficiently retrieve and use the data stored in Azure Blob Storage.
\n
\n
\n
\n
1. Create a Blob Container
\n
\n
\n
Azure Blob Storage is a service designed for storing large amounts of unstructured data, such as PDFs.
\n \n
\n
\n
1. To begin, create an Azure Storage account by typing `storage accounts` in the search bar and selecting Services - Storage accounts.
\n
\n
\n \n
\n \n
2. Select the +Create button.
\n
\n
\n
3. Enter the resource group name that will serve as the folder for the storage account, enter the storage account name, and select a region. When you're done, select the Review button.
\n
\n
\n
\n
\n
4. Select the Createbutton.
\n
\n
\n
\n
\n
\n
2. Store PDF Documents in Azure Blob Storage
\n
\n
1. After your storage account is set up, navigate to Storage Browser by typing `storage browser` in the search bar.
\n
\n
\n
\n
2. In the Storage Browser, select the blob storage you created.
\n
\n
\n
\n
\n
3. Add a new container to store PDF documents.
\n
\n
- Select your storage account.
\n
- Select the Blob containers button.
\n
- Select the +Add Container button to create a new container.
\n
\n
3. Once the container is set up, upload your PDFs into this container.
\n
- Select the container you created.
\n
\n
\n
\n
\n
- Select the Upload button and upload your PDF documents.
\n
\n
\n
\n
For the tutorial, I downloaded 5 PDF documents of recent papers on GPT from Microsoft Academic and uploaded them to the container.
\n
\n
\n
\n
3. Create a AI Search Service
\n
\n
\n
1. Type `ai search` into the search bar and select Services – AI Search.
\n
\n
\n \n
2. Select the +Create button.
\n
\n \n
3. Create a new AI Search Service.
\n \n
- Select your Resource Group.
\n
- Specify the Service name.
\n
- Select your Location.
\n
\n
\n
\n
NOTE:
\n
Azure OpenAI resource is currently available in limited regions.
\n
If Azure OpenAI resource is not available in your region, I recommend setting your location to East US.
\n \n
- Choose a Pricing tier that suits your needs; since semantic ranker is available from the basic tier, I recommend setting your Pricing tier to basic for the tutorial.
\n
\n
NOTE:
\n
\n
\n
In this tutorial we will use the Basic tier to explore semantic ranker with Azure AI Search. You can expect a cost of approximately $2.50 per 100 program runs with this tier.
\n
If you plan to use the free tier, please note that the code demonstrated in this tutorial may differ from what you'll need.
\n
(Azure AI Search is priced even when you're not using it. If you're just going through the tutorial for practice, I recommend deleting the Azure AI Search you created when you're done all tutorial.)
\n
\n \n
- Select the Review + create button.
\n
\n
\n
\n
\n
4. Navigate to the AI Search service you created and select Semantic ranker, then select the Free plan. (If you choose the free tier, you can skip it.)
\n
\n
\n
\n
\n
4. Connect to Data from Azure Blob Storage
\n
\n
1. Navigate to the AI Search service you created and select Import data.
\n
\n
\n
\n
\n
2. Select Azure Blob Storage as the data source and connect it to the Blob Storage where your PDFs are stored.
\n
\n
\n
\n
3. Specify your Data source name.
\n \n
4. Select Choose an existing connection and select the blob storage container you created.
\n \n
5. Select Next: Add cognitive skills button.
\n
\n
\n
\n
\n
\n
5. Add Cognitive Skills
\n \n
1. Attach AI Services
\n
- To power your cognitive skills, select an existing AI Services resource or create a new one; the Free resource(default) is sufficient for this tutorial.
\n
\n
\n \n
2. Specify the Skillset name.
\n
\n
TIP:
\n
If you want to search for text in a photo, you need to check Enable OCR and merge all text into merged_content field. In this tutorial, we will not check it because we will search based on the text in the paper.
\n \n
3. Select Enrichment granularity level. (In this tutorial, we'll use a page-by-page granularity, so we'll select Pages (5000 characters chunk).)
\n \n
4. Select Extract Key phrases. (You can select additional checkboxes depending on the type of PDF data.)
\n \n
5. Select Next: Customize target index button.
\n
\n
\n
\n \n
NOTE:
\n
Why set the Enrichment granularity level to Pages (5000 characters chunk)?
\n
To get ChatGPT responses based on a PDF, We need to call the GPT-3.5-turbo model of ChatGPT API. The GPT-3.5-turbo model can handle up to 4096 tokens, including both the text you use as input and the length of the answer the ChatGPT API returns. For this reason, documents that are too long cannot be entered all at once, but must be broken into multiple chunks and processed after multiple calls to the ChatGPT API. (Tokens can be words, punctuation, spaces, etc.)
\n
\n
TIP: \n
How to keep sensitive data private?
\n
\n
To ensure the privacy of sensitive data, Azure Cognitive Search provides a Personally Identifiable Information (PII) detection skill. This cognitive skill is specifically designed to identify and protect PII in your data. To learn more about Azure Cognitive Search's PII detection skill, read the following article.
- To enable this feature, selectExtract Personally identifiable information.
\n\n
\n
\n
6. Customize Target Index and Create an Indexer
\n
\n
1. Customize target Index.
\n \n
- Specify your Index name.
\n
- Check the boxes as shown in the image below.
\n \n
\n
TIP:
\n
\n
You can change the fields to suit your data. I have attached a document with a description of each field in the index. (Depending on your settings for the index fields, the code you implement may differ from the tutorial.)
In this tutorial, we have selected the Enrichment granularity level of Pages (5000 characters chunk). So, we need to create a field to search for pages that are separated by 5000 character chunks.
\n \n
- Select + Add field button.
\n
- Create a field named `pages`.
\n
- Select Collection(Edm.String) as the type for the `pages` field.
\n
- Check the box Retrievable.
\n
\n
\n
3. Delete unnecessary fields.
\n
\n
\n
\n
4. Create an Indexer.
\n
\n
- Specify your Indexer Name.
\n
- Select the Schedule – Once.
\n
(For data coming in in real time, you'll need to set up a schedule periodically, but since we're dealing with unchanging PDF data in this tutorial, we'll only need to schedule Once.)
\n
- Select the Submit button.
\n
\n
\n
\n
7. Extract Key Phrases for Search Queries Using Azure AI Search
\n
\n
\n
1. Once your indexer and index creation are complete, navigate to your AI Search service and select the Indexes page.
\n
\n
2. Select the index you created.
\n
\n
\n
\n
3. You can use a query string or simply enter text to perform a search.
\n
Ex) In this tutorial, I entered the following question: `How to prompt GPT to be reliable?`
\n
\n
\n
\n
4. Set Semantic configurations.
\n
- Semantic configurations are available from the basic price tier onwards. If you chose the free tier, you can skip it.
\n
- Select Semantic configurations, then select + Add semantic configuration.
\n
\n
\n
\n
- Specify your semantic configuration Name.
\n
- Select the Title field – content.
\n
- Select the Save button.
\n
\n
\n
\n
- When you've finished setting up your semantic configuration, return and select the Save button.
\n
\n
\n
\n
\n
\n
We completed extracting key phrases based on our questions using Azure AI Search.
\n
In the next series, we'll connect this AI Search service with Azure Open AI to make a ChatGPT that answers questions based on PDFs stored in blob storage.
\n
\n
Series 2: Implement a ChatGPT Service with Azure OpenAI
\n
\n
In series2, we will implement the feature to answer questions based on PDFs using Azure AI Search and Azure OpenAI, and implement this feature in code.
\n
\n
\n
\n
\n
\n
\n
Intent of the Code Design
\n
The primary goal of the code design in this tutorial is to construct the code in a way that is easy to understand, especially for first-time viewers. Each segment of the code is encapsulated as a separate function. This modularization ensures that the main function acts as a clear, coherent guide through the logic of the system.
\n
\n
Ex. Part of the main function. (Semantic Kernel.ver)
We'll use Azure AI Search to retrieve documents related to our question, score them for relevance to our question, and extract documents with a certain score or higher.
\n
\n
Part 2: Document Embedding and Vector Database Storage
\n
We'll embed the documents we extracted in part 1. We will then store these embedded documents in a vector database, organizing them into pages (chunks of 5,000 characters each).
You must click the Savebutton with your mouse. Using the shortcut Ctrl + S doesn't actually save your changes, it just changes the color of the icon.
\n
\n
\n
6. Select the Reset button.
\n
\n
7. Select the Run button.
\n
\n
\n
\n
\n
\n \n
TIP:
\n
Description of “outputFieldMappings”
\n
\"outputFieldMappings\" are settings that map data processed by the Cognitive Search service to specific fields in the index.
\n
For example, in the path \"/document/content/pages//keyphrases/\", keywords are extracted from each page and mapped to the \"keyphrases\" field.
\n
>Similarly, for the “pages” field that we created earlier, we need to specify what data will be mapped to this field. In this tutorial, we have selected the Enrichment granularity level of Pages (5000 characters chunk). So, we need to specify that 5000-character chunks from \"/document/content/pages/\" are mapped to the \"pages\" field. We need to add JSON code to map the data to the \"pages\" field so that we can send chunks of 5000 characters to OpenAI instead of sending entire pages.
\n
\n
2. Create an Azure OpenAI
\n
\n
Currently, access to the Azure OpenAI service is granted by request only. You can request access to the Azure OpenAI service by filling out the form at https://aka.ms/oai/access/ .
\n \n
1. Type 'azure openai' in the search bar and select Services - Azure OpenAI.
\n
\n
\n
\n
2. Select the + Create button.
\n
\n
\n
\n
3. Fill in Basics.
\n
\n
\n
\n
NOTE:
\n
\n
\n
Azure OpenAI resource is currently available in limited regions.
\n
If Azure OpenAI resource is not available in your region, I recommend setting your location to East US.
\n
\n
\n
\n
4. Select a network security Type.
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
5. Select the Create button.
\n
\n
\n
\n
6. Deploy your Azure OpenAI model.
\n
\n
- Navigate to your Azure OpenAI, then Select the Go to Azure OpenAI Studio button.
\n
\n
\n
\n
- In Azure openAI Studio, select the Deployments button.
\n
\n
\n
\n
- Select the + Create new deployment button, then create the gpt-35-turbo and text-embedding-ada-002 models
\n \n
NOTE:
\n
In this tutorial we will use the gpt-35-turbo and text-embedding-ada-002 models. I recommend using the same name for both the deployment name and the model name.
\n
\n
\n
\n
\n
\n
\n
3. Set up the project and install the libraries
\n \n
1. Create a folder where you can work.
\n \n
- We will create an `azure-proj` folder inside the `User` folder and work inside the `gpt-proj1` folder.
\n
- Open a command prompt window and create a folder named `azure-proj` in the default path.
\n
\n
\n
mkdir azure-proj
\n
\n
- Navigate to the `azure-proj` folder you just created.
\n
\n
\n
cd azure-proj
\n
\n
- In the same way, create a `gpt-proj1` folder inside the `azure-proj` folder. Navigate to the `gpt-proj1` folder.
\n
\n
mkdir gpt-proj\ncd gpt-proj1
\n
\n
\n
\n
2. Create a virtual environment.
\n \n
- Type the following command to create a virtual environment named `.venv`.
\n
\n
\n
Python -m venv .venv
\n
\n
- Once the virtual environment is created, type the following command to activate the virtual environment.
\n
\n
\n
.venv\\Scripts\\activate.bat
\n
\n
- Once activated, the name of the virtual environment will appear on the far left of the command prompt window.
\n
\n
\n
\n
3. Install the required packages.
\n
- At the Command prompt, type the following command.
Select TERMINAL at the bottom of VS Code, then select the + button, then select the Command Prompt.
\n
\n
\n
4. Set up the project in VS Code
\n
\n
1. In VS Code, select the folder that you have created.
\n \n
- Open VS Code and select File > Open Folder from the menu. Select the gpt-proj1 folder that you created earlier, which is located at C:\\Users\\yourUserName\\azure-proj\\gpt-proj1.
\n
\n
\n
\n
2. Create a new file.
\n \n
- In the left pane of VS Code, right-click and select New File to create a new file named example.py.
\n
\n
\n
\n
3. Import the required packages.
\n \n
- Type the following code in the example.py file in VS Code.
- Create a config.py file. This file should contain information about your Azure.
\n
- Add the code below to your config.py file.
\n
\n
\n
# Azure AI Search service settings\nSEARCH_SERVICE_NAME = 'your-search-service-name' # 'teachchatgpt-search'\nSEARCH_SERVICE_ENDPOINT = f'https://{SEARCH_SERVICE_NAME.lower()}.search.windows.net/'\nSEARCH_SERVICE_KEY = 'your-search-service-key'\nSEARCH_SERVICE_API_VERSION = 'your-API-version' # '2023-10-01-Preview'\n\n# Azure AI Search service index settings\nSEARCH_SERVICE_INDEX_NAME1 = 'your-search-service-index-name' # 'teachchatgpt-index'\n\n# Azure AI Search service semantic configuration settings\nSEARCH_SERVICE_SEMANTIC_CONFIG_NAME = 'your-semantic-configuration-name' # 'teachchatgpt-config'\n\n# Azure OpenAI settings\nAZURE_OPENAI_NAME = 'your-openai-name' # 'teachchatgpt-azureopenai'\nAZURE_OPENAI_ENDPOINT = f'https://{AZURE_OPENAI_NAME.lower()}.openai.azure.com/'\nAZURE_OPENAI_KEY = 'your-openai-key'\nAZURE_OPENAI_API_VERSION = 'your-API-version' # '2024-02-15-preview'
\n
\n
\n
5. Fill in your config.py file with your Azure information.
\n \n
NOTE:
\n
You'll need to include information about your Azure AI Search Service name, index name, semantic configuration name, key, and API version, and Azure OpenAI name, key, and API version.
\n \n
TIP:
\n
Find your Azure information
\n
1. Find the Azure AI Search Keys.
\n
\n
- Navigate to your AI Search service, then select Keys, then copy and paste your key into the config.py file.
\n
\n
\n
\n
2. Find the Azure AI Search Index name.
\n
\n
- Navigate to your AI Search service, then select Indexes, then copy and paste your index name into the config.py file.
\n
\n
\n
\n
3. Find the Azure AI Search Semantic configuration name.
\n
\n
- Navigate to your AI Search service, select Indexes, and then click your index name.
\n
- Select Semantic configurations and copy and paste your Semantic configuration name into the config.py file.
\n
\n
\n
\n
4. Find the Azure OpenAI Keys.
\n
\n
- Navigate to your Azure OpenAI, then select Keys and Endpoint, then copy and paste your key into the config.py file
\n
\n
\n
\n
5. Choose your Azure AI Search API and Azure OpenAI version.
\n
\n
- Select your version of the Azure AI Search API and Azure OpenAI API using the hyperlinks below.
- I have selected the latest version of the Azure AI Search API, 2023-10-01-Preview, and the Azure OpenAI API, 2024-02-15-Preview.
\n
\n
5. Search with Azure AI Search
\n
\n
\n
\n
In this section, we'll use Azure Cognitive Search within VS Code. We have already installed all the necessary packages in the previous chapter. Now we will focus on how to use Azure AI Search and Azure OpenAI in VS Code.
\n
In Chapters 5 and 6, we'll create functions that use Azure AI Service and Azure OpenAI and use them in example.py.
\n
To use Azure AI Search and Azure OpenAI, we need to import the information from Azure that we entered in config.py into example.py that we created earlier.
\n
All the following code comes from example.py.
\n
The full code is provided at the end of the chapter for your convenience.
\n
\n
1. Add code to example.py that imports the values from config.py.
# Azure AI Search service header settings\nHEADERS = {\n 'Content-Type': 'application/json',\n 'api-key': SEARCH_SERVICE_KEY\n}
\n
\n
3. Now, we will create functions related to Azure AI Search and run them from the main function.
\n \n
- Add the following code to the example.py file to create the `search_documents` function that retrieves documents related to your question.
\n
\n
\n
\ndef search_documents(question):\n \"\"\"Search documents using Azure AI Search.\"\"\"\n # Construct the Azure AI Search service access URL.\n url = (SEARCH_SERVICE_ENDPOINT + 'indexes/' +\n SEARCH_SERVICE_INDEX_NAME1 + '/docs')\n \n # Create a parameter dictionary.\n params = {\n 'api-version': SEARCH_SERVICE_API_VERSION,\n 'search': question,\n 'select': '*',\n # '$top': 5, Extract the top 5 documents from your storage.\n '$top': 5,\n 'queryLanguage': 'en-us',\n 'queryType': 'semantic',\n 'semanticConfiguration': SEARCH_SERVICE_SEMANTIC_CONFIG_NAME,\n '$count': 'true',\n 'speller': 'lexicon',\n 'answers': 'extractive|count-3',\n 'captions': 'extractive|highlight-false'\n }\n # Make a GET request to the Azure AI Search service and store the response in a variable.\n resp = requests.get(url, headers=HEADERS, params=params)\n # Return the JSON response containing the search results.\n search_results = resp.json()\n\n return search_results
\n
\n
\n
\n
- Add the following code to the example.py file to create the `filter_documents` function that extracts documents with a certain score or higher based on how relevant it is to your question.
\n
\n
def filter_documents(search_results):\n \"\"\"Filter documents with a reranker score above a certain threshold.\"\"\"\n documents = OrderedDict()\n for result in search_results['value']:\n # The '@search.rerankerScore' range is 0 to 4.00, where a higher score indicates a stronger semantic match.\n if result['@search.rerankerScore'] > 0.8:\n documents[result['metadata_storage_path']] = {\n 'chunks': result['pages'][:10],\n 'captions': result['@search.captions'][:10],\n 'score': result['@search.rerankerScore'],\n 'file_name': result['metadata_storage_name']\n }\n\n return documents
\n
\n
\n
\n
\n
4. Now we'll run the code using the above functions in the main function.
\n \n
- Add the following code to the example.py file to create the `main` function.
\n
- When you run it, you'll see the total number of PDFs in the blob storage, the top few documents adopted, and the number of chunks.
\n
- I asked the question, 'Tell me about effective prompting strategies' based on the paper I had stored on the blob storage.
\n
- If you want to see the full search results, add `print(search_results)` to your main function.
\n
\n
\n
\n
\ndef main():\n\n QUESTION = 'Tell me about effective prompting strategies'\n\n # Search for documents with Azure AI Search\n\n search_results = search_documents(QUESTION)\n\n documents = filter_documents(search_results)\n\n print('Total Documents Found: {}, Top Documents: {}'.format(\n search_results['@odata.count'], len(search_results['value'])))\n\n\n # 'chunks' is the value that corresponds to the Pages field that you set up in the AI Search service.\n docs = []\n for key,value in file_content.items():\n for page in value['chunks']:\n docs.append(Document(page_content = page,\n metadata={\"source\": value[\"file_name\"]}))\n\n# execute the main function\nif __name__ == \"__main__\":\n main()\n
6. Get answers from PDF content using Azure OpenAI and AI Search
\n
\n
Now that Azure AI Search is working well in VS Code, it's time to start using Azure OpenAI. In this chapter, we'll create functions related to Azure OpenAI and ultimately create and run a program in example.py file that answers a question with Azure OpenAI based on the search information from Azure AI Search.
\n
1. We will create functions related to Azure OpenAI and Lang Chain and run them from the main function.
\n
- Add the following code to the example.py file to create the `create_embeddings` function that creates an embedding model.
- Add the following code to the example.py file to create the `store_documents` function that stores the extracted documents in a vector database.
\n
\n\ndef store_documents(docs, embeddings):\n \"\"\"Create vector store and store documents in the vector store.\"\"\"\n return FAISS.from_documents(docs, embeddings)\n\n
\n
- Add the following code to the example.py file to create the `answer_with_langchain` function that extracts the chunk associated with a question stored in the vector database and answers the question based on it.
\n
\ndef answer_with_langchain(vector_store, question):\n \"\"\"Search for documents related to your question from the vector store\n and answer question with search result using Lang Chain.\"\"\"\n\n # Add a chat service.\n llm = AzureChatOpenAI(\n openai_api_key = AZURE_OPENAI_KEY,\n azure_endpoint = AZURE_OPENAI_ENDPOINT,\n openai_api_version= AZURE_OPENAI_API_VERSION,\n azure_deployment = 'gpt-35-turbo',\n temperature=0.0,\n max_tokens=500\n )\n\n chain = RetrievalQAWithSourcesChain.from_chain_type(\n llm=llm,\n chain_type='stuff',\n retriever=vector_store.as_retriever(),\n return_source_documents=True\n )\n\n answer = chain.invoke({'question': question})\n\n return answer\n
2. Modify the `main` function to match this code.
\n
\n
\n
def main():\n\n QUESTION = 'Tell me about effective prompting strategies'\n\n # Search for documents with Azure AI Search.\n\n search_results = search_documents(QUESTION)\n\n documents = filter_documents(search_results)\n\n print('Total Documents Found: {}, Top Documents: {}'.format(\n search_results['@odata.count'], len(search_results['value'])))\n\n\n # 'chunks' is the value that corresponds to the Pages field that you set up in the AI Search service.\n docs = []\n for key,value in documents.items():\n for page in value['chunks']:\n docs.append(Document(page_content = page,\n metadata={\"source\": value[\"file_name\"]}))\n\n # Answer your question using Lang Chain.\n\n embeddings = create_embeddings()\n\n vector_store = store_documents(docs, embeddings)\n\n result = answer_with_langchain(vector_store, QUESTION)\n\n print('Question: ', QUESTION)\n print('Answer: ', result['answer'])\n print('Reference: ', result['sources'].replace(\",\",\"\\n\"))
\n
\n
\n
3. Now let's run it and see if it answers your question. - The result of executing the code.
\n
Total Documents Found: 5, Top Documents: 3 Number of chunks: 10 Question: Tell me about effective prompting strategies Answer: Effective prompting strategies for improving the reliability of GPT-3 include establishing simple prompts that improve GPT-3's reliability in terms of generalizability, social biases, calibration, and factuality. These strategies include prompting with randomly sampled examples from the source domain, using examples sampled from a balanced demographic distribution and natural language intervention to reduce social biases, calibrating output probabilities, and updating the LLM's factual knowledge and reasoning chains. Natural language intervention can also effectively guide model predictions towards better fairness. Reference: Prompting GPT-3 To Be Reliable.pdf
\n
\n
\n
NOTE: Full code for example.py and config.py
\n
\n
This chapter is designed to provide all the code used in the tutorial. It is a separate section from the rest of the tutorial.
\n
For your convenience, I've attached the full code used in the tutorial.
\n
\n
1. config.py
\n
\n
# Azure AI Search service settings\nSEARCH_SERVICE_NAME = 'teachchatgpt-search' # 'teachchatgpt-search'\nSEARCH_SERVICE_ENDPOINT = f'https://{SEARCH_SERVICE_NAME.lower()}.search.windows.net/'\nSEARCH_SERVICE_KEY = 'lDdgBQSnG4f0uAZixTMgr9nSOa4VvmeVux4Nac9iQXAzSeBm7ToL'\nSEARCH_SERVICE_API_VERSION = '2023-10-01-Preview' # '2023-10-01-Preview'\n\n# Azure AI Search service index settings\nSEARCH_SERVICE_INDEX_NAME1 = 'teachchatgpt-index' # 'teachchatgpt-index'\n\n# Azure AI Search service semantic configuration settings\nSEARCH_SERVICE_SEMANTIC_CONFIG_NAME = 'teachchatgpt-config' # 'teachchatgpt-config'\n\n# Azure OpenAI settings\nAZURE_OPENAI_NAME = 'teachchatgpt-azureopenai' # 'teachchatgpt-azureopenai'\nAZURE_OPENAI_ENDPOINT = f'https://{AZURE_OPENAI_NAME.lower()}.openai.azure.com/'\nAZURE_OPENAI_KEY = 'fdfcd358b26343c293d3dff4643f1aee'\nAZURE_OPENAI_API_VERSION = '2024-02-15-preview' # '2024-02-15-preview'\n
\n
\n
\n
2. example.py
\n
\n
\n
\n
# Library imports\nfrom collections import OrderedDict\nimport requests\n\n# Lang Chain library imports\nfrom langchain.chains import RetrievalQAWithSourcesChain\nfrom langchain_openai import AzureOpenAIEmbeddings\nfrom langchain_openai.chat_models import AzureChatOpenAI\nfrom langchain.docstore.document import Document\nfrom langchain_community.vectorstores import FAISS\n\n# Configuration imports\nfrom config import (\n SEARCH_SERVICE_ENDPOINT,\n SEARCH_SERVICE_KEY,\n SEARCH_SERVICE_API_VERSION,\n SEARCH_SERVICE_INDEX_NAME1,\n SEARCH_SERVICE_SEMANTIC_CONFIG_NAME,\n AZURE_OPENAI_ENDPOINT,\n AZURE_OPENAI_KEY,\n AZURE_OPENAI_API_VERSION,\n)\n\n# Azure AI Search service header settings\nHEADERS = {\n 'Content-Type': 'application/json',\n 'api-key': SEARCH_SERVICE_KEY\n}\n\ndef search_documents(question):\n \"\"\"Search documents using Azure AI Search.\"\"\"\n # Construct the Azure AI Search service access URL.\n url = (SEARCH_SERVICE_ENDPOINT + 'indexes/' +\n SEARCH_SERVICE_INDEX_NAME1 + '/docs')\n \n # Create a parameter dictionary.\n params = {\n 'api-version': SEARCH_SERVICE_API_VERSION,\n 'search': question,\n 'select': '*',\n # '$top': 5, Extract the top 5 documents from your storage.\n '$top': 5,\n 'queryLanguage': 'en-us',\n 'queryType': 'semantic',\n 'semanticConfiguration': SEARCH_SERVICE_SEMANTIC_CONFIG_NAME,\n '$count': 'true',\n 'speller': 'lexicon',\n 'answers': 'extractive|count-3',\n 'captions': 'extractive|highlight-false'\n }\n # Make a GET request to the Azure AI Search service and store the response in a variable.\n resp = requests.get(url, headers=HEADERS, params=params)\n # Return the JSON response containing the search results.\n search_results = resp.json()\n\n return search_results\n\ndef filter_documents(search_results):\n \"\"\"Filter documents with a reranker score above a certain threshold.\"\"\"\n documents = OrderedDict()\n for result in search_results['value']:\n # The '@search.rerankerScore' range is 0 to 4.00, where a higher score indicates a stronger semantic match.\n if result['@search.rerankerScore'] > 0.8:\n documents[result['metadata_storage_path']] = {\n 'chunks': result['pages'][:10],\n 'captions': result['@search.captions'][:10],\n 'score': result['@search.rerankerScore'],\n 'file_name': result['metadata_storage_name']\n }\n\n return documents\n\ndef create_embeddings():\n \"\"\"Create an embedding model.\"\"\"\n embeddings = AzureOpenAIEmbeddings(\n openai_api_key = AZURE_OPENAI_KEY,\n azure_endpoint = AZURE_OPENAI_ENDPOINT,\n openai_api_version = AZURE_OPENAI_API_VERSION,\n openai_api_type = 'azure',\n azure_deployment = 'text-embedding-ada-002',\n model = 'text-embedding-ada-002',\n chunk_size=1\n )\n return embeddings\n\ndef store_documents(docs, embeddings):\n \"\"\"Create vector store and store documents in the vector store.\"\"\"\n return FAISS.from_documents(docs, embeddings)\n\ndef answer_with_langchain(vector_store, question):\n \"\"\"Search for documents related to your question from the vector store\n and answer question with search result using Lang Chain.\"\"\"\n\n # Add a chat service.\n llm = AzureChatOpenAI(\n openai_api_key = AZURE_OPENAI_KEY,\n azure_endpoint = AZURE_OPENAI_ENDPOINT,\n openai_api_version= AZURE_OPENAI_API_VERSION,\n azure_deployment = 'gpt-35-turbo',\n temperature=0.0,\n max_tokens=500\n )\n\n chain = RetrievalQAWithSourcesChain.from_chain_type(\n llm=llm,\n chain_type='stuff',\n retriever=vector_store.as_retriever(),\n return_source_documents=True\n )\n\n answer = chain.invoke({'question': question})\n\n return answer\n\ndef main():\n QUESTION = 'Tell me about effective prompting strategies'\n\n # Search for documents with Azure AI Search.\n\n search_results = search_documents(QUESTION)\n\n documents = filter_documents(search_results)\n\n print('Total Documents Found: {}, Top Documents: {}'.format(\n search_results['@odata.count'], len(search_results['value'])))\n\n \n # 'chunks' is the value that corresponds to the Pages field that you set up in the AI Search service.\n docs = []\n for key,value in documents.items():\n for page in value['chunks']:\n docs.append(Document(page_content = page,\n metadata={\"source\": value[\"file_name\"]}))\n\n # Answer your question using Lang Chain.\n\n embeddings = create_embeddings()\n\n vector_store = store_documents(docs, embeddings)\n\n result = answer_with_langchain(vector_store, QUESTION)\n\n print('Question: ', QUESTION)\n print('Answer: ', result['answer'])\n print('Reference: ', result['sources'].replace(\",\",\"\\n\"))\n\n# Execute the main function.\nif __name__ == \"__main__\":\n main()
\n
Congratulations!
\n
\n
You've completed this tutorial
\n \n
\n
\n
Congratulations! You've learned the integration tutorial of Azure AI Search with Azure OpenAI
\n
\n
\n
\n
\n
\n
\n
In this tutorial, we have navigated through a practical journey of integrating Azure Blob Storage, Azure AI Search, and Azure OpenAI to create a powerful search and response mechanism.
\n
\n
\n \n
1. Storing Data in Azure Blob Storage
\n \n
Our first step was to efficiently store PDF files in Azure Blob Storage, an unstructured data store known for its scalability and security. This storage served as a foundational base, housing the search material that would later be indexed and queried to retrieve relevant information.
\n \n
2. Implementing Azure AI Search
\n \n
\n
\n
In the next step, we used Azure AI Search to search based on the data we had stored in Azure Blob Storage. This powerful service was instrumental in indexing and searching the data stored in Azure Blob Storage.
\n
\n
\n \n
3. Integrating Azure OpenAI with VS Code
\n \n
\n
The final step of our tutorial was to integrate Azure OpenAI through a program created in VS Code. This program was designed to use the search information processed and refined by Azure AI Search to generate accurate and contextually relevant answers. The synergy between these technologies illustrated the seamless interplay of storage, search, and response mechanisms.
\n
I hope that the knowledge and skills imparted will serve as invaluable tools in your future projects. The harmonious integration of Azure Blob Storage, Azure AI Search, and Azure OpenAI represents the pinnacle of unstructured data management and utilization.
\n
Thank you for your commitment and hard work throughout this learning journey.
\n
\n
\n
\n
\n
\n
\n
Clean Up Azure Resources
\n
\n
Cleanup your Azure resources to avoid additional charges to your account. Go to the Azure portal and delete the following resources:
In this two-part series, we will explore how to build intelligent service using Azure. In Series 1, we'll use Azure AI Search to extract keywords from unstructured data stored in Azure Blob Storage. In Series 2, we'll Create a feature to answer questions based on PDF documents using Azure OpenAI.
\n
","introduction":"","coverImage":null,"coverImageProperties":{"__typename":"CoverImageProperties","style":"STANDARD","titlePosition":"BOTTOM","altText":""},"currentRevision":{"__ref":"Revision:revision:3969713_58"},"latestVersion":{"__typename":"FriendlyVersion","major":"11","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":42517},"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":"Teach ChatGPT to Answer Questions Based on PDF content Using Azure AI Search and Azure OpenAI","seoDescription":"The purpose of this tutorial is to explain how to efficiently extract and use information from large amounts of PDFs. Dealing with a 5-page PDF can be straightforward, but it's a different story when you're dealing with complex documents of 100+ pages. In these situations, the integration of Azure AI Search with Azure OpenAI enables fast and accurate information retrieval and processing. In this tutorial, we handle 5 PDFs, but you can apply this method to scale to handle more than 10,000 files. In this two-part series, we will explore how to build intelligent service using Azure. In Series 1, we'll use Azure Cognitive Search to extract keywords from unstructured data stored in Azure Blob Storage. In Series 2, we'll Create a feature to answer questions based on PDF documents using Azure OpenAI.","placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[]},"blogMessagePolicies":{"__typename":"BlogMessagePolicies","canDoAuthoringActionsOnBlog":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","key":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCw0MTAxMzI4","node":{"__ref":"BlogReplyMessage:message:4101328"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCw0MDk0MDY3","node":{"__ref":"BlogReplyMessage:message:4094067"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCw0MDgxMTEw","node":{"__ref":"BlogReplyMessage:message:4081110"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCw0MDc4NTEx","node":{"__ref":"BlogReplyMessage:message:4078511"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCw0MDYwMTA2","node":{"__ref":"BlogReplyMessage:message:4060106"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCwzOTk3OTYx","node":{"__ref":"BlogReplyMessage:message:3997961"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCwzOTkzMDkz","node":{"__ref":"BlogReplyMessage:message:3993093"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCwzOTc0OTc4","node":{"__ref":"BlogReplyMessage:message:3974978"}},{"__typename":"MessageEdge","cursor":"MjUuMXwyLjF8aXwxMHwxMzI6MHxpbnQsNDEwMTMyOCwzOTc0MTA1","node":{"__ref":"BlogReplyMessage:message:3974105"}}],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":58}},"Conversation:conversation:3969713":{"__typename":"Conversation","id":"conversation:3969713","solved":false,"topic":{"__ref":"BlogTopicMessage:message:3969713"},"lastPostingActivityTime":"2024-03-30T01:14:19.246-07:00","lastPostTime":"2024-03-30T01:14:19.246-07:00","unreadReplyCount":9,"isSubscribed":false},"ModerationData:moderation_data:3969713":{"__typename":"ModerationData","id":"moderation_data:3969713","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk4MWlCMDY5OEQ5NTZBOUFBOTk5?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk4MWlCMDY5OEQ5NTZBOUFBOTk5?revision=58","title":"00-1-architecture.png","associationType":"BODY","width":6436,"height":2840,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk4M2lCOTk5NjU0OTkwMzIyNkI1?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk4M2lCOTk5NjU0OTkwMzIyNkI1?revision=58","title":"series1-architecture1.png","associationType":"BODY","width":1620,"height":722,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk5MGk0NDkyMThGNDY3ODc5N0U4?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk5MGk0NDkyMThGNDY3ODc5N0U4?revision=58","title":"01-1-type-storage-accounts.png","associationType":"BODY","width":1213,"height":312,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk5MWk3OEEzRDA3OEM0OEVBNEZG?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzNzk5MWk3OEEzRDA3OEM0OEVBNEZG?revision=58","title":"01-2-select-create-button.png","associationType":"BODY","width":1273,"height":363,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwNmk3RTcyRTM4N0JCMzY2MzRE?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwNmk3RTcyRTM4N0JCMzY2MzRE?revision=58","title":"01-3-create-storage-account.png","associationType":"BODY","width":1105,"height":1252,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwN2lEQTgyQzhGQ0NCN0UwMEUz?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwN2lEQTgyQzhGQ0NCN0UwMEUz?revision=58","title":"01-4-select-the-create-button.png","associationType":"BODY","width":928,"height":1261,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwOGk2ODVDQTc1OTUwMTc0NUFG?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwOGk2ODVDQTc1OTUwMTc0NUFG?revision=58","title":"02-1-type-storage-browser.png","associationType":"BODY","width":1212,"height":307,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwOWkxNTdCMDAxMjk2RDJFQ0Qy?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAwOWkxNTdCMDAxMjk2RDJFQ0Qy?revision=58","title":"02-2-select-your-storage.png","associationType":"BODY","width":1120,"height":511,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxMGk0MjUxQUYyOEYzMkVDQ0M0?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxMGk0MjUxQUYyOEYzMkVDQ0M0?revision=58","title":"02-3-add-a-new-container.png","associationType":"BODY","width":1096,"height":466,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxMWlFRUY4OTJDRDQ1NTZGOEVD?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxMWlFRUY4OTJDRDQ1NTZGOEVD?revision=58","title":"02-4-select-the-container.png","associationType":"BODY","width":1005,"height":373,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxMmk3MDc5MUIxNDZGM0NDQzZG?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxMmk3MDc5MUIxNDZGM0NDQzZG?revision=58","title":"02-5-select-the-upload-button.png","associationType":"BODY","width":1621,"height":493,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxM2lFNEJGNDg2RjlERTRGNjVE?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxM2lFNEJGNDg2RjlERTRGNjVE?revision=58","title":"02-6-recent-papers.png","associationType":"BODY","width":1567,"height":705,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxNGlEODVEMEMzNTM3MzE3NUZD?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxNGlEODVEMEMzNTM3MzE3NUZD?revision=58","title":"03-1-type-ai-search.png","associationType":"BODY","width":1212,"height":346,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxNWlERTMzOTRGMzVCRDA5NEYw?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxNWlERTMzOTRGMzVCRDA5NEYw?revision=58","title":"03-2-select-the-create-button.png","associationType":"BODY","width":1048,"height":415,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxNmlEMjQ2RkFFQkU1QzRFQTZD?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxNmlEMjQ2RkFFQkU1QzRFQTZD?revision=58","title":"03-3-select-the-review-create-button.png","associationType":"BODY","width":1099,"height":538,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxN2lEMjcwMzA3ODBERjRFQkI0?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAxN2lEMjcwMzA3ODBERjRFQkI0?revision=58","title":"03-4-select-semantic-search.png","associationType":"BODY","width":1440,"height":667,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyMGlCMUYyQTg4MUYxN0ZGN0ZD?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyMGlCMUYyQTg4MUYxN0ZGN0ZD?revision=58","title":"04-1-select-import-data.png","associationType":"BODY","width":1006,"height":336,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyMWk3NDlCMkFBMDNFMTgyRUE4?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyMWk3NDlCMkFBMDNFMTgyRUE4?revision=58","title":"04-2-connect-to-blob-storage.png","associationType":"BODY","width":1273,"height":573,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyM2lBNjk4QzAzNEI2NDEyRjg4?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyM2lBNjk4QzAzNEI2NDEyRjg4?revision=58","title":"04-3-add-cognitive-skills.png","associationType":"BODY","width":994,"height":1137,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyNGk0RTNDQjRDMDdBNzc4OTNG?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyNGk0RTNDQjRDMDdBNzc4OTNG?revision=58","title":"05-1-free-resource.png","associationType":"BODY","width":849,"height":316,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyNWlBNEU4MUFEOEM2ODM3MDgx?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyNWlBNEU4MUFEOEM2ODM3MDgx?revision=58","title":"05-2-add-enrichments.png","associationType":"BODY","width":1677,"height":1258,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUyNzA3M2lFNEE1RTlFMkRDOEQ5QjVC?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUyNzA3M2lFNEE1RTlFMkRDOEQ5QjVC?revision=58","title":"Minseok_Song_0-1700153644062.png","associationType":"BODY","width":999,"height":245,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyOGlENjA4NEVFMzREQjg3MUU3?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyOGlENjA4NEVFMzREQjg3MUU3?revision=58","title":"06-1-customize-target-index.png","associationType":"BODY","width":1530,"height":973,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyOWlGNjg2QjcwOThCNDlGRDFC?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAyOWlGNjg2QjcwOThCNDlGRDFC?revision=58","title":"06-2-add-a-new-field.png","associationType":"BODY","width":1116,"height":510,"altText":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAzMGlEMEVFRjc3OUIzRTdFOEIx?revision=58\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS0zOTY5NzEzLTUzODAzMGlEMEVFRjc3OUIzRTdFOEIx?revision=58","title":"06-3-delete-unnecessary-fields.png","associationType":"BODY","width":1519,"height":357,"altText":null},"Revision:revision:3969713_58":{"__typename":"Revision","id":"revision:3969713_58","lastEditTime":"2024-03-26T02:35:10.442-07:00"},"CachedAsset:theme:customTheme1-1744326567598":{"__typename":"CachedAsset","id":"theme:customTheme1-1744326567598","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["default"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"favicon-1730836283320.png","imageLastModified":"1730836286415","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"favicon-1730836271365.png","imageLastModified":"1730836274203","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1300px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_BROWSER","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"3px","borderRadius":"3px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"16px","paddingXHero":"60px","fontStyle":"NORMAL","fontWeight":"700","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-200)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-200)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"LIGHT","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-link-color)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#4099E2","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#148563","blogColor":"#1CBAA0","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#4C6B90","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#FF8000","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#D13A1F","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#333333","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#717171","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0069D4","secondary":"#333333","bodyText":"#1E1E1E","bodyBg":"#FFFFFF","info":"#409AE2","success":"#41C5AE","warning":"#FCC844","danger":"#BC341B","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#D3F5A4","#243A5E"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Segoe UI","fontStyle":"NORMAL","fontWeight":"400","h1FontSize":"34px","h2FontSize":"32px","h3FontSize":"28px","h4FontSize":"24px","h5FontSize":"20px","h6FontSize":"16px","lineHeight":"1.3","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":"","imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"40px","defaultMessageHeaderMarginBottom":"20px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"40px","specialMessageHeaderMarginBottom":"20px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Segoe UI","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.5","fontSizeBase":"16px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"14px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Segoe UI","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"},{"style":"NORMAL","weight":"300","__typename":"FontStyleData"},{"style":"NORMAL","weight":"600","__typename":"FontStyleData"},{"style":"NORMAL","weight":"700","__typename":"FontStyleData"},{"style":"ITALIC","weight":"400","__typename":"FontStyleData"}],"assetNames":["SegoeUI-normal-400.woff2","SegoeUI-normal-300.woff2","SegoeUI-normal-600.woff2","SegoeUI-normal-700.woff2","SegoeUI-italic-400.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"MWF Fluent Icons","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"}],"assetNames":["MWFFluentIcons-normal-400.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745505309836","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745505309836","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:o365.prod:pages/blogs/BlogMessagePage:board:EducatorDeveloperBlog-1745502715024":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/blogs/BlogMessagePage:board:EducatorDeveloperBlog-1745502715024","value":{"id":"BlogMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"blog-article","layout":"ONE_COLUMN","bgColor":null,"showTitle":null,"showDescription":null,"textPosition":null,"textColor":null,"sectionEditLevel":"LOCKED","bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"OneColumnQuiltSection","columnMap":{"main":[{"id":"blogs.widget.blogArticleWidget","className":"lia-blog-container","props":null,"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"}},{"id":"section-1729184836777","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":false,"showDescription":false,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[],"side":[],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-pages/blogs/BlogMessagePage-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-pages/blogs/BlogMessagePage-1745505309836","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This blog post cannot be found","name":"Blog Message Page","section.blog-article.title":"Blog Post","archivedMessageTitle":"This Content Has Been Archived","section.section-1729184836777.title":"","section.section-1729184836777.description":"","section.CncIde.title":"Blog Post","section.tifEmD.description":"","section.tifEmD.title":""},"localOverride":false},"CachedAsset:quiltWrapper:o365.prod:Common:1745505310849":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1745505310849","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"community.widget.navbarWidget","props":{"showUserName":true,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"className":"QuiltComponent_lia-component-edit-mode__0nCcm","links":{"sideLinks":[],"mainLinks":[{"children":[],"linkType":"INTERNAL","id":"gxcuf89792","params":{},"routeName":"CommunityPage"},{"children":[],"linkType":"EXTERNAL","id":"external-link","url":"/Directory","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft365","params":{"categoryId":"microsoft365"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows","params":{"categoryId":"Windows"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-microsoft365-copilot-link","params":{"categoryId":"Microsoft365Copilot"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-teams","params":{"categoryId":"MicrosoftTeams"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-securityand-compliance","params":{"categoryId":"microsoft-security"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"azure","params":{"categoryId":"Azure"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-content_management-link","params":{"categoryId":"Content_Management"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"exchange","params":{"categoryId":"Exchange"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows-server","params":{"categoryId":"Windows-Server"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"outlook","params":{"categoryId":"Outlook"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-endpoint-manager","params":{"categoryId":"microsoftintune"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-2","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities","url":"/","target":"BLANK"},{"children":[{"linkType":"INTERNAL","id":"a-i","params":{"categoryId":"AI"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"education-sector","params":{"categoryId":"EducationSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"partner-community","params":{"categoryId":"PartnerCommunity"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"i-t-ops-talk","params":{"categoryId":"ITOpsTalk"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"healthcare-and-life-sciences","params":{"categoryId":"HealthcareAndLifeSciences"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-mechanics","params":{"categoryId":"MicrosoftMechanics"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"public-sector","params":{"categoryId":"PublicSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-m-b","params":{"categoryId":"MicrosoftforNonprofits"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"io-t","params":{"categoryId":"IoT"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"startupsat-microsoft","params":{"categoryId":"StartupsatMicrosoft"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"driving-adoption","params":{"categoryId":"DrivingAdoption"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-1","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities-1","url":"/","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external","url":"/Blogs","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external-1","url":"/Events","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft-learn-1","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-learn-blog","params":{"boardId":"MicrosoftLearnBlog","categoryId":"MicrosoftLearn"},"routeName":"BlogBoardPage"},{"linkType":"EXTERNAL","id":"external-10","url":"https://learningroomdirectory.microsoft.com/","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-3","url":"https://docs.microsoft.com/learn/dynamics365/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-4","url":"https://docs.microsoft.com/learn/m365/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-5","url":"https://docs.microsoft.com/learn/topics/sci/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-6","url":"https://docs.microsoft.com/learn/powerplatform/?wt.mc_id=techcom_header-webpage-powerplatform","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-7","url":"https://docs.microsoft.com/learn/github/?wt.mc_id=techcom_header-webpage-github","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-8","url":"https://docs.microsoft.com/learn/teams/?wt.mc_id=techcom_header-webpage-teams","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-9","url":"https://docs.microsoft.com/learn/dotnet/?wt.mc_id=techcom_header-webpage-dotnet","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-2","url":"https://docs.microsoft.com/learn/azure/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"}],"linkType":"INTERNAL","id":"microsoft-learn","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"community-info-center","params":{"categoryId":"Community-Info-Center"},"routeName":"CategoryPage"}]},"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","controllerHighlightColor":"hsla(30, 100%, 50%)","linkFontWeight":"400","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkBoxShadowHover":"none","linkFontSize":"14px","backgroundOpacity":0.8,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","hamburgerColor":"var(--lia-nav-controller-icon-color)","linkTextBorderBottom":"none","brandLogoHeight":"30px","linkBgHoverColor":"transparent","linkLetterSpacing":"normal","collapseMenuDividerOpacity":0.16,"dropdownPaddingBottom":"15px","paddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"1px solid var(--lia-bs-border-color)","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","collapseMenuDividerBg":"var(--lia-nav-link-color)","linkColor":"var(--lia-bs-body-color)","linkJustifyContent":"flex-start","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-body-color)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-body-color)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","linkPaddingX":"10px","linkPaddingY":"5px","paddingTop":"15px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkBgColor":"transparent","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-body-color)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-body-color)"},"showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"transparent","linkHighlightColor":"var(--lia-bs-primary)","visualEffects":{"showBottomBorder":true},"linkTextColor":"var(--lia-bs-gray-700)"},"__typename":"QuiltComponent"},{"id":"custom.widget.community_banner","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"usePageWidth":false,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.HeroBanner","props":{"widgetVisibility":"signedInOrAnonymous","usePageWidth":false,"useTitle":true,"cMax_items":3,"useBackground":false,"title":"","lazyLoad":false,"widgetChooser":"custom.widget.HeroBanner"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.MicrosoftFooter","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745505309836","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.community_banner-en-1744400828169":{"__typename":"CachedAsset","id":"component:custom.widget.community_banner-en-1744400828169","value":{"component":{"id":"custom.widget.community_banner","template":{"id":"community_banner","markupLanguage":"HANDLEBARS","style":".community-banner {\n a.top-bar.btn {\n top: 0px;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0px;\n background: #0068b8;\n color: white;\n padding: 10px 0px;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0px !important;\n font-size: 14px;\n }\n}\n","texts":null,"defaults":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.community_banner","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_community_banner_community-banner_1x9u2_1 {\n a.custom_widget_community_banner_top-bar_1x9u2_2.custom_widget_community_banner_btn_1x9u2_2 {\n top: 0;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0;\n background: #0068b8;\n color: white;\n padding: 0.625rem 0;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0 !important;\n font-size: 0.875rem;\n }\n}\n","tokens":{"community-banner":"custom_widget_community_banner_community-banner_1x9u2_1","top-bar":"custom_widget_community_banner_top-bar_1x9u2_2","btn":"custom_widget_community_banner_btn_1x9u2_2"}},"form":null},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-1744400828169":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-1744400828169","value":{"component":{"id":"custom.widget.HeroBanner","template":{"id":"HeroBanner","markupLanguage":"REACT","style":null,"texts":{"searchPlaceholderText":"Search this community","followActionText":"Follow","unfollowActionText":"Following","searchOnHoverText":"Please enter your search term(s) and then press return key to complete a search.","blogs.sidebar.pagetitle":"Latest Blogs | Microsoft Tech Community","followThisNode":"Follow this node","unfollowThisNode":"Unfollow this node"},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.HeroBanner","form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"__typename":"Component","localOverride":false},"globalCss":null,"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"}},"localOverride":false},"CachedAsset:component:custom.widget.MicrosoftFooter-en-1744400828169":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-1744400828169","value":{"component":{"id":"custom.widget.MicrosoftFooter","template":{"id":"MicrosoftFooter","markupLanguage":"HANDLEBARS","style":".context-uhf {\n min-width: 280px;\n font-size: 15px;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.c-uhff-link {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.c-uhff {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.c-uhff-nav {\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n .c-heading-4 {\n color: #616161;\n word-break: break-word;\n font-size: 15px;\n line-height: 20px;\n padding: 36px 0 4px;\n font-weight: 600;\n }\n .c-uhff-nav-row {\n .c-uhff-nav-group {\n display: block;\n float: left;\n min-height: 1px;\n vertical-align: text-top;\n padding: 0 12px;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.c-list.f-bare {\n font-size: 11px;\n line-height: 16px;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 8px 0;\n margin: 0;\n }\n }\n }\n }\n}\n.c-uhff-base {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 30px 5% 16px;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.c-uhff-ccpa {\n font-size: 11px;\n line-height: 16px;\n float: left;\n margin: 3px 0;\n }\n a.c-uhff-ccpa:hover {\n text-decoration: underline;\n }\n ul.c-list {\n font-size: 11px;\n line-height: 16px;\n float: right;\n margin: 3px 0;\n color: #616161;\n li {\n padding: 0 24px 4px 0;\n display: inline-block;\n }\n }\n .c-list.f-bare {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 30px 24px 16px;\n }\n}\n\n.social-share {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n\n.sharing-options {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 43px;\n border-radius: 0px 7px 7px 0px;\n}\n.linkedin-icon {\n border-top-right-radius: 7px;\n}\n.linkedin-icon:hover {\n border-radius: 0;\n}\n.social-share-rss-image {\n border-bottom-right-radius: 7px;\n}\n.social-share-rss-image:hover {\n border-radius: 0;\n}\n\n.social-link-footer {\n position: relative;\n display: block;\n margin: -2px 0;\n transition: all 0.2s ease;\n}\n.social-link-footer:hover .linkedin-icon {\n border-radius: 0;\n}\n.social-link-footer:hover .social-share-rss-image {\n border-radius: 0;\n}\n\n.social-link-footer img {\n width: 40px;\n height: auto;\n transition: filter 0.3s ease;\n}\n\n.social-share-list {\n width: 40px;\n}\n.social-share-rss-image {\n width: 40px;\n}\n\n.share-icon {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n\n.share-icon:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n\n.share-icon:hover .label {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n\n.label {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 10px;\n top: 50%;\n transform: translateY(-50%);\n height: 40px;\n border-radius: 0 6px 6px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 5px 20px 8px;\n margin-left: -1px;\n}\n.linkedin {\n background-color: #0474b4;\n}\n.facebook {\n background-color: #3c5c9c;\n}\n.twitter {\n background-color: white;\n color: black;\n}\n.reddit {\n background-color: #fc4404;\n}\n.mail {\n background-color: #848484;\n}\n.bluesky {\n background-color: white;\n color: black;\n}\n.rss {\n background-color: #ec7b1c;\n}\n#RSS {\n width: 40px;\n height: 40px;\n}\n\n@media (max-width: 991px) {\n .social-share {\n display: none;\n }\n}\n","texts":{"New tab":"What's New","New 1":"Surface Laptop Studio 2","New 2":"Surface Laptop Go 3","New 3":"Surface Pro 9","New 4":"Surface Laptop 5","New 5":"Surface Studio 2+","New 6":"Copilot in Windows","New 7":"Microsoft 365","New 8":"Windows 11 apps","Store tab":"Microsoft Store","Store 1":"Account Profile","Store 2":"Download Center","Store 3":"Microsoft Store Support","Store 4":"Returns","Store 5":"Order tracking","Store 6":"Certified Refurbished","Store 7":"Microsoft Store Promise","Store 8":"Flexible Payments","Education tab":"Education","Edu 1":"Microsoft in education","Edu 2":"Devices for education","Edu 3":"Microsoft Teams for Education","Edu 4":"Microsoft 365 Education","Edu 5":"How to buy for your school","Edu 6":"Educator Training and development","Edu 7":"Deals for students and parents","Edu 8":"Azure for students","Business tab":"Business","Bus 1":"Microsoft Cloud","Bus 2":"Microsoft Security","Bus 3":"Dynamics 365","Bus 4":"Microsoft 365","Bus 5":"Microsoft Power Platform","Bus 6":"Microsoft Teams","Bus 7":"Microsoft Industry","Bus 8":"Small Business","Developer tab":"Developer & IT","Dev 1":"Azure","Dev 2":"Developer Center","Dev 3":"Documentation","Dev 4":"Microsoft Learn","Dev 5":"Microsoft Tech Community","Dev 6":"Azure Marketplace","Dev 7":"AppSource","Dev 8":"Visual Studio","Company tab":"Company","Com 1":"Careers","Com 2":"About Microsoft","Com 3":"Company News","Com 4":"Privacy at Microsoft","Com 5":"Investors","Com 6":"Diversity and inclusion","Com 7":"Accessiblity","Com 8":"Sustainibility"},"defaults":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.MicrosoftFooter","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_MicrosoftFooter_context-uhf_105bp_1 {\n min-width: 17.5rem;\n font-size: 0.9375rem;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-link_105bp_12 {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff_105bp_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35 {\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n .custom_widget_MicrosoftFooter_c-heading-4_105bp_49 {\n color: #616161;\n word-break: break-word;\n font-size: 0.9375rem;\n line-height: 1.25rem;\n padding: 2.25rem 0 0.25rem;\n font-weight: 600;\n }\n .custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58 {\n display: block;\n float: left;\n min-height: 0.0625rem;\n vertical-align: text-top;\n padding: 0 0.75rem;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 0.5rem 0;\n margin: 0;\n }\n }\n }\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff-base_105bp_94 {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 1.875rem 5% 1rem;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: left;\n margin: 0.1875rem 0;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: right;\n margin: 0.1875rem 0;\n color: #616161;\n li {\n padding: 0 1.5rem 0.25rem 0;\n display: inline-block;\n }\n }\n .custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 1.875rem 1.5rem 1rem;\n }\n}\n.custom_widget_MicrosoftFooter_social-share_105bp_138 {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n.custom_widget_MicrosoftFooter_sharing-options_105bp_146 {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 2.6875rem;\n border-radius: 0 0.4375rem 0.4375rem 0;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-top-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-bottom-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 {\n position: relative;\n display: block;\n margin: -0.125rem 0;\n transition: all 0.2s ease;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 img {\n width: 2.5rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_social-share-list_105bp_188 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195 {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover .custom_widget_MicrosoftFooter_label_105bp_207 {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n.custom_widget_MicrosoftFooter_label_105bp_207 {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 0.625rem;\n top: 50%;\n transform: translateY(-50%);\n height: 2.5rem;\n border-radius: 0 0.375rem 0.375rem 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.25rem 0.3125rem 1.25rem 0.5rem;\n margin-left: -0.0625rem;\n}\n.custom_widget_MicrosoftFooter_linkedin_105bp_156 {\n background-color: #0474b4;\n}\n.custom_widget_MicrosoftFooter_facebook_105bp_237 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_twitter_105bp_240 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_reddit_105bp_244 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_mail_105bp_247 {\n background-color: #848484;\n}\n.custom_widget_MicrosoftFooter_bluesky_105bp_250 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_rss_105bp_254 {\n background-color: #ec7b1c;\n}\n#custom_widget_MicrosoftFooter_RSS_105bp_1 {\n width: 2.5rem;\n height: 2.5rem;\n}\n@media (max-width: 991px) {\n .custom_widget_MicrosoftFooter_social-share_105bp_138 {\n display: none;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_105bp_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_105bp_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_105bp_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_105bp_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58","c-list":"custom_widget_MicrosoftFooter_c-list_105bp_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_105bp_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_105bp_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107","social-share":"custom_widget_MicrosoftFooter_social-share_105bp_138","sharing-options":"custom_widget_MicrosoftFooter_sharing-options_105bp_146","linkedin-icon":"custom_widget_MicrosoftFooter_linkedin-icon_105bp_156","social-share-rss-image":"custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162","social-link-footer":"custom_widget_MicrosoftFooter_social-link-footer_105bp_169","social-share-list":"custom_widget_MicrosoftFooter_social-share-list_105bp_188","share-icon":"custom_widget_MicrosoftFooter_share-icon_105bp_195","label":"custom_widget_MicrosoftFooter_label_105bp_207","linkedin":"custom_widget_MicrosoftFooter_linkedin_105bp_156","facebook":"custom_widget_MicrosoftFooter_facebook_105bp_237","twitter":"custom_widget_MicrosoftFooter_twitter_105bp_240","reddit":"custom_widget_MicrosoftFooter_reddit_105bp_244","mail":"custom_widget_MicrosoftFooter_mail_105bp_247","bluesky":"custom_widget_MicrosoftFooter_bluesky_105bp_250","rss":"custom_widget_MicrosoftFooter_rss_105bp_254","RSS":"custom_widget_MicrosoftFooter_RSS_105bp_1"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745505309836","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1745505309836","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"Category:category:Exchange":{"__typename":"Category","id":"category:Exchange","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Outlook":{"__typename":"Category","id":"category:Outlook","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Community-Info-Center":{"__typename":"Category","id":"category:Community-Info-Center","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:DrivingAdoption":{"__typename":"Category","id":"category:DrivingAdoption","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Azure":{"__typename":"Category","id":"category:Azure","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows-Server":{"__typename":"Category","id":"category:Windows-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftTeams":{"__typename":"Category","id":"category:MicrosoftTeams","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PublicSector":{"__typename":"Category","id":"category:PublicSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft365":{"__typename":"Category","id":"category:microsoft365","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:IoT":{"__typename":"Category","id":"category:IoT","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:HealthcareAndLifeSciences":{"__typename":"Category","id":"category:HealthcareAndLifeSciences","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:ITOpsTalk":{"__typename":"Category","id":"category:ITOpsTalk","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftLearn":{"__typename":"Category","id":"category:MicrosoftLearn","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Blog:board:MicrosoftLearnBlog":{"__typename":"Blog","id":"board:MicrosoftLearnBlog","blogPolicies":{"__typename":"BlogPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:AI":{"__typename":"Category","id":"category:AI","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftMechanics":{"__typename":"Category","id":"category:MicrosoftMechanics","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftforNonprofits":{"__typename":"Category","id":"category:MicrosoftforNonprofits","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:StartupsatMicrosoft":{"__typename":"Category","id":"category:StartupsatMicrosoft","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PartnerCommunity":{"__typename":"Category","id":"category:PartnerCommunity","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Microsoft365Copilot":{"__typename":"Category","id":"category:Microsoft365Copilot","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows":{"__typename":"Category","id":"category:Windows","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Content_Management":{"__typename":"Category","id":"category:Content_Management","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-security":{"__typename":"Category","id":"category:microsoft-security","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoftintune":{"__typename":"Category","id":"category:microsoftintune","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"QueryVariables:TopicReplyList:message:3969713:58":{"__typename":"QueryVariables","id":"TopicReplyList:message:3969713:58","value":{"id":"message:3969713","first":10,"sorts":{"postTime":{"direction":"DESC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"DESC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-components/community/Navbar-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745505309836","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","gxcuf89792":"Tech Community","external-1":"Events","s-m-b":"Nonprofit Community","windows-server":"Windows Server","education-sector":"Education Sector","driving-adoption":"Driving Adoption","Common-content_management-link":"Content Management","microsoft-learn":"Microsoft Learn","s-q-l-server":"Content Management","partner-community":"Microsoft Partner Community","microsoft365":"Microsoft 365","external-9":".NET","external-8":"Teams","external-7":"Github","products-services":"Products","external-6":"Power Platform","communities-1":"Topics","external-5":"Microsoft Security","planner":"Outlook","external-4":"Microsoft 365","external-3":"Dynamics 365","azure":"Azure","healthcare-and-life-sciences":"Healthcare and Life Sciences","external-2":"Azure","microsoft-mechanics":"Microsoft Mechanics","microsoft-learn-1":"Community","external-10":"Learning Room Directory","microsoft-learn-blog":"Blog","windows":"Windows","i-t-ops-talk":"ITOps Talk","external-link-1":"View All","microsoft-securityand-compliance":"Microsoft Security","public-sector":"Public Sector","community-info-center":"Lounge","external-link-2":"View All","microsoft-teams":"Microsoft Teams","external":"Blogs","microsoft-endpoint-manager":"Microsoft Intune","startupsat-microsoft":"Startups at Microsoft","exchange":"Exchange","a-i":"AI and Machine Learning","io-t":"Internet of Things (IoT)","Common-microsoft365-copilot-link":"Microsoft 365 Copilot","outlook":"Microsoft 365 Copilot","external-link":"Community Hubs","communities":"Products"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745505309836","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745505309836","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745505309836","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745505309836","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745505309836","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1745505309836","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1745505309836","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1745505309836","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"ModerationData:moderation_data:4101328":{"__typename":"ModerationData","id":"moderation_data:4101328","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:4101328":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:2076234"},"id":"message:4101328","revisionNum":3,"uid":4101328,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure AI Search & Azure OpenAI (Lang Chain)","moderationData":{"__ref":"ModerationData:moderation_data:4101328"},"body":"
Thank you for contacting me with your problem learning111.
\n
\n
However, the situation you've described is different from the context of my post, making it difficult for me to provide a precise solution.
\n
\n
Thank you for your understanding.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"213","kudosSumWeight":0,"repliesCount":0,"postTime":"2024-03-30T01:14:19.246-07:00","lastPublishTime":"2024-03-30T01:15:17.998-07:00","metrics":{"__typename":"MessageMetrics","views":5062},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:4101328","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"Rank:rank:37":{"__typename":"Rank","id":"rank:37","position":18,"name":"Copper Contributor","color":"333333","icon":null,"rankStyle":"TEXT"},"User:user:2380856":{"__typename":"User","id":"user:2380856","uid":2380856,"login":"learning111","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2024-03-22T00:13:19.373-07:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-7.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:2380856"},"ModerationData:moderation_data:4094067":{"__typename":"ModerationData","id":"moderation_data:4094067","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:4094067":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:2380856"},"id":"message:4094067","revisionNum":1,"uid":4094067,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure AI Search & Azure OpenAI (Lang Chain)","moderationData":{"__ref":"ModerationData:moderation_data:4094067"},"body":"
Thanks for the tutorial. Could you please tell me how to get a response based on the previous conversation. Like after getting a response from the chat model, when I am asking the next question as \"Could you please summarize your previous response\", I am getting an error \"IndexError: list index out of range\". I am storing my conversation history in a cosmos db.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"208","kudosSumWeight":0,"repliesCount":0,"postTime":"2024-03-22T01:46:06.676-07:00","lastPublishTime":"2024-03-22T01:46:06.676-07:00","metrics":{"__typename":"MessageMetrics","views":5365},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:4094067","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:4081110":{"__typename":"ModerationData","id":"moderation_data:4081110","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:4081110":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:2076234"},"id":"message:4081110","revisionNum":3,"uid":4081110,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure AI Search & Azure OpenAI (Lang Chain)","moderationData":{"__ref":"ModerationData:moderation_data:4081110"},"body":"
This blog post has been updated to reflect the latest versions of langchain and openai as of March 11, 2024.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"110","kudosSumWeight":0,"repliesCount":0,"postTime":"2024-03-10T16:08:43.098-07:00","lastPublishTime":"2024-03-10T16:09:40.680-07:00","metrics":{"__typename":"MessageMetrics","views":5873},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:4081110","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:4078511":{"__typename":"ModerationData","id":"moderation_data:4078511","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:4078511":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:2076234"},"id":"message:4078511","revisionNum":1,"uid":4078511,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure AI Search & Azure OpenAI (Lang Chain)","moderationData":{"__ref":"ModerationData:moderation_data:4078511"},"body":"
prakashpatidar Thank you for sharing your issue. I reinstalled the packages and tried to run it and found that I got the same error. I'm currently looking into a version issue with this tutorial and working to resolve it. It looks like the problem you're experiencing is also a package version issue, which I'll get to the bottom of and improve the code for the new version.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"208","kudosSumWeight":0,"repliesCount":0,"postTime":"2024-03-07T05:55:13.509-08:00","lastPublishTime":"2024-03-07T05:55:13.509-08:00","metrics":{"__typename":"MessageMetrics","views":5985},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:4078511","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"User:user:2316609":{"__typename":"User","id":"user:2316609","uid":2316609,"login":"prakashpatidar","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2024-02-17T16:34:20.567-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-1.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:2316609"},"ModerationData:moderation_data:4060106":{"__typename":"ModerationData","id":"moderation_data:4060106","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:4060106":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:2316609"},"id":"message:4060106","revisionNum":1,"uid":4060106,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure AI Search & Azure OpenAI (Lang Chain)","moderationData":{"__ref":"ModerationData:moderation_data:4060106"},"body":"
Thanks for making detailed doc. While creating app using this reference,
I am facing below exception while executing code:
defstore_documents(docs, embeddings😞
\"\"\"Create vector store and store documents in the vector store\"\"\"
I have deployed ai instance in East US and created below deployments
text-embedding-ada-002
gpt-35-turbo
keys and deployment name etc looks good but stil getting resource not found error. I have checked with both api versions here in value and comment both
I am surprised to hear that running the code does not produce any results. First, I'd like to know if this is only happening in this tutorial code, or if it's happening in all Python code. If it's not just this tutorial code, but other code as well, then it's most likely a local environment problem. As an experiment, please create another Python file and run print(\"helloWorld\") as shown below and share your results.
\n
\n
And I need some time to organize the answers to your questions. Your question is something I thought about a lot when I first designed this tutorial, so I'll try to organize it and get back to you in a few days. Thanks again.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2023-11-30T22:51:02.775-08:00","lastPublishTime":"2023-12-03T00:21:45.614-08:00","metrics":{"__typename":"MessageMetrics","views":9917},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:3997961","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"User:user:1237306":{"__typename":"User","id":"user:1237306","uid":1237306,"login":"maxmtl","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2021-12-02T13:22:01.852-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-7.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:1237306"},"ModerationData:moderation_data:3993093":{"__typename":"ModerationData","id":"moderation_data:3993093","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:3993093":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:1237306"},"id":"message:3993093","revisionNum":1,"uid":3993093,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure Cognitive Search & Azure OpenAI (Lang Chain)","moderationData":{"__ref":"ModerationData:moderation_data:3993093"},"body":"
Thank you for your tutorial. I have a few questions I hope you can help me with. I did all the steps and create the python files. Once I run the example.py it pauses for a few seconds then returns to the prompt line (see image). I uploaded a PDF with questions and answers on our business services and want to be able to ask Azure Chatgpt questions and use the data in the PDF. Can I add more than one PDF documents?
I don't understand how to interact with the PDF once I did all these steps. Do I create a chatbox, do I train the data ?
Thanks for your help.
Max
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":1,"repliesCount":0,"postTime":"2023-11-27T07:35:19.915-08:00","lastPublishTime":"2023-11-27T07:35:19.915-08:00","metrics":{"__typename":"MessageMetrics","views":10152},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:3993093","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:3974978":{"__typename":"ModerationData","id":"moderation_data:3974978","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:3974978":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:2076234"},"id":"message:3974978","revisionNum":4,"uid":3974978,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure Cognitive Search & Azure OpenAI Services","moderationData":{"__ref":"ModerationData:moderation_data:3974978"},"body":"
Below is an example of a sentence that would appear if sensitive data were private.
\n
\"Microsoft employee with ssn *********** is using our awesome API's.\"
\n
\n
how to chat on PDF without saving the PDF to storage
\n
\n
1. if you are currently using ChatGPT's PLUS Plan you can attach a PDF directly from ChatGPT's Advanced Data Analysis mode.
\n
\n
2. If not, you can also use private services that people have created.
\n
\n
Is this the answer you were looking for?
\n
\n
Please leave a comment if you have any questions. Thank you.
\n
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"218","kudosSumWeight":1,"repliesCount":0,"postTime":"2023-11-07T05:28:44.143-08:00","lastPublishTime":"2023-11-07T06:42:53.727-08:00","metrics":{"__typename":"MessageMetrics","views":12218},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:3974978","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"User:user:2127057":{"__typename":"User","id":"user:2127057","uid":2127057,"login":"AmitNilajkar","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2023-11-06T09:16:35.744-08:00"},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/avatars/default/avatar-4.svg?time=0"},"rank":{"__ref":"Rank:rank:37"},"entityType":"USER","eventPath":"community:gxcuf89792/user:2127057"},"ModerationData:moderation_data:3974105":{"__typename":"ModerationData","id":"moderation_data:3974105","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"BlogReplyMessage:message:3974105":{"__typename":"BlogReplyMessage","author":{"__ref":"User:user:2127057"},"id":"message:3974105","revisionNum":1,"uid":3974105,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:EducatorDeveloperBlog"},"parent":{"__ref":"BlogTopicMessage:message:3969713"},"conversation":{"__ref":"Conversation:conversation:3969713"},"subject":"Re: Teach ChatGPT to Answer Questions: Using Azure Cognitive Search & Azure OpenAI Services","moderationData":{"__ref":"ModerationData:moderation_data:3974105"},"body":"
Thank you, What options do I have which pdf data chat is accessible, let's say I don't want someone query sensitive data within organisation which is meant for specific users or department related. Also certain pdf i wanto chat on the fly and not store on the blob. Any suggestion appreciated.
","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"213","kudosSumWeight":1,"repliesCount":0,"postTime":"2023-11-06T09:37:23.647-08:00","lastPublishTime":"2023-11-06T09:37:23.647-08:00","metrics":{"__typename":"MessageMetrics","views":12443},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"entityType":"BLOG_REPLY","eventPath":"category:EducationSector/category:solutions/category:communities/community:gxcuf89792board:EducatorDeveloperBlog/message:3969713/message:3974105","replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745505309836","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745505309836","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCoverImage-1745505309836","value":{"coverImageTitle":"Cover Image"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeTitle-1745505309836","value":{"nodeTitle":"{nodeTitle, select, community {Community} other {{nodeTitle}}} "},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTimeToRead-1745505309836","value":{"minReadText":"{min} MIN READ"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745505309836","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745505309836","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1745505309836","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745505309836","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745505309836","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1745505309836","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1745505309836","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1745505309836","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1745505309836","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745505309836","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1745505309836","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1745505309836","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeAvatar-1745505309836","value":{"altTitle":"Node avatar for {nodeTitle}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeDescription-1745505309836","value":{"description":"{description}"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1745505309836","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505309836":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1745505309836","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false}}}},"page":"/blogs/BlogMessagePage/BlogMessagePage","query":{"boardId":"educatordeveloperblog","messageSubject":"teach-chatgpt-to-answer-questions-using-azure-ai-search--azure-openai-lang-chain","messageId":"3969713"},"buildId":"HEhyUrv5OXNBIbfCLaOrw","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"o365","openTelemetryServiceVersion":"25.1.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/customComponent/CustomComponent/CustomComponent.tsx","./components/blogs/BlogArticleWidget/BlogArticleWidget.tsx","./components/external/components/ExternalComponent.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","../shared/client/components/common/List/UnstyledList/UnstyledList.tsx","./components/messages/MessageView/MessageView.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=BlogMessagePage&entity.id=board%3Aeducatordeveloperblog&entity.id=message%3A3969713","strategy":"afterInteractive"}]}