generated at
渡せるtokenいっぱいまで渡したい
現状毎回4チャンクだけ文章を取ってきているが、渡せるtokenいっぱいまで渡したいblu3mo
歌詞みたいcFQ2f7LRuLYP
わかるわかるnishio
ベストマッチから4チャンク連続で取ってる?
yesblu3mo
個人的にはTop Kの値を増やして「関係ありそうなところをあちこち読む」のの方が「関係の発見」を強く支援してくれるのではないかと思ってる(類似度Top Kをプロンプトに積みたい)
それに合った適切なPromptを見つけられれば、良さそうblu3mo
現状、渡したドキュメントをそのまま吐き出すみたいな回答をしてくるので、そのPromptのままでソースのランダムさを高めると回答がよりとんちんかんになりそう
なるほどnishio
今のクオリアさんは「下記の議論を参考にあなたの意見を述べよ」ってプロンプトなので僕の意見や他人のTweetやScrapbox上の議論を雑に突っ込んで運用してるけどあんまり気にならないな
確かに話が連続してない格言集を連続で読ませて生成した時には雑な短い要約の羅列になってイマイチだった
要約をするのではなく論点を一つに絞って語れ、というプロンプトに明示するといいのかな〜

2023-03-05nishio
ユーザの入力のトークン数をtiktokenで数える
tiktoken.get_encoding("cl100k_base").encode("Hello, world.")
残り何トークン取得できるか調べる(X)
ベクトルサーチの結果を
A: トークン上限Xで返させる
B: 多めに返させて自分で切る
当初BのつもりだったがAのオプションがあるならそれでもいいな
うーん、じゃあLlamaIndexのアドバンテージは特にないわけなのでLangChainベースに切り替えてLangChainscrapchatのソースを読むかな

tiktokenでトークン数を数えた
プロンプトが400程度
サンプルが1200程度
たくさん読ませたい時にサンプルを削るのが面倒で少ないけど、もっと入れられる
ベクトルサーチの前にまずはそこを作る
day74を丸ごと追加したけど2599
80件くらいのリストを作ったら5000超えたのでひとまずこれで良い
多分全体では10倍くらいある
頭から順に入るだけ入れる
python
to_use = [] for s in samples: size = get_size(s) if rest < size: break to_use.append(s) rest -= size
できた
json
"usage": { "completion_tokens": 72, "prompt_tokens": 3828, "total_tokens": 3900 }
あとはこのリストが類似度順ソートになればいい
この時点で人がプロンプトを書いていたv2までとは違うものになったと思うのでv3にした

2023-03-07nishio
LangChain読む
昨日僕が作ったやつと似た目的のもの
VectorStoreとして何を選べばいいのかさっぱりわからん
FAISSでいいのかな
langchainがfaiss(ベクトル検索ライブラリ)を呼ぶ時にエラーが出ているみたい2023/2/21 Scrapboxの内容を元にしたチャットbotを実装する#640607ab79e11300006bc4d4
あー、未解決問題の原因になっちゃうのか
LangChain Chatの実装にこれが使われているので、faissで良さそうな気がしますblu3mo
(他の選択肢を自分は検討していないが)
このエラーに遭遇した人を他に見つけていないので、レアケースだと思って良いかと思います

結論:分厚い抽象化レイヤーを捨てて素朴に実装する方がいい
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
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.cache[body] = embed(body) pickle.dump(open("qualia-vector.pickle", "wb"), self.cache) return self.cache[body] 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件しか入れてないけど、残りのクオリアさんの発言も全部入れようと思う