Skip to content

Commit

Permalink
Replace tokenizer-go with tiktoken-go
Browse files Browse the repository at this point in the history
  • Loading branch information
xwjdsh authored and lyricat committed Apr 13, 2023
1 parent cf742e2 commit da655cb
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 71 deletions.
10 changes: 8 additions & 2 deletions cmd/httpd/httpd.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/pandodao/botastic/internal/chanhub"
"github.com/pandodao/botastic/internal/gpt"
"github.com/pandodao/botastic/internal/milvus"
"github.com/pandodao/botastic/internal/tiktoken"
appServ "github.com/pandodao/botastic/service/app"
botServ "github.com/pandodao/botastic/service/bot"
convServ "github.com/pandodao/botastic/service/conv"
Expand Down Expand Up @@ -85,11 +86,16 @@ func NewCmdHttpd() *cobra.Command {
indexes := index.New(ctx, milvusClient)
models := model.New(h)

tiktokenHandler, err := tiktoken.Init()
if err != nil {
return err
}

userz := userServ.New(userServ.Config{
ExtraRate: cfg.Sys.ExtraRate,
InitUserCredits: cfg.Sys.InitUserCredits,
}, client, users)
indexService := indexServ.NewService(ctx, gptHandler, indexes, userz, models)
indexService := indexServ.NewService(ctx, gptHandler, indexes, userz, models, tiktokenHandler)
appz := appServ.New(appServ.Config{
SecretKey: cfg.Sys.SecretKey,
}, apps, indexService)
Expand All @@ -111,7 +117,7 @@ func NewCmdHttpd() *cobra.Command {
// httpd's workers
workers := []worker.Worker{
// rotater
rotater.New(rotater.Config{}, gptHandler, convs, apps, models, convz, botz, middlewarez, userz, hub),
rotater.New(rotater.Config{}, gptHandler, convs, apps, models, convz, botz, middlewarez, userz, hub, tiktokenHandler),

ordersyncer.New(ordersyncer.Config{
Interval: cfg.OrderSyncer.Interval,
Expand Down
8 changes: 2 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ require (
github.com/milvus-io/milvus-sdk-go/v2 v2.2.0
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c
github.com/pandodao/mixpay-go v0.0.0-20230405103808-9f656bd75b03
github.com/pandodao/tokenizer-go v0.0.1
github.com/pkoukk/tiktoken-go v0.1.1-0.20230410080739-eb45b82397d3
github.com/pressly/goose/v3 v3.9.0
github.com/rs/cors v1.8.3
github.com/sashabaranov/go-openai v1.5.7
Expand All @@ -43,19 +43,15 @@ require (
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/redact v1.1.3 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
github.com/dlclark/regexp2 v1.8.1 // indirect
github.com/dop251/goja v0.0.0-20230304130813-e2f543bf4b4c // indirect
github.com/dop251/goja_nodejs v0.0.0-20230226152057-060fa99b809f // indirect
github.com/dlclark/regexp2 v1.9.0 // indirect
github.com/ethereum/go-ethereum v1.11.5 // indirect
github.com/fkgi/abnf v1.0.0 // indirect
github.com/fox-one/msgpack v1.0.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/getsentry/sentry-go v0.18.0 // indirect
github.com/go-resty/resty/v2 v2.7.0 // indirect
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/pprof v0.0.0-20230309165930-d61513b1440d // indirect
github.com/gorilla/schema v1.2.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
Expand Down
33 changes: 4 additions & 29 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,8 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
Expand Down Expand Up @@ -117,18 +114,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dlclark/regexp2 v1.8.1 h1:6Lcdwya6GjPUNsBct8Lg/yRPwMhABj269AAzdGSiR+0=
github.com/dlclark/regexp2 v1.8.1/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk=
github.com/dop251/goja v0.0.0-20221118162653-d4bf6fde1b86/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs=
github.com/dop251/goja v0.0.0-20230304130813-e2f543bf4b4c h1:/utv6nmTctV6OVgfk5+O6lEMEWL+6KJy4h9NZ5fnkQQ=
github.com/dop251/goja v0.0.0-20230304130813-e2f543bf4b4c/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4=
github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y=
github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM=
github.com/dop251/goja_nodejs v0.0.0-20230226152057-060fa99b809f h1:mmnNidRg3cMfcgyeNtIBSDZgjf/85lA/2pplccwSxYg=
github.com/dop251/goja_nodejs v0.0.0-20230226152057-060fa99b809f/go.mod h1:0tlktQL7yHfYEtjcRGi/eiOkbDR5XF7gyFFvbC5//E0=
github.com/dlclark/regexp2 v1.9.0 h1:pTK/l/3qYIKaRXuHnEnIf7Y5NxfRPfpb7dis6/gdlVI=
github.com/dlclark/regexp2 v1.9.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI=
github.com/drone/signal v1.0.0/go.mod h1:S8t92eFT0g4WUgEc/LxG+LCuiskpMNsG0ajAMGnyZpc=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
Expand Down Expand Up @@ -196,8 +183,6 @@ github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJ
github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=
github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
Expand Down Expand Up @@ -283,9 +268,6 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg=
github.com/google/pprof v0.0.0-20230309165930-d61513b1440d h1:um9/pc7tKMINFfP1eE7Wv6PRGXlcCSJkVajF7KJw3uQ=
github.com/google/pprof v0.0.0-20230309165930-d61513b1440d/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
Expand All @@ -312,7 +294,6 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
Expand Down Expand Up @@ -484,8 +465,6 @@ github.com/pandodao/mixpay-go v0.0.0-20230405103808-9f656bd75b03 h1:TOcnjRJI0OCi
github.com/pandodao/mixpay-go v0.0.0-20230405103808-9f656bd75b03/go.mod h1:PYFFg5bTeuZAnqZu3oXUDPIUCdrOZ+Hv1FrbJzBw5LA=
github.com/pandodao/passport-go v1.0.8 h1:TpX1rmQh2Mian1z1/2ah94e6gYUjOJD1Q0sTrM1jwTM=
github.com/pandodao/passport-go v1.0.8/go.mod h1:wDXFINRWI/mhckKb2jmWFbx9WFm8PyFPH4Zv9jlxd6s=
github.com/pandodao/tokenizer-go v0.0.1 h1:pbS0l5kDqaFmQtRXIFqOgRsh32qfMg+TEpptXURvCJ8=
github.com/pandodao/tokenizer-go v0.0.1/go.mod h1:ln+rU29YAhh7JcdlJWNt/ah6XrAzW6+LUE7DRcLoIdk=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
Expand All @@ -498,6 +477,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pkoukk/tiktoken-go v0.1.1-0.20230410080739-eb45b82397d3 h1:FYfenqNMwqoPShnkzw7tSsvOzjkCTx5FL+hRbIWXACs=
github.com/pkoukk/tiktoken-go v0.1.1-0.20230410080739-eb45b82397d3/go.mod h1:BijIqAP84FMYC4XbdJgjyMpiSjusU8x0Y0W9K2t0QtU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pressly/goose/v3 v3.9.0 h1:3LB3zjt9zTebK+URKuCdGAxPwtpJfyVlalrzCzcVAtA=
Expand Down Expand Up @@ -742,7 +723,6 @@ golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
Expand Down Expand Up @@ -823,21 +803,18 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand All @@ -849,8 +826,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
Expand Down
71 changes: 71 additions & 0 deletions internal/tiktoken/tiktoken.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package tiktoken

import (
"fmt"
"strings"
"sync"

"github.com/pandodao/botastic/core"
"github.com/pkoukk/tiktoken-go"
)

type Handler struct {
mutex sync.Mutex
defaultTiktoken *tiktoken.Tiktoken
encodingMap map[string]*tiktoken.Tiktoken
}

func Init() (*Handler, error) {
// default encoding
encoding := "cl100k_base"
t, err := tiktoken.GetEncoding(encoding)
if err != nil {
return nil, err
}

h := &Handler{
defaultTiktoken: t,
encodingMap: map[string]*tiktoken.Tiktoken{
encoding: t,
},
}
return h, nil
}

func (h *Handler) CalToken(provider, model, text string) (int, error) {
if provider == core.ModelProviderOpenAI {
encodingName, ok := tiktoken.MODEL_TO_ENCODING[model]
if !ok {
return 0, fmt.Errorf("invalid openai model: %s", model)
}

h.mutex.Lock()
te, ok := h.encodingMap[encodingName]
h.mutex.Unlock()
if ok {
return len(te.Encode(text, nil, nil)), nil
}

h.mutex.Lock()
defer h.mutex.Unlock()

te, err := tiktoken.GetEncoding(encodingName)
if err != nil {
return 0, err
}
h.encodingMap[encodingName] = te
return len(te.Encode(text, nil, nil)), nil
}

// use default encoding for other providers
return len(h.defaultTiktoken.Encode(text, nil, nil)), nil
}

func (h *Handler) CalTokenByName(name, text string) (int, error) {
ss := strings.Split(name, ":")
if len(ss) != 2 {
return 0, fmt.Errorf("invalid name: %s", name)
}

return h.CalToken(ss[0], ss[1], text)
}
46 changes: 28 additions & 18 deletions service/index/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,19 @@ import (
"github.com/pandodao/botastic/core"
"github.com/pandodao/botastic/internal/gpt"
"github.com/pandodao/botastic/internal/milvus"
"github.com/pandodao/botastic/internal/tiktoken"
"github.com/pandodao/botastic/session"
"github.com/pandodao/tokenizer-go"
gogpt "github.com/sashabaranov/go-openai"
)

func NewService(ctx context.Context, gptHandler *gpt.Handler, indexes core.IndexStore, userz core.UserService, models core.ModelStore) core.IndexService {
func NewService(ctx context.Context, gptHandler *gpt.Handler, indexes core.IndexStore, userz core.UserService, models core.ModelStore, tiktokenHandler *tiktoken.Handler) core.IndexService {
return &serviceImpl{
gptHandler: gptHandler,
indexes: indexes,
userz: userz,
models: models,
createEmbeddingsLimitChan: make(chan struct{}, 20),
tiktokenHandler: tiktokenHandler,
}
}

Expand All @@ -31,20 +32,15 @@ type serviceImpl struct {
userz core.UserService
models core.ModelStore
createEmbeddingsLimitChan chan struct{}
tiktokenHandler *tiktoken.Handler
}

func (s *serviceImpl) createEmbeddingsWithLimit(ctx context.Context, req gogpt.EmbeddingRequest, userID uint64) (gogpt.EmbeddingResponse, error) {
func (s *serviceImpl) createEmbeddingsWithLimit(ctx context.Context, req gogpt.EmbeddingRequest, userID uint64, m *core.Model) (gogpt.EmbeddingResponse, error) {
s.createEmbeddingsLimitChan <- struct{}{}
defer func() {
<-s.createEmbeddingsLimitChan
}()

// TODO support custom embedding models
m, err := s.models.GetModel(ctx, fmt.Sprintf("%s:%s", core.ModelProviderOpenAI, gogpt.AdaEmbeddingV2.String()))
if err != nil {
return gogpt.EmbeddingResponse{}, fmt.Errorf("models.GetModel: %w", err)
}

resp, err := s.gptHandler.CreateEmbeddings(ctx, req)
if err == nil {
if err := s.userz.ConsumeCreditsByModel(ctx, userID, *m, int64(resp.Usage.PromptTokens), int64(resp.Usage.CompletionTokens)); err != nil {
Expand All @@ -66,10 +62,16 @@ func (s *serviceImpl) SearchIndex(ctx context.Context, userID uint64, query stri

app := session.AppFrom(ctx)

provider, providerModel := core.ModelProviderOpenAI, gogpt.AdaEmbeddingV2.String()
m, err := s.models.GetModel(ctx, fmt.Sprintf("%s:%s", provider, providerModel))
if err != nil {
return nil, fmt.Errorf("models.GetModel: %w", err)
}

resp, err := s.createEmbeddingsWithLimit(ctx, gogpt.EmbeddingRequest{
Input: []string{query},
Model: gogpt.AdaEmbeddingV2,
}, userID)
}, userID, m)

if err != nil {
return nil, err
Expand All @@ -87,24 +89,32 @@ func (s *serviceImpl) SearchIndex(ctx context.Context, userID uint64, query stri

func (s *serviceImpl) CreateIndexes(ctx context.Context, userID uint64, items []*core.Index) error {
input := make([]string, 0, len(items))
var totalToken uint64
var totalToken int

provider, providerModel := core.ModelProviderOpenAI, gogpt.AdaEmbeddingV2.String()
m, err := s.models.GetModel(ctx, fmt.Sprintf("%s:%s", provider, providerModel))
if err != nil {
return fmt.Errorf("models.GetModel: %w", err)
}

for _, item := range items {
token := tokenizer.MustCalToken(item.Data)
totalToken += uint64(token)
item.DataToken = int64(token)
tokens, err := s.tiktokenHandler.CalToken(provider, providerModel, item.Data)
if err != nil {
return err
}
totalToken += tokens
item.DataToken = int64(tokens)
input = append(input, item.Data)
}

// @TODO calculate token limit according to the model
if totalToken > 8191 {
if totalToken > m.MaxToken {
return core.ErrTokenExceedLimit
}

// @TODO should not pending here
resp, err := s.createEmbeddingsWithLimit(ctx, gogpt.EmbeddingRequest{
Input: input,
Model: gogpt.AdaEmbeddingV2,
}, userID)
}, userID, m)

if err != nil {
return fmt.Errorf("CreateEmbeddings: %w", err)
Expand Down

0 comments on commit da655cb

Please sign in to comment.