From dfc1069b0799f8e973227a156c45e85e30939851 Mon Sep 17 00:00:00 2001 From: Fraser Date: Tue, 8 Aug 2023 23:53:22 -0400 Subject: [PATCH] blank all glossary terms in AI text --- web/src/glossary.tsx | 52 +++++++++++++++++++++++++++++++++++++++++ web/src/pages/index.tsx | 3 ++- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 web/src/glossary.tsx diff --git a/web/src/glossary.tsx b/web/src/glossary.tsx new file mode 100644 index 0000000..adbbd30 --- /dev/null +++ b/web/src/glossary.tsx @@ -0,0 +1,52 @@ +import { useState, useEffect } from "react"; + +// temporary hack to get glossary working +const GLOSSARY_JSON = {"chain of thought prompting":{"term":"chain of thought prompting","pageid":"8EL7","contents":"

Chain-of-thought prompting is a technique which makes a language model generate intermediate reasoning steps in its output.

\n"},"chain-of-thought":{"term":"chain-of-thought","pageid":"8EL7","contents":"

Chain-of-thought prompting is a technique which makes a language model generate intermediate reasoning steps in its output.

\n"},"goodhart's law":{"term":"goodhart's law","pageid":"8185","contents":"

Goodhart’s law states that when a measure becomes a target, it ceases to be a good measure.

\n"},"the big g,":{"term":"the big g,","pageid":"8185","contents":"

Goodhart’s law states that when a measure becomes a target, it ceases to be a good measure.

\n"},"terminal goals":{"term":"terminal goals","pageid":"","contents":"

Goals which are valued as ends in themselves, rather than as instrumental to something else.

\n"},"terminal goal":{"term":"terminal goal","pageid":"","contents":"

Goals which are valued as ends in themselves, rather than as instrumental to something else.

\n"},"orthogonality thesis":{"term":"orthogonality thesis","pageid":"6568","contents":"

The thesis that any level of intelligence is compatible with any terminal goals. This implies that intelligence alone is not enough to make a system moral.

\n"},"instrumental convergence":{"term":"instrumental convergence","pageid":"897I","contents":"

Instrumental convergence is the idea that different AI agents, each with distinct terminal goals, will end up adopting many of the same instrumental goals.

\n"},"instrumentally convergent goals":{"term":"instrumentally convergent goals","pageid":"897I","contents":"

Instrumental convergence is the idea that different AI agents, each with distinct terminal goals, will end up adopting many of the same instrumental goals.

\n"},"llm":{"term":"llm","pageid":"","contents":"

A large language model is an AI model which has been trained on a large body of text, in order to produce texts in a human-like way.

\n"},"large language model":{"term":"large language model","pageid":"","contents":"

A large language model is an AI model which has been trained on a large body of text, in order to produce texts in a human-like way.

\n"},"goal misgeneralization":{"term":"goal misgeneralization","pageid":"","contents":"

pursuing a different goal during deployment from the one that was pursued during training due to distribution shift

\n"},"interpretability":{"term":"interpretability","pageid":"8241","contents":"

Interpretability is an area of alignment research that aims to make machine learning systems easier for humans to understand.

\n"},"existential risk":{"term":"existential risk","pageid":"89LL","contents":"

risks that threaten the destruction of humanity's long-term potential, including human extinction

\n"}} + +type GlossaryItem = { + term: string; + pageid: string; + contents: string; +}; + +// A component which wraps a paragraph and injects glossary terms into it as +// hoverable pop-up links. The text is immediately rendered normally, but after +// the glossary is loaded (which happens once per page, asynchronously), the +// glossary terms are replaced with elements. +export const GlossaryP: React.FC<{content: string}> = ({content}) => { + const [glossary, setGlossary] = useState | null>(null); + const [glossaryRegex, setGlossaryRegex] = useState(null); + + useEffect(() => { + if (glossary === null) { + const glossary = new Map(Object.entries(GLOSSARY_JSON)); + setGlossary(glossary); + setGlossaryRegex(new RegExp(Array.from(glossary.keys()).join("|"), "gim")); + } + }, [glossary]); + + // If the glossary hasn't loaded yet, just render the text normally. + if (glossary == null || glossaryRegex == null) { + return ; + } + + // Otherwise, replace glossary terms with links. We can do this in + // O(n * sum of term lengths) by finding String.prototype.indexOf of + // each term in the glossary (since that'd probably be backed by KMP) + // but I think it should be faster to compile a regex state machine + // once and use that instead. + + return { + const item = glossary.get(match.toLowerCase()); + if (item == undefined) return match; + + const hover_content = item.contents; + const pageid = item.pageid; + return "AAAAAAAAA"; + + })}} />; +} + + + + diff --git a/web/src/pages/index.tsx b/web/src/pages/index.tsx index 9a18f48..a268d9f 100644 --- a/web/src/pages/index.tsx +++ b/web/src/pages/index.tsx @@ -10,6 +10,7 @@ import Image from 'next/image'; import Header from "../header"; import { SearchBox, Followup } from "../searchbox"; import logo from "../logo.svg" +import { GlossaryP } from "~/glossary"; type Citation = { title: string; @@ -202,7 +203,7 @@ const ShowAssistantEntry: React.FC<{entry: AssistantEntry}> = ({entry}) => { response.split("\n").map(paragraph => (

{ paragraph.split(in_text_citation_regex).map((text, i) => { if (i % 2 === 0) { - return text.trim(); + return ; } i = parseInt(text) - 1; if (!citations.has(i)) return `[${text}]`;