langchainrb_rails 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +28 -0
- data/.tool-versions +1 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile +5 -1
- data/Gemfile.lock +102 -78
- data/README.md +92 -7
- data/lib/langchainrb_overrides/vectorsearch/pgvector.rb +124 -0
- data/lib/langchainrb_rails/active_record/hooks.rb +21 -5
- data/lib/langchainrb_rails/generators/langchainrb_rails/base_generator.rb +24 -0
- data/lib/langchainrb_rails/generators/langchainrb_rails/chroma_generator.rb +54 -0
- data/lib/langchainrb_rails/generators/langchainrb_rails/pgvector_generator.rb +75 -0
- data/lib/langchainrb_rails/generators/langchainrb_rails/pinecone_generator.rb +3 -19
- data/lib/langchainrb_rails/generators/langchainrb_rails/templates/add_vector_column_template.rb.tt +10 -0
- data/lib/langchainrb_rails/generators/langchainrb_rails/templates/chroma_initializer.rb.tt +9 -0
- data/lib/langchainrb_rails/generators/langchainrb_rails/templates/enable_vector_extension_template.rb.tt +5 -0
- data/lib/langchainrb_rails/generators/langchainrb_rails/templates/pgvector_initializer.rb.tt +7 -0
- data/lib/langchainrb_rails/railtie.rb +2 -0
- data/lib/langchainrb_rails/version.rb +1 -1
- data/lib/langchainrb_rails.rb +5 -0
- metadata +13 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 54ab2d33d89929b9222202d42cc5616aac73ca65fa81c3e4f2bc3d516a3a05c6
|
|
4
|
+
data.tar.gz: 4ce553994a4219904875168369ab598de11162db2cd6810d202af005acb10638
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bd93a8976a54120bcec4f8c10ff5bfc5c36d8bccd9f172b071a7732d675ade00ddc3021f93ecb080f508728fdb06b45e5c086933b0bd5522dd094b08d9334d93
|
|
7
|
+
data.tar.gz: 0fd5d062e69a441c50c4963749e31c6773f38ba3e063d21574983b5fd4579c495c3e1b95d340540754c8f89b110c4e1f6ea3f0399265bcf315a0d26f5b6b8e36
|
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
TargetRubyVersion: 2.7
|
|
3
|
+
NewCops: enable
|
|
4
|
+
Exclude:
|
|
5
|
+
- 'bin/**/*'
|
|
6
|
+
- 'db/schema.rb'
|
|
7
|
+
- 'vendor/**/*'
|
|
8
|
+
- 'spec/fixtures/**/*'
|
|
9
|
+
|
|
10
|
+
Metrics/LineLength:
|
|
11
|
+
Max: 140
|
|
12
|
+
|
|
13
|
+
Metrics/BlockLength:
|
|
14
|
+
Exclude:
|
|
15
|
+
- 'spec/**/*.rb'
|
|
16
|
+
|
|
17
|
+
Style/Documentation:
|
|
18
|
+
Enabled: false
|
|
19
|
+
|
|
20
|
+
Style/FrozenStringLiteralComment:
|
|
21
|
+
Enabled: true
|
|
22
|
+
|
|
23
|
+
Style/StringLiterals:
|
|
24
|
+
Enabled: false
|
|
25
|
+
|
|
26
|
+
Lint/SuppressedException:
|
|
27
|
+
Exclude:
|
|
28
|
+
- 'spec/**/*.rb'
|
data/.tool-versions
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby 3.1.2
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
-
## [0.1.
|
|
3
|
+
## [0.1.4] - 2023-11-20
|
|
4
|
+
- Bugfix AR integration when using vectorsearch other than Pgvector
|
|
5
|
+
|
|
6
|
+
## [0.1.3] - 2023-11-01
|
|
7
|
+
- Pgvector vectorsearch generator
|
|
8
|
+
|
|
9
|
+
## [0.1.2] - 2023-10-27
|
|
10
|
+
- Pinecone vectorsearch generator
|
|
4
11
|
|
|
12
|
+
## [0.1.1] - 2023-10-23
|
|
13
|
+
|
|
14
|
+
## [0.1.0] - 2023-10-22
|
|
5
15
|
- Initial release
|
data/Gemfile
CHANGED
|
@@ -5,10 +5,14 @@ source "https://rubygems.org"
|
|
|
5
5
|
# Specify your gem's dependencies in langchainrb_rails.gemspec
|
|
6
6
|
gemspec
|
|
7
7
|
|
|
8
|
-
gem "rake", "~> 13.
|
|
8
|
+
gem "rake", "~> 13.1"
|
|
9
9
|
|
|
10
10
|
gem "rspec", "~> 3.0"
|
|
11
11
|
|
|
12
|
+
gem "bundler-audit", require: false
|
|
13
|
+
gem "brakeman", require: false
|
|
14
|
+
gem "rubocop", require: false
|
|
15
|
+
|
|
12
16
|
gem "standardrb"
|
|
13
17
|
|
|
14
18
|
gem "langchainrb"
|
data/Gemfile.lock
CHANGED
|
@@ -1,76 +1,77 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
langchainrb_rails (0.1.
|
|
4
|
+
langchainrb_rails (0.1.4)
|
|
5
5
|
langchainrb (~> 0.7.0)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
actioncable (7.1.
|
|
11
|
-
actionpack (= 7.1.
|
|
12
|
-
activesupport (= 7.1.
|
|
10
|
+
actioncable (7.1.2)
|
|
11
|
+
actionpack (= 7.1.2)
|
|
12
|
+
activesupport (= 7.1.2)
|
|
13
13
|
nio4r (~> 2.0)
|
|
14
14
|
websocket-driver (>= 0.6.1)
|
|
15
15
|
zeitwerk (~> 2.6)
|
|
16
|
-
actionmailbox (7.1.
|
|
17
|
-
actionpack (= 7.1.
|
|
18
|
-
activejob (= 7.1.
|
|
19
|
-
activerecord (= 7.1.
|
|
20
|
-
activestorage (= 7.1.
|
|
21
|
-
activesupport (= 7.1.
|
|
16
|
+
actionmailbox (7.1.2)
|
|
17
|
+
actionpack (= 7.1.2)
|
|
18
|
+
activejob (= 7.1.2)
|
|
19
|
+
activerecord (= 7.1.2)
|
|
20
|
+
activestorage (= 7.1.2)
|
|
21
|
+
activesupport (= 7.1.2)
|
|
22
22
|
mail (>= 2.7.1)
|
|
23
23
|
net-imap
|
|
24
24
|
net-pop
|
|
25
25
|
net-smtp
|
|
26
|
-
actionmailer (7.1.
|
|
27
|
-
actionpack (= 7.1.
|
|
28
|
-
actionview (= 7.1.
|
|
29
|
-
activejob (= 7.1.
|
|
30
|
-
activesupport (= 7.1.
|
|
26
|
+
actionmailer (7.1.2)
|
|
27
|
+
actionpack (= 7.1.2)
|
|
28
|
+
actionview (= 7.1.2)
|
|
29
|
+
activejob (= 7.1.2)
|
|
30
|
+
activesupport (= 7.1.2)
|
|
31
31
|
mail (~> 2.5, >= 2.5.4)
|
|
32
32
|
net-imap
|
|
33
33
|
net-pop
|
|
34
34
|
net-smtp
|
|
35
35
|
rails-dom-testing (~> 2.2)
|
|
36
|
-
actionpack (7.1.
|
|
37
|
-
actionview (= 7.1.
|
|
38
|
-
activesupport (= 7.1.
|
|
36
|
+
actionpack (7.1.2)
|
|
37
|
+
actionview (= 7.1.2)
|
|
38
|
+
activesupport (= 7.1.2)
|
|
39
39
|
nokogiri (>= 1.8.5)
|
|
40
|
+
racc
|
|
40
41
|
rack (>= 2.2.4)
|
|
41
42
|
rack-session (>= 1.0.1)
|
|
42
43
|
rack-test (>= 0.6.3)
|
|
43
44
|
rails-dom-testing (~> 2.2)
|
|
44
45
|
rails-html-sanitizer (~> 1.6)
|
|
45
|
-
actiontext (7.1.
|
|
46
|
-
actionpack (= 7.1.
|
|
47
|
-
activerecord (= 7.1.
|
|
48
|
-
activestorage (= 7.1.
|
|
49
|
-
activesupport (= 7.1.
|
|
46
|
+
actiontext (7.1.2)
|
|
47
|
+
actionpack (= 7.1.2)
|
|
48
|
+
activerecord (= 7.1.2)
|
|
49
|
+
activestorage (= 7.1.2)
|
|
50
|
+
activesupport (= 7.1.2)
|
|
50
51
|
globalid (>= 0.6.0)
|
|
51
52
|
nokogiri (>= 1.8.5)
|
|
52
|
-
actionview (7.1.
|
|
53
|
-
activesupport (= 7.1.
|
|
53
|
+
actionview (7.1.2)
|
|
54
|
+
activesupport (= 7.1.2)
|
|
54
55
|
builder (~> 3.1)
|
|
55
56
|
erubi (~> 1.11)
|
|
56
57
|
rails-dom-testing (~> 2.2)
|
|
57
58
|
rails-html-sanitizer (~> 1.6)
|
|
58
|
-
activejob (7.1.
|
|
59
|
-
activesupport (= 7.1.
|
|
59
|
+
activejob (7.1.2)
|
|
60
|
+
activesupport (= 7.1.2)
|
|
60
61
|
globalid (>= 0.3.6)
|
|
61
|
-
activemodel (7.1.
|
|
62
|
-
activesupport (= 7.1.
|
|
63
|
-
activerecord (7.1.
|
|
64
|
-
activemodel (= 7.1.
|
|
65
|
-
activesupport (= 7.1.
|
|
62
|
+
activemodel (7.1.2)
|
|
63
|
+
activesupport (= 7.1.2)
|
|
64
|
+
activerecord (7.1.2)
|
|
65
|
+
activemodel (= 7.1.2)
|
|
66
|
+
activesupport (= 7.1.2)
|
|
66
67
|
timeout (>= 0.4.0)
|
|
67
|
-
activestorage (7.1.
|
|
68
|
-
actionpack (= 7.1.
|
|
69
|
-
activejob (= 7.1.
|
|
70
|
-
activerecord (= 7.1.
|
|
71
|
-
activesupport (= 7.1.
|
|
68
|
+
activestorage (7.1.2)
|
|
69
|
+
actionpack (= 7.1.2)
|
|
70
|
+
activejob (= 7.1.2)
|
|
71
|
+
activerecord (= 7.1.2)
|
|
72
|
+
activesupport (= 7.1.2)
|
|
72
73
|
marcel (~> 1.0)
|
|
73
|
-
activesupport (7.1.
|
|
74
|
+
activesupport (7.1.2)
|
|
74
75
|
base64
|
|
75
76
|
bigdecimal
|
|
76
77
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
@@ -83,19 +84,23 @@ GEM
|
|
|
83
84
|
addressable (2.8.5)
|
|
84
85
|
public_suffix (>= 2.0.2, < 6.0)
|
|
85
86
|
ast (2.4.2)
|
|
86
|
-
baran (0.1.
|
|
87
|
-
base64 (0.
|
|
87
|
+
baran (0.1.10)
|
|
88
|
+
base64 (0.2.0)
|
|
88
89
|
bigdecimal (3.1.4)
|
|
90
|
+
brakeman (6.0.1)
|
|
89
91
|
builder (3.2.4)
|
|
92
|
+
bundler-audit (0.9.1)
|
|
93
|
+
bundler (>= 1.2.0, < 3)
|
|
94
|
+
thor (~> 1.0)
|
|
90
95
|
byebug (11.1.3)
|
|
91
96
|
coderay (1.1.3)
|
|
92
97
|
colorize (0.8.1)
|
|
93
98
|
concurrent-ruby (1.2.2)
|
|
94
99
|
connection_pool (2.4.1)
|
|
95
100
|
crass (1.0.6)
|
|
96
|
-
date (3.3.
|
|
101
|
+
date (3.3.4)
|
|
97
102
|
diff-lcs (1.5.0)
|
|
98
|
-
drb (2.
|
|
103
|
+
drb (2.2.0)
|
|
99
104
|
ruby2_keywords
|
|
100
105
|
erubi (1.12.0)
|
|
101
106
|
globalid (1.2.1)
|
|
@@ -103,18 +108,20 @@ GEM
|
|
|
103
108
|
i18n (1.14.1)
|
|
104
109
|
concurrent-ruby (~> 1.0)
|
|
105
110
|
io-console (0.6.0)
|
|
106
|
-
irb (1.
|
|
111
|
+
irb (1.9.0)
|
|
107
112
|
rdoc
|
|
108
113
|
reline (>= 0.3.8)
|
|
109
114
|
json (2.6.3)
|
|
110
115
|
json-schema (4.0.0)
|
|
111
116
|
addressable (>= 2.8)
|
|
112
|
-
langchainrb (0.7.
|
|
117
|
+
langchainrb (0.7.5)
|
|
113
118
|
baran (~> 0.1.9)
|
|
114
119
|
colorize (~> 0.8.1)
|
|
115
120
|
json-schema (~> 4.0.0)
|
|
121
|
+
matrix
|
|
116
122
|
pragmatic_segmenter (~> 0.3.0)
|
|
117
123
|
tiktoken_ruby (~> 0.0.5)
|
|
124
|
+
to_bool (~> 2.0.0)
|
|
118
125
|
zeitwerk (~> 2.5)
|
|
119
126
|
language_server-protocol (3.17.0.3)
|
|
120
127
|
lint_roller (1.1.0)
|
|
@@ -127,22 +134,29 @@ GEM
|
|
|
127
134
|
net-pop
|
|
128
135
|
net-smtp
|
|
129
136
|
marcel (1.0.2)
|
|
137
|
+
matrix (0.4.2)
|
|
130
138
|
method_source (1.0.0)
|
|
131
139
|
mini_mime (1.1.5)
|
|
140
|
+
mini_portile2 (2.8.5)
|
|
132
141
|
minitest (5.20.0)
|
|
133
|
-
mutex_m (0.
|
|
134
|
-
net-imap (0.4.
|
|
142
|
+
mutex_m (0.2.0)
|
|
143
|
+
net-imap (0.4.4)
|
|
135
144
|
date
|
|
136
145
|
net-protocol
|
|
137
146
|
net-pop (0.1.2)
|
|
138
147
|
net-protocol
|
|
139
|
-
net-protocol (0.2.
|
|
148
|
+
net-protocol (0.2.2)
|
|
140
149
|
timeout
|
|
141
150
|
net-smtp (0.4.0)
|
|
142
151
|
net-protocol
|
|
143
152
|
nio4r (2.5.9)
|
|
153
|
+
nokogiri (1.15.4)
|
|
154
|
+
mini_portile2 (~> 2.8.2)
|
|
155
|
+
racc (~> 1.4)
|
|
144
156
|
nokogiri (1.15.4-x86_64-darwin)
|
|
145
157
|
racc (~> 1.4)
|
|
158
|
+
nokogiri (1.15.4-x86_64-linux)
|
|
159
|
+
racc (~> 1.4)
|
|
146
160
|
parallel (1.23.0)
|
|
147
161
|
parser (3.2.2.4)
|
|
148
162
|
ast (~> 2.4.1)
|
|
@@ -157,8 +171,8 @@ GEM
|
|
|
157
171
|
pry (>= 0.13, < 0.15)
|
|
158
172
|
psych (5.1.1.1)
|
|
159
173
|
stringio
|
|
160
|
-
public_suffix (5.0.
|
|
161
|
-
racc (1.7.
|
|
174
|
+
public_suffix (5.0.4)
|
|
175
|
+
racc (1.7.3)
|
|
162
176
|
rack (3.0.8)
|
|
163
177
|
rack-session (2.0.0)
|
|
164
178
|
rack (>= 3.0.0)
|
|
@@ -167,20 +181,20 @@ GEM
|
|
|
167
181
|
rackup (2.1.0)
|
|
168
182
|
rack (>= 3)
|
|
169
183
|
webrick (~> 1.8)
|
|
170
|
-
rails (7.1.
|
|
171
|
-
actioncable (= 7.1.
|
|
172
|
-
actionmailbox (= 7.1.
|
|
173
|
-
actionmailer (= 7.1.
|
|
174
|
-
actionpack (= 7.1.
|
|
175
|
-
actiontext (= 7.1.
|
|
176
|
-
actionview (= 7.1.
|
|
177
|
-
activejob (= 7.1.
|
|
178
|
-
activemodel (= 7.1.
|
|
179
|
-
activerecord (= 7.1.
|
|
180
|
-
activestorage (= 7.1.
|
|
181
|
-
activesupport (= 7.1.
|
|
184
|
+
rails (7.1.2)
|
|
185
|
+
actioncable (= 7.1.2)
|
|
186
|
+
actionmailbox (= 7.1.2)
|
|
187
|
+
actionmailer (= 7.1.2)
|
|
188
|
+
actionpack (= 7.1.2)
|
|
189
|
+
actiontext (= 7.1.2)
|
|
190
|
+
actionview (= 7.1.2)
|
|
191
|
+
activejob (= 7.1.2)
|
|
192
|
+
activemodel (= 7.1.2)
|
|
193
|
+
activerecord (= 7.1.2)
|
|
194
|
+
activestorage (= 7.1.2)
|
|
195
|
+
activesupport (= 7.1.2)
|
|
182
196
|
bundler (>= 1.15.0)
|
|
183
|
-
railties (= 7.1.
|
|
197
|
+
railties (= 7.1.2)
|
|
184
198
|
rails-dom-testing (2.2.0)
|
|
185
199
|
activesupport (>= 5.0.0)
|
|
186
200
|
minitest
|
|
@@ -188,20 +202,21 @@ GEM
|
|
|
188
202
|
rails-html-sanitizer (1.6.0)
|
|
189
203
|
loofah (~> 2.21)
|
|
190
204
|
nokogiri (~> 1.14)
|
|
191
|
-
railties (7.1.
|
|
192
|
-
actionpack (= 7.1.
|
|
193
|
-
activesupport (= 7.1.
|
|
205
|
+
railties (7.1.2)
|
|
206
|
+
actionpack (= 7.1.2)
|
|
207
|
+
activesupport (= 7.1.2)
|
|
194
208
|
irb
|
|
195
209
|
rackup (>= 1.0.0)
|
|
196
210
|
rake (>= 12.2)
|
|
197
211
|
thor (~> 1.0, >= 1.2.2)
|
|
198
212
|
zeitwerk (~> 2.6)
|
|
199
213
|
rainbow (3.1.1)
|
|
200
|
-
rake (13.0
|
|
201
|
-
|
|
214
|
+
rake (13.1.0)
|
|
215
|
+
rb_sys (0.9.83)
|
|
216
|
+
rdoc (6.6.0)
|
|
202
217
|
psych (>= 4.0.0)
|
|
203
218
|
regexp_parser (2.8.2)
|
|
204
|
-
reline (0.
|
|
219
|
+
reline (0.4.0)
|
|
205
220
|
io-console (~> 0.5)
|
|
206
221
|
rexml (3.2.6)
|
|
207
222
|
rspec (3.12.0)
|
|
@@ -217,29 +232,28 @@ GEM
|
|
|
217
232
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
218
233
|
rspec-support (~> 3.12.0)
|
|
219
234
|
rspec-support (3.12.1)
|
|
220
|
-
rubocop (1.
|
|
221
|
-
base64 (~> 0.1.1)
|
|
235
|
+
rubocop (1.57.2)
|
|
222
236
|
json (~> 2.3)
|
|
223
237
|
language_server-protocol (>= 3.17.0)
|
|
224
238
|
parallel (~> 1.10)
|
|
225
|
-
parser (>= 3.2.2.
|
|
239
|
+
parser (>= 3.2.2.4)
|
|
226
240
|
rainbow (>= 2.2.2, < 4.0)
|
|
227
241
|
regexp_parser (>= 1.8, < 3.0)
|
|
228
242
|
rexml (>= 3.2.5, < 4.0)
|
|
229
243
|
rubocop-ast (>= 1.28.1, < 2.0)
|
|
230
244
|
ruby-progressbar (~> 1.7)
|
|
231
245
|
unicode-display_width (>= 2.4.0, < 3.0)
|
|
232
|
-
rubocop-ast (1.
|
|
246
|
+
rubocop-ast (1.30.0)
|
|
233
247
|
parser (>= 3.2.1.0)
|
|
234
248
|
rubocop-performance (1.19.1)
|
|
235
249
|
rubocop (>= 1.7.0, < 2.0)
|
|
236
250
|
rubocop-ast (>= 0.4.0)
|
|
237
251
|
ruby-progressbar (1.13.0)
|
|
238
252
|
ruby2_keywords (0.0.5)
|
|
239
|
-
standard (1.
|
|
253
|
+
standard (1.32.0)
|
|
240
254
|
language_server-protocol (~> 3.17.0.2)
|
|
241
255
|
lint_roller (~> 1.0)
|
|
242
|
-
rubocop (~> 1.
|
|
256
|
+
rubocop (~> 1.57.2)
|
|
243
257
|
standard-custom (~> 1.0.0)
|
|
244
258
|
standard-performance (~> 1.2)
|
|
245
259
|
standard-custom (1.0.2)
|
|
@@ -250,10 +264,14 @@ GEM
|
|
|
250
264
|
rubocop-performance (~> 1.19.1)
|
|
251
265
|
standardrb (1.0.1)
|
|
252
266
|
standard
|
|
253
|
-
stringio (3.0.
|
|
267
|
+
stringio (3.0.9)
|
|
254
268
|
thor (1.3.0)
|
|
269
|
+
tiktoken_ruby (0.0.6)
|
|
270
|
+
rb_sys (~> 0.9.68)
|
|
255
271
|
tiktoken_ruby (0.0.6-x86_64-darwin)
|
|
256
|
-
|
|
272
|
+
tiktoken_ruby (0.0.6-x86_64-linux)
|
|
273
|
+
timeout (0.4.1)
|
|
274
|
+
to_bool (2.0.0)
|
|
257
275
|
tzinfo (2.0.6)
|
|
258
276
|
concurrent-ruby (~> 1.0)
|
|
259
277
|
unicode (0.4.4.4)
|
|
@@ -263,18 +281,24 @@ GEM
|
|
|
263
281
|
websocket-extensions (>= 0.1.0)
|
|
264
282
|
websocket-extensions (0.1.5)
|
|
265
283
|
yard (0.9.34)
|
|
266
|
-
zeitwerk (2.6.
|
|
284
|
+
zeitwerk (2.6.12)
|
|
267
285
|
|
|
268
286
|
PLATFORMS
|
|
287
|
+
ruby
|
|
269
288
|
x86_64-darwin-19
|
|
289
|
+
x86_64-darwin-22
|
|
290
|
+
x86_64-linux
|
|
270
291
|
|
|
271
292
|
DEPENDENCIES
|
|
293
|
+
brakeman
|
|
294
|
+
bundler-audit
|
|
272
295
|
langchainrb
|
|
273
296
|
langchainrb_rails!
|
|
274
297
|
pry-byebug (~> 3.10.0)
|
|
275
298
|
rails (> 6.0.0)
|
|
276
|
-
rake (~> 13.
|
|
299
|
+
rake (~> 13.1)
|
|
277
300
|
rspec (~> 3.0)
|
|
301
|
+
rubocop
|
|
278
302
|
standardrb
|
|
279
303
|
yard (~> 0.9.34)
|
|
280
304
|
|
data/README.md
CHANGED
|
@@ -1,33 +1,117 @@
|
|
|
1
1
|
💎🔗 Langchain.rb for Rails
|
|
2
2
|
---
|
|
3
|
-
|
|
3
|
+
The fastest way to sprinkle AI ✨ on top of your Rails app. Add OpenAI-powered question-and-answering in minutes.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Available for paid consulting engagements! [Email me](mailto:andrei@sourcelabs.io).
|
|
6
6
|
|
|
7
7
|

|
|
8
8
|
[](https://badge.fury.io/rb/langchainrb_rails)
|
|
9
9
|
[](http://rubydoc.info/gems/langchainrb_rails)
|
|
10
10
|
[](https://github.com/andreibondarev/langchainrb_rails/blob/main/LICENSE.txt)
|
|
11
11
|
[](https://discord.gg/WDARp7J2n8)
|
|
12
|
+
[](https://twitter.com/rushing_andrei)
|
|
12
13
|
|
|
14
|
+
## Dependencies
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
* Ruby 3.0+
|
|
17
|
+
* Postgres 11+
|
|
18
|
+
|
|
19
|
+
## Table of Contents
|
|
20
|
+
|
|
21
|
+
- [Installation](#installation)
|
|
22
|
+
- [Generators](#rails-generators)
|
|
15
23
|
|
|
16
24
|
## Installation
|
|
17
25
|
|
|
18
26
|
Install the gem and add to the application's Gemfile by executing:
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
```bash
|
|
28
|
+
bundle add langchainrb_rails
|
|
29
|
+
```
|
|
21
30
|
|
|
22
31
|
If bundler is not being used to manage dependencies, install the gem by executing:
|
|
32
|
+
```bash
|
|
33
|
+
gem install langchainrb_rails
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Configuration w/ [Pgvector](https://github.com/pgvector/pgvector) (requires Postgres 11+)
|
|
37
|
+
|
|
38
|
+
1. Run the Rails generator to add vectorsearch to your ActiveRecord model
|
|
39
|
+
```bash
|
|
40
|
+
rails generate langchainrb_rails:pgvector --model=Product --llm=openai
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
This adds required dependencies to your Gemfile, creates the `config/initializers/langchainrb_rails.rb` initializer file, database migrations, and adds the necessary code to the ActiveRecord model to enable vectorsearch.
|
|
44
|
+
|
|
45
|
+
2. Bundle and migrate
|
|
46
|
+
```bash
|
|
47
|
+
bundle install && rails db:migrate
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
3. Set the env var `OPENAI_API_KEY` to your OpenAI API key: https://platform.openai.com/account/api-keys
|
|
51
|
+
```ruby
|
|
52
|
+
ENV["OPENAI_API_KEY"]=
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
5. Generate embeddings for your model
|
|
56
|
+
```ruby
|
|
57
|
+
Product.embed!
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
This can take a while depending on the number of database records.
|
|
61
|
+
|
|
62
|
+
## Usage
|
|
63
|
+
|
|
64
|
+
### Question and Answering
|
|
65
|
+
```ruby
|
|
66
|
+
Product.ask("list the brands of shoes that are in stock")
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Returns a `String` with a natural language answer. The answer is assembled using the following steps:
|
|
70
|
+
|
|
71
|
+
1. An embedding is generated for the passed in `question` using the selected LLM.
|
|
72
|
+
2. We calculate a [cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) to find records that most closely match your question's embedding.
|
|
73
|
+
3. A prompt is created using the question and the above records (their `#as_vector` representation )are added as context.
|
|
74
|
+
4. This prompt is passed to the LLM to generate an answer
|
|
75
|
+
|
|
76
|
+
### Similarity Search
|
|
77
|
+
```ruby
|
|
78
|
+
Product.similarity_search("t-shirt")
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Returns ActiveRecord relation that most closely matches the `query` using vector search.
|
|
82
|
+
|
|
83
|
+
## Customization
|
|
84
|
+
|
|
85
|
+
### Changing the vector representation of a record
|
|
86
|
+
|
|
87
|
+
By default, embeddings are generated by calling the following method on your model instance:
|
|
88
|
+
```ruby
|
|
89
|
+
to_json(except: :embedding)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
You can override this by defining an `#as_vector` method in your model:
|
|
93
|
+
```ruby
|
|
94
|
+
def as_vector
|
|
95
|
+
{ name: name, description: description, category: category.name, ... }.to_json
|
|
96
|
+
end
|
|
97
|
+
```
|
|
23
98
|
|
|
24
|
-
|
|
99
|
+
Re-generate embeddings after modifying this method:
|
|
100
|
+
|
|
101
|
+
```ruby
|
|
102
|
+
Product.embed!
|
|
103
|
+
```
|
|
25
104
|
|
|
26
105
|
## Rails Generators
|
|
27
106
|
|
|
28
|
-
###
|
|
107
|
+
### Pgvector Generator
|
|
29
108
|
|
|
109
|
+
```bash
|
|
110
|
+
rails generate langchainrb_rails:pgvector --model=Product --llm=openai
|
|
30
111
|
```
|
|
112
|
+
|
|
113
|
+
### Pinecone Generator - adds vectorsearch to your ActiveRecord model
|
|
114
|
+
```bash
|
|
31
115
|
rails generate langchainrb_rails:pinecone --model=Product --llm=openai
|
|
32
116
|
```
|
|
33
117
|
|
|
@@ -39,3 +123,4 @@ Pinecone Generator does the following:
|
|
|
39
123
|
1. Creates the `config/initializers/langchainrb_rails.rb` initializer file
|
|
40
124
|
2. Adds necessary code to the ActiveRecord model to enable vectorsearch
|
|
41
125
|
3. Adds `pinecone` gem to the Gemfile
|
|
126
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Overriding Langchain.rb's Pgvector implementation to use ActiveRecord.
|
|
4
|
+
# Original implementation: https://github.com/andreibondarev/langchainrb/blob/main/lib/langchain/vectorsearch/pgvector.rb
|
|
5
|
+
|
|
6
|
+
module Langchain::Vectorsearch
|
|
7
|
+
class Pgvector < Base
|
|
8
|
+
#
|
|
9
|
+
# The PostgreSQL vector search adapter
|
|
10
|
+
#
|
|
11
|
+
# Gem requirements:
|
|
12
|
+
# gem "pgvector", "~> 0.2"
|
|
13
|
+
#
|
|
14
|
+
# Usage:
|
|
15
|
+
# pgvector = Langchain::Vectorsearch::Pgvector.new(llm:)
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
# The operators supported by the PostgreSQL vector search adapter
|
|
19
|
+
OPERATORS = [
|
|
20
|
+
"cosine",
|
|
21
|
+
"euclidean",
|
|
22
|
+
"inner_product"
|
|
23
|
+
]
|
|
24
|
+
DEFAULT_OPERATOR = "cosine"
|
|
25
|
+
|
|
26
|
+
attr_reader :operator, :llm
|
|
27
|
+
attr_accessor :model
|
|
28
|
+
|
|
29
|
+
# @param url [String] The URL of the PostgreSQL database
|
|
30
|
+
# @param index_name [String] The name of the table to use for the index
|
|
31
|
+
# @param llm [Object] The LLM client to use
|
|
32
|
+
# @param namespace [String] The namespace to use for the index when inserting/querying
|
|
33
|
+
def initialize(llm:)
|
|
34
|
+
# If the line below is called, the generator fails as calls to
|
|
35
|
+
# LangchainrbRails.config.vectorsearch will generate an exception.
|
|
36
|
+
# These happen in the template files.
|
|
37
|
+
# depends_on "neighbor"
|
|
38
|
+
|
|
39
|
+
@operator = DEFAULT_OPERATOR
|
|
40
|
+
|
|
41
|
+
super(llm: llm)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Add a list of texts to the index
|
|
45
|
+
# @param texts [Array<String>] The texts to add to the index
|
|
46
|
+
# @param ids [Array<String>] The ids to add to the index, in the same order as the texts
|
|
47
|
+
# @return [Array<Integer>] The the ids of the added texts.
|
|
48
|
+
def add_texts(texts:, ids:)
|
|
49
|
+
embeddings = texts.map do |text|
|
|
50
|
+
llm.embed(text: text).embedding
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# I believe the records returned by #find must be in the
|
|
54
|
+
# same order as the embeddings. I _think_ this works for uuid ids but didn't test
|
|
55
|
+
# deeply.
|
|
56
|
+
# TODO - implement find_each so we don't load all records into memory
|
|
57
|
+
model.find(ids).each.with_index do |record, i|
|
|
58
|
+
record.update_column(:embedding, embeddings[i])
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def update_texts(texts:, ids:)
|
|
63
|
+
add_texts(texts: texts, ids: ids)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Invoke a rake task that will create an initializer (`config/initializers/langchain.rb`) file
|
|
67
|
+
# and db/migrations/* files
|
|
68
|
+
def create_default_schema
|
|
69
|
+
Rake::Task["pgvector"].invoke
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Destroy default schema
|
|
73
|
+
def destroy_default_schema
|
|
74
|
+
# Tell the user to rollback the migration
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Search for similar texts in the index
|
|
78
|
+
# @param query [String] The text to search for
|
|
79
|
+
# @param k [Integer] The number of top results to return
|
|
80
|
+
# @return [Array<Hash>] The results of the search
|
|
81
|
+
# TODO - drop the named "query:" param so it is the same interface as #ask?
|
|
82
|
+
def similarity_search(query:, k: 4)
|
|
83
|
+
embedding = llm.embed(text: query).embedding
|
|
84
|
+
|
|
85
|
+
similarity_search_by_vector(
|
|
86
|
+
embedding: embedding,
|
|
87
|
+
k: k
|
|
88
|
+
)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Search for similar texts in the index by the passed in vector.
|
|
92
|
+
# You must generate your own vector using the same LLM that generated the embeddings stored in the Vectorsearch DB.
|
|
93
|
+
# @param embedding [Array<Float>] The vector to search for
|
|
94
|
+
# @param k [Integer] The number of top results to return
|
|
95
|
+
# @return [Array<Hash>] The results of the search
|
|
96
|
+
# TODO - drop the named "embedding:" param so it is the same interface as #ask?
|
|
97
|
+
def similarity_search_by_vector(embedding:, k: 4)
|
|
98
|
+
model
|
|
99
|
+
.nearest_neighbors(:embedding, embedding, distance: operator)
|
|
100
|
+
.limit(k)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Ask a question and return the answer
|
|
104
|
+
# @param question [String] The question to ask
|
|
105
|
+
# @param k [Integer] The number of results to have in context
|
|
106
|
+
# @yield [String] Stream responses back one String at a time
|
|
107
|
+
# @return [String] The answer to the question
|
|
108
|
+
def ask(question, k: 4, &block)
|
|
109
|
+
# Noisy as the embedding column has a lot of data
|
|
110
|
+
ActiveRecord::Base.logger.silence do
|
|
111
|
+
search_results = similarity_search(query: question, k: k)
|
|
112
|
+
|
|
113
|
+
context = search_results.map do |result|
|
|
114
|
+
result.as_vector
|
|
115
|
+
end
|
|
116
|
+
context = context.join("\n---\n")
|
|
117
|
+
|
|
118
|
+
prompt = generate_rag_prompt(question: question, context: context)
|
|
119
|
+
|
|
120
|
+
llm.chat(prompt: prompt, &block)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -61,7 +61,9 @@ module LangchainrbRails
|
|
|
61
61
|
#
|
|
62
62
|
# @return [String] the text representation of the model
|
|
63
63
|
def as_vector
|
|
64
|
-
|
|
64
|
+
# Don't vectorize the embedding ... this would happen if it already exists
|
|
65
|
+
# for a record and we update.
|
|
66
|
+
to_json(except: :embedding)
|
|
65
67
|
end
|
|
66
68
|
|
|
67
69
|
module ClassMethods
|
|
@@ -70,6 +72,20 @@ module LangchainrbRails
|
|
|
70
72
|
# @param provider [Object] The `Langchain::Vectorsearch::*` instance
|
|
71
73
|
def vectorsearch
|
|
72
74
|
class_variable_set(:@@provider, LangchainrbRails.config.vectorsearch)
|
|
75
|
+
|
|
76
|
+
# Pgvector-specific configuration
|
|
77
|
+
if LangchainrbRails.config.vectorsearch.is_a?(Langchain::Vectorsearch::Pgvector)
|
|
78
|
+
has_neighbors(:embedding)
|
|
79
|
+
LangchainrbRails.config.vectorsearch.model = self
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Iterates over records and generate embeddings.
|
|
84
|
+
# Will re-generate for ALL records (not just records with embeddings).
|
|
85
|
+
def embed!
|
|
86
|
+
find_each do |record|
|
|
87
|
+
record.upsert_to_vectorsearch
|
|
88
|
+
end
|
|
73
89
|
end
|
|
74
90
|
|
|
75
91
|
# Search for similar texts
|
|
@@ -84,7 +100,7 @@ module LangchainrbRails
|
|
|
84
100
|
)
|
|
85
101
|
|
|
86
102
|
# We use "__id" when Weaviate is the provider
|
|
87
|
-
ids = records.map { |record| record.
|
|
103
|
+
ids = records.map { |record| record.try("id") || record.dig("__id") }
|
|
88
104
|
where(id: ids)
|
|
89
105
|
end
|
|
90
106
|
|
|
@@ -94,12 +110,12 @@ module LangchainrbRails
|
|
|
94
110
|
# @param k [Integer] The number of results to have in context
|
|
95
111
|
# @yield [String] Stream responses back one String at a time
|
|
96
112
|
# @return [String] The answer to the question
|
|
97
|
-
def ask(question
|
|
113
|
+
def ask(question, k: 4, &block)
|
|
98
114
|
class_variable_get(:@@provider).ask(
|
|
99
|
-
question
|
|
115
|
+
question,
|
|
100
116
|
k: k,
|
|
101
117
|
&block
|
|
102
|
-
)
|
|
118
|
+
).completion
|
|
103
119
|
end
|
|
104
120
|
end
|
|
105
121
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
require "rails/generators/active_record"
|
|
3
|
+
|
|
4
|
+
module LangchainrbRails
|
|
5
|
+
module Generators
|
|
6
|
+
class BaseGenerator < Rails::Generators::Base
|
|
7
|
+
include ::ActiveRecord::Generators::Migration
|
|
8
|
+
|
|
9
|
+
class_option :model, type: :string, required: true, desc: "ActiveRecord Model to add vectorsearch to", aliases: "-m"
|
|
10
|
+
class_option :llm, type: :string, required: true, desc: "LLM provider that will be used to generate embeddings and completions"
|
|
11
|
+
|
|
12
|
+
# Available LLM providers to be passed in as --llm option
|
|
13
|
+
LLMS = {
|
|
14
|
+
"cohere" => "Langchain::LLM::Cohere",
|
|
15
|
+
"google_palm" => "Langchain::LLM::GooglePalm",
|
|
16
|
+
"hugging_face" => "Langchain::LLM::HuggingFace",
|
|
17
|
+
"llama_cpp" => "Langchain::LLM::LlamaCpp",
|
|
18
|
+
"ollama" => "Langchain::LLM::Ollama",
|
|
19
|
+
"openai" => "Langchain::LLM::OpenAI",
|
|
20
|
+
"replicate" => "Langchain::LLM::Replicate"
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LangchainrbRails
|
|
4
|
+
module Generators
|
|
5
|
+
#
|
|
6
|
+
# ChromaGenerator does the following:
|
|
7
|
+
# 1. Creates the `langchainrb_rails.rb` initializer file
|
|
8
|
+
# 2. Adds necessary code to the ActiveRecord model to enable vectorsearch
|
|
9
|
+
# 3. Adds `chroma-db` gem to the Gemfile
|
|
10
|
+
#
|
|
11
|
+
# Usage:
|
|
12
|
+
# rails generate langchainrb_rails:chrome --model=Product --llm=openai
|
|
13
|
+
#
|
|
14
|
+
class ChromaGenerator < LangchainrbRails::Generators::BaseGenerator
|
|
15
|
+
desc "This generator adds Chroma vectorsearch integration to your ActiveRecord model"
|
|
16
|
+
source_root File.join(__dir__, "templates")
|
|
17
|
+
|
|
18
|
+
# Creates the `langchainrb_rails.rb` initializer file
|
|
19
|
+
def create_initializer_file
|
|
20
|
+
template "chroma_initializer.rb", "config/initializers/langchainrb_rails.rb"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Adds `vectorsearch` class method to the model and `after_save` callback that calls `upsert_to_vectorsearch()`
|
|
24
|
+
def add_to_model
|
|
25
|
+
inject_into_class "app/models/#{model_name.downcase}.rb", model_name do
|
|
26
|
+
" vectorsearch\n\n after_save :upsert_to_vectorsearch\n\n"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Adds `chroma-db` gem to the Gemfile
|
|
31
|
+
# TODO: Can we automatically run `bundle install`?
|
|
32
|
+
def add_to_gemfile
|
|
33
|
+
gem "chroma-db", version: "~> 0.6.0"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
# @return [String] Name of the model
|
|
39
|
+
def model_name
|
|
40
|
+
options["model"]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @return [String] LLM provider to use
|
|
44
|
+
def llm
|
|
45
|
+
options["llm"]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @return [Langchain::LLM::*] LLM class
|
|
49
|
+
def llm_class
|
|
50
|
+
Langchain::LLM.const_get(LLMS[llm])
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LangchainrbRails
|
|
4
|
+
module Generators
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# rails g langchain:pgvector -model=Product -llm=openai
|
|
8
|
+
#
|
|
9
|
+
class PgvectorGenerator < LangchainrbRails::Generators::BaseGenerator
|
|
10
|
+
desc "This generator adds Pgvector vectorsearch integration to your ActiveRecord model"
|
|
11
|
+
source_root File.join(__dir__, "templates")
|
|
12
|
+
|
|
13
|
+
def copy_migration
|
|
14
|
+
migration_template "enable_vector_extension_template.rb", "db/migrate/enable_vector_extension.rb", migration_version: migration_version
|
|
15
|
+
migration_template "add_vector_column_template.rb", "db/migrate/add_vector_column_to_#{table_name}.rb", migration_version: migration_version
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def create_initializer_file
|
|
19
|
+
template "pgvector_initializer.rb", "config/initializers/langchainrb_rails.rb"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def migration_version
|
|
23
|
+
"[#{::ActiveRecord::VERSION::MAJOR}.#{::ActiveRecord::VERSION::MINOR}]"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_to_model
|
|
27
|
+
inject_into_class "app/models/#{model_name.downcase}.rb", model_name do
|
|
28
|
+
" vectorsearch\n\n after_save :upsert_to_vectorsearch\n\n"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def add_to_gemfile
|
|
33
|
+
# Dependency for Langchain PgVector
|
|
34
|
+
gem "neighbor"
|
|
35
|
+
gem "ruby-openai"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def post_install_message
|
|
39
|
+
say "Please do the following to start Q&A with your #{model_name} records:", :green
|
|
40
|
+
say "1. Run `bundle install` to install the new gems."
|
|
41
|
+
say "2. Set `OPENAI_API_KEY` environment variable to your OpenAI API key."
|
|
42
|
+
say "3. Run `rails db:migrate` to apply the database migrations to enable pgvector and add the embedding column."
|
|
43
|
+
say "4. In Rails console, run `#{model_name}.embed!` to set the embeddings for all records."
|
|
44
|
+
say "5. Ask a question in the Rails console, ie: `#{model_name}.ask('[YOUR QUESTION]')`"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
# @return [String] Name of the model
|
|
50
|
+
def model_name
|
|
51
|
+
options["model"]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @return [String] Table name of the model
|
|
55
|
+
def table_name
|
|
56
|
+
model_name.downcase.pluralize
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @return [String] LLM provider to use
|
|
60
|
+
def llm
|
|
61
|
+
options["llm"]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @return [Langchain::LLM::*] LLM class
|
|
65
|
+
def llm_class
|
|
66
|
+
Langchain::LLM.const_get(LLMS[llm])
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @return [Integer] Dimension of the vector to be used
|
|
70
|
+
def vector_dimension
|
|
71
|
+
llm_class.default_dimension
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module LangchainrbRails
|
|
4
4
|
module Generators
|
|
@@ -11,26 +11,10 @@ module LangchainrbRails
|
|
|
11
11
|
# Usage:
|
|
12
12
|
# rails generate langchainrb_rails:pinecone --model=Product --llm=openai
|
|
13
13
|
#
|
|
14
|
-
class PineconeGenerator <
|
|
14
|
+
class PineconeGenerator < LangchainrbRails::Generators::BaseGenerator
|
|
15
15
|
desc "This generator adds Pinecone vectorsearch integration to your ActiveRecord model"
|
|
16
|
-
|
|
17
|
-
include ::ActiveRecord::Generators::Migration
|
|
18
16
|
source_root File.join(__dir__, "templates")
|
|
19
17
|
|
|
20
|
-
class_option :model, type: :string, required: true, desc: "ActiveRecord Model to add vectorsearch to", aliases: "-m"
|
|
21
|
-
class_option :llm, type: :string, required: true, desc: "LLM provider that will be used to generate embeddings and completions"
|
|
22
|
-
|
|
23
|
-
# Available LLM providers to be passed in as --llm option
|
|
24
|
-
LLMS = {
|
|
25
|
-
"cohere" => "Langchain::LLM::Cohere",
|
|
26
|
-
"google_palm" => "Langchain::LLM::GooglePalm",
|
|
27
|
-
"hugging_face" => "Langchain::LLM::HuggingFace",
|
|
28
|
-
"llama_cpp" => "Langchain::LLM::LlamaCpp",
|
|
29
|
-
"ollama" => "Langchain::LLM::Ollama",
|
|
30
|
-
"openai" => "Langchain::LLM::OpenAI",
|
|
31
|
-
"replicate" => "Langchain::LLM::Replicate"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
18
|
# Creates the `langchainrb_rails.rb` initializer file
|
|
35
19
|
def create_initializer_file
|
|
36
20
|
template "pinecone_initializer.rb", "config/initializers/langchainrb_rails.rb"
|
|
@@ -46,7 +30,7 @@ module LangchainrbRails
|
|
|
46
30
|
# Adds `pinecone` gem to the Gemfile
|
|
47
31
|
# TODO: Can we automatically run `bundle install`?
|
|
48
32
|
def add_to_gemfile
|
|
49
|
-
gem "pinecone"
|
|
33
|
+
gem "pinecone", version: "~> 0.1.6"
|
|
50
34
|
end
|
|
51
35
|
|
|
52
36
|
private
|
|
@@ -9,7 +9,9 @@ module LangchainrbRails
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
generators do
|
|
12
|
+
require_relative "generators/langchainrb_rails/chroma_generator"
|
|
12
13
|
require_relative "generators/langchainrb_rails/pinecone_generator"
|
|
14
|
+
require_relative "generators/langchainrb_rails/pgvector_generator"
|
|
13
15
|
end
|
|
14
16
|
end
|
|
15
17
|
end
|
data/lib/langchainrb_rails.rb
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "forwardable"
|
|
3
4
|
require "langchain"
|
|
5
|
+
require "rails"
|
|
4
6
|
require_relative "langchainrb_rails/version"
|
|
5
7
|
require "langchainrb_rails/railtie"
|
|
6
8
|
require "langchainrb_rails/config"
|
|
9
|
+
require_relative "langchainrb_overrides/vectorsearch/pgvector"
|
|
7
10
|
|
|
8
11
|
module LangchainrbRails
|
|
9
12
|
class Error < StandardError; end
|
|
@@ -13,6 +16,8 @@ module LangchainrbRails
|
|
|
13
16
|
end
|
|
14
17
|
|
|
15
18
|
module Generators
|
|
19
|
+
autoload :BaseGenerator, "langchainrb_rails/generators/langchainrb_rails/base_generator"
|
|
20
|
+
autoload :ChromaGenerator, "langchainrb_rails/generators/langchainrb_rails/chroma_generator"
|
|
16
21
|
autoload :PgvectorGenerator, "langchainrb_rails/generators/langchainrb_rails/pgvector_generator"
|
|
17
22
|
end
|
|
18
23
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: langchainrb_rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrei Bondarev
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-11-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: langchainrb
|
|
@@ -74,16 +74,26 @@ extensions: []
|
|
|
74
74
|
extra_rdoc_files: []
|
|
75
75
|
files:
|
|
76
76
|
- ".rspec"
|
|
77
|
+
- ".rubocop.yml"
|
|
78
|
+
- ".tool-versions"
|
|
77
79
|
- CHANGELOG.md
|
|
78
80
|
- Gemfile
|
|
79
81
|
- Gemfile.lock
|
|
80
82
|
- LICENSE.txt
|
|
81
83
|
- README.md
|
|
82
84
|
- Rakefile
|
|
85
|
+
- lib/langchainrb_overrides/vectorsearch/pgvector.rb
|
|
83
86
|
- lib/langchainrb_rails.rb
|
|
84
87
|
- lib/langchainrb_rails/active_record/hooks.rb
|
|
85
88
|
- lib/langchainrb_rails/config.rb
|
|
89
|
+
- lib/langchainrb_rails/generators/langchainrb_rails/base_generator.rb
|
|
90
|
+
- lib/langchainrb_rails/generators/langchainrb_rails/chroma_generator.rb
|
|
91
|
+
- lib/langchainrb_rails/generators/langchainrb_rails/pgvector_generator.rb
|
|
86
92
|
- lib/langchainrb_rails/generators/langchainrb_rails/pinecone_generator.rb
|
|
93
|
+
- lib/langchainrb_rails/generators/langchainrb_rails/templates/add_vector_column_template.rb.tt
|
|
94
|
+
- lib/langchainrb_rails/generators/langchainrb_rails/templates/chroma_initializer.rb.tt
|
|
95
|
+
- lib/langchainrb_rails/generators/langchainrb_rails/templates/enable_vector_extension_template.rb.tt
|
|
96
|
+
- lib/langchainrb_rails/generators/langchainrb_rails/templates/pgvector_initializer.rb.tt
|
|
87
97
|
- lib/langchainrb_rails/generators/langchainrb_rails/templates/pinecone_initializer.rb.tt
|
|
88
98
|
- lib/langchainrb_rails/railtie.rb
|
|
89
99
|
- lib/langchainrb_rails/version.rb
|
|
@@ -111,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
111
121
|
- !ruby/object:Gem::Version
|
|
112
122
|
version: '0'
|
|
113
123
|
requirements: []
|
|
114
|
-
rubygems_version: 3.
|
|
124
|
+
rubygems_version: 3.3.7
|
|
115
125
|
signing_key:
|
|
116
126
|
specification_version: 4
|
|
117
127
|
summary: Rails wrapper for langchainrb gem
|