File size: 3,880 Bytes
ceb472c
 
4189f9e
 
8993dbb
4189f9e
 
ceb472c
9a02618
4fbd4b0
4189f9e
b23bba4
 
5ede890
b23bba4
 
4d4ea35
b23bba4
 
 
 
 
 
4d4ea35
 
b23bba4
 
 
 
 
 
 
 
 
 
 
eb4bd74
b23bba4
 
eb800fb
2988cff
 
4d4ea35
6ff171e
eb800fb
855a94a
ceb472c
b23bba4
4d4ea35
 
b23bba4
 
 
 
 
6ff171e
b23bba4
2988cff
e659e75
4189f9e
2988cff
 
b23bba4
 
6ff171e
855a94a
ceb472c
 
eb800fb
 
ceb472c
eb800fb
 
 
60949e3
eb800fb
9f84ffb
eb800fb
 
ceb472c
90bf77f
60949e3
 
 
 
 
 
 
 
227827f
60949e3
 
 
 
 
 
 
 
227827f
8448a0a
9a02618
 
60949e3
 
 
4fbd4b0
e659e75
9a02618
e659e75
 
9a02618
 
60949e3
 
aa87ec6
60949e3
 
 
e37c55c
7171e66
2988cff
 
4fbd4b0
e37c55c
4fbd4b0
9a02618
 
4fbd4b0
b23bba4
4fbd4b0
b23bba4
 
 
514097e
 
 
4fbd4b0
7171e66
5599fc0
4d4ea35
60949e3
2e68462
 
60949e3
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

// IMPORT LIBRARIES TOOLS
import { pipeline, env } from 'https://cdn.jsdelivr.net/npm/@xenova/[email protected]';

// skip local model check
env.allowLocalModels = false;

// GLOBAL VARIABLES
let PROMPT_INPUT = `Happy people are better than [MASK].` // a field for writing or changing a text value
let pField

// RUN TEXT-GEN MODEL

async function textGenTask(input){
  console.log('text-gen task initiated')

  const pipe = await pipeline('text-generation', 'HuggingFaceH4/zephyr-7b-beta')

  var out = await pipe(input)

  console.log(await out)
  console.log('text-gen task completed')

  let OUTPUT_LIST = [] // a blank array to store the results from the model

  // parsing of output
  await out.forEach(o => {
    console.log(o)
    OUTPUT_LIST.push(o.generated_text)
  })

  console.log(OUTPUT_LIST)
  console.log('text-gen parsing complete')

  return await OUTPUT_LIST
  // return await out
}

// RUN FILL-IN MODEL
async function fillInTask(input){
  console.log('fill-in task initiated')

  const pipe = await pipeline('fill-mask', 'Xenova/bert-base-uncased');
  
  var out = await pipe(input);

  console.log(await out) // yields { score, sequence, token, token_str } for each result

  let OUTPUT_LIST = [] // a blank array to store the results from the model

  // parsing of output
  await out.forEach(o => {
    console.log(o) // yields { score, sequence, token, token_str } for each result
    OUTPUT_LIST.push(o.sequence) // put only the full sequence in a list
  })
  
  console.log(await OUTPUT_LIST)

  // displayResults(await OUTPUT_LIST)

  console.log('fill-in task completed')

  // return await out
  return await OUTPUT_LIST
}

// PROCESS MODEL OUTPUT
// a generic function to pass in different model task functions
async function getOutputs(task){
  let output = await task

  await output.forEach(o => {
    OUTPUT_LIST.push(o.sequence) // put only the full sequence in a list
  })

  console.log(OUTPUT_LIST)

  return await OUTPUT_LIST
}

// await getOutputs(fillInTask()) // getOutputs will later connect to the interface to display results


//// p5.js Instance

new p5(function (p5){
  p5.setup = function(){
      p5.noCanvas()
      console.log('p5 instance loaded')
      makeTextDisplay()
      makeFields()
      makeButtons()
    }

  p5.draw = function(){
      // 
  }

  function makeTextDisplay(){
    let title = p5.createElement('h1','p5.js Critical AI Prompt Battle')
    let intro = p5.createP(`This tool lets you explore several AI prompts results at once.`) 
    p5.createP(`Use it to explore what models 'know' about various concepts, communities, and cultures. For more information on prompt programming and critical AI, see [Tutorial & extra info][TO-DO][XXX]`)
  }

  function makeFields(){
    pField = p5.createInput(PROMPT_INPUT) // turns the string into an input; now access the text via PROMPT_INPUT.value()
    pField.size(700)
    pField.attribute('label', `Write a text prompt with one [MASK] that the model will fill in.`)
    p5.createP(pField.attribute('label'))
    pField.addClass("prompt")
    // pField.value(PROMPT_INPUT)
    // console.log(pField.value())
  }

  function makeButtons(){
    let submitButton = p5.createButton("SUBMIT")
    submitButton.size(170)
    submitButton.class('submit')
    submitButton.mousePressed(displayResults)
    let outHeader = p5.createElement('h3',"Results") 
  }

  async function displayResults(){
    console.log('displayed, pressed')

    PROMPT_INPUT = pField.value() // updates prompt if it's changed
    console.log("latest prompt: ", PROMPT_INPUT)

    // let fillIn = await fillInTask(PROMPT_INPUT)

    // let outs = await getOutputs(fillIn)

    let outs = await textGenTask(PROMPT_INPUT)

    console.log(outs)
  
    // text = str(outs)
    
    let outText = p5.createP('')
    await outText.html(outs) // true appends text instead of replaces
  }

});