渡せるtokenいっぱいまで渡したい
現状毎回4チャンクだけ文章を取ってきているが、渡せるtokenいっぱいまで渡したいblu3mo.icon
歌詞みたいcFQ2f7LRuLYP.icon
わかるわかるnishio.icon
ベストマッチから4チャンク連続で取ってる?
yesblu3mo.icon
それに合った適切なPromptを見つけられれば、良さそうblu3mo.icon
現状、渡したドキュメントをそのまま吐き出すみたいな回答をしてくるので、そのPromptのままでソースのランダムさを高めると回答がよりとんちんかんになりそう
なるほどnishio.icon
今のクオリアさんは「下記の議論を参考にあなたの意見を述べよ」ってプロンプトなので僕の意見や他人のTweetやScrapbox上の議論を雑に突っ込んで運用してるけどあんまり気にならないな
確かに話が連続してない格言集を連続で読ませて生成した時には雑な短い要約の羅列になってイマイチだった
要約をするのではなく論点を一つに絞って語れ、というプロンプトに明示するといいのかな〜
2023-03-05nishio.icon
tiktoken.get_encoding("cl100k_base").encode("Hello, world.")
残り何トークン取得できるか調べる(X)
ベクトルサーチの結果を
A: トークン上限Xで返させる
B: 多めに返させて自分で切る
当初BのつもりだったがAのオプションがあるならそれでもいいな
tiktokenでトークン数を数えた
プロンプトが400程度
サンプルが1200程度
たくさん読ませたい時にサンプルを削るのが面倒で少ないけど、もっと入れられる
ベクトルサーチの前にまずはそこを作る
day74を丸ごと追加したけど2599
80件くらいのリストを作ったら5000超えたのでひとまずこれで良い
多分全体では10倍くらいある
頭から順に入るだけ入れる
code:python
to_use = []
for s in samples:
size = get_size(s)
if rest < size:
break
to_use.append(s)
rest -= size
できた
code:json
"usage": {
"completion_tokens": 72,
"prompt_tokens": 3828,
"total_tokens": 3900
}
あとはこのリストが類似度順ソートになればいい
この時点で人がプロンプトを書いていたv2までとは違うものになったと思うのでv3にした
2023-03-07nishio.icon
LangChain読む
昨日僕が作ったやつと似た目的のもの
VectorStoreとして何を選べばいいのかさっぱりわからん
あー、未解決問題の原因になっちゃうのか
(他の選択肢を自分は検討していないが)
このエラーに遭遇した人を他に見つけていないので、レアケースだと思って良いかと思います
結論:分厚い抽象化レイヤーを捨てて素朴に実装する方がいい
79/79 [00:00<00:00, 10089.22it/s]
素朴な実装で80件くらいだと0.1msec
ソートがO(NlogN)だからまあ1000倍の8万件でやっと1秒かなぐらいの見積もり
クオリアさんは8万件もない
8万件ってどれくらいかな、長文を刻んで食わせるケースだと…
300KBのファイルが7万トークンだったのでこれを300件とすると、80MBくらい
書籍の裁断スキャンテキストが834冊分で178MB
code:python
class VectorStore:
def __init__(self):
self.cache = pickle.load(open("qualia-vector.pickle", "rb"))
def get(self, body):
if body not in self.cache:
self.cachebody = embed(body) pickle.dump(open("qualia-vector.pickle", "wb"), self.cache)
def get_sorted(self, query):
q = np.array(embed(query))
buf = []
for body, v in tqdm(self.cache.items()):
buf.append((q.dot(v), body))
buf.sort(reverse=True)
return buf
なんだかんだの末に、結局この程度のコードを書けば目的は達成できた
あとは、今は適当に80件しか入れてないけど、残りのクオリアさんの発言も全部入れようと思う