langchainrb 0.6.17 → 0.6.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +18 -3
  4. data/lib/langchain/active_record/hooks.rb +14 -0
  5. data/lib/langchain/agent/react_agent.rb +1 -1
  6. data/lib/langchain/agent/sql_query_agent.rb +2 -2
  7. data/lib/langchain/chunk.rb +16 -0
  8. data/lib/langchain/chunker/base.rb +4 -0
  9. data/lib/langchain/chunker/recursive_text.rb +5 -2
  10. data/lib/langchain/chunker/semantic.rb +4 -1
  11. data/lib/langchain/chunker/sentence.rb +4 -2
  12. data/lib/langchain/chunker/text.rb +5 -2
  13. data/lib/langchain/conversation.rb +1 -1
  14. data/lib/langchain/llm/ai21.rb +4 -3
  15. data/lib/langchain/llm/anthropic.rb +3 -3
  16. data/lib/langchain/llm/cohere.rb +6 -5
  17. data/lib/langchain/llm/google_palm.rb +14 -10
  18. data/lib/langchain/llm/hugging_face.rb +4 -3
  19. data/lib/langchain/llm/llama_cpp.rb +1 -1
  20. data/lib/langchain/llm/ollama.rb +18 -6
  21. data/lib/langchain/llm/openai.rb +7 -6
  22. data/lib/langchain/llm/replicate.rb +6 -10
  23. data/lib/langchain/llm/response/ai21_response.rb +13 -0
  24. data/lib/langchain/llm/response/anthropic_response.rb +29 -0
  25. data/lib/langchain/llm/response/base_response.rb +79 -0
  26. data/lib/langchain/llm/response/cohere_response.rb +21 -0
  27. data/lib/langchain/llm/response/google_palm_response.rb +36 -0
  28. data/lib/langchain/llm/response/hugging_face_response.rb +13 -0
  29. data/lib/langchain/llm/response/ollama_response.rb +26 -0
  30. data/lib/langchain/llm/response/openai_response.rb +51 -0
  31. data/lib/langchain/llm/response/replicate_response.rb +28 -0
  32. data/lib/langchain/vectorsearch/base.rb +4 -7
  33. data/lib/langchain/vectorsearch/chroma.rb +13 -12
  34. data/lib/langchain/vectorsearch/elasticsearch.rb +147 -0
  35. data/lib/langchain/vectorsearch/hnswlib.rb +5 -5
  36. data/lib/langchain/vectorsearch/milvus.rb +5 -4
  37. data/lib/langchain/vectorsearch/pgvector.rb +12 -6
  38. data/lib/langchain/vectorsearch/pinecone.rb +14 -13
  39. data/lib/langchain/vectorsearch/qdrant.rb +9 -8
  40. data/lib/langchain/vectorsearch/weaviate.rb +9 -8
  41. data/lib/langchain/version.rb +1 -1
  42. data/lib/langchain.rb +5 -0
  43. metadata +27 -2
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class AnthropicResponse < BaseResponse
5
+ def model
6
+ raw_response.dig("model")
7
+ end
8
+
9
+ def completion
10
+ completions.first
11
+ end
12
+
13
+ def completions
14
+ [raw_response.dig("completion")]
15
+ end
16
+
17
+ def stop_reason
18
+ raw_response.dig("stop_reason")
19
+ end
20
+
21
+ def stop
22
+ raw_response.dig("stop")
23
+ end
24
+
25
+ def log_id
26
+ raw_response.dig("log_id")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain
4
+ module LLM
5
+ class BaseResponse
6
+ attr_reader :raw_response, :model
7
+
8
+ def initialize(raw_response, model: nil)
9
+ @raw_response = raw_response
10
+ @model = model
11
+ end
12
+
13
+ # Returns the completion text
14
+ #
15
+ # @return [String]
16
+ #
17
+ def completion
18
+ raise NotImplementedError
19
+ end
20
+
21
+ # Returns the chat completion text
22
+ #
23
+ # @return [String]
24
+ #
25
+ def chat_completion
26
+ raise NotImplementedError
27
+ end
28
+
29
+ # Return the first embedding
30
+ #
31
+ # @return [Array<Float>]
32
+ def embedding
33
+ raise NotImplementedError
34
+ end
35
+
36
+ # Return the completion candidates
37
+ #
38
+ # @return [Array]
39
+ def completions
40
+ raise NotImplementedError
41
+ end
42
+
43
+ # Return the chat completion candidates
44
+ #
45
+ # @return [Array]
46
+ def chat_completions
47
+ raise NotImplementedError
48
+ end
49
+
50
+ # Return the embeddings
51
+ #
52
+ # @return [Array<Array>]
53
+ def embeddings
54
+ raise NotImplementedError
55
+ end
56
+
57
+ # Number of tokens utilized in the prompt
58
+ #
59
+ # @return [Integer]
60
+ def prompt_tokens
61
+ raise NotImplementedError
62
+ end
63
+
64
+ # Number of tokens utilized to generate the completion
65
+ #
66
+ # @return [Integer]
67
+ def completion_tokens
68
+ raise NotImplementedError
69
+ end
70
+
71
+ # Total number of tokens utilized
72
+ #
73
+ # @return [Integer]
74
+ def total_tokens
75
+ raise NotImplementedError
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class CohereResponse < BaseResponse
5
+ def embedding
6
+ embeddings.first
7
+ end
8
+
9
+ def embeddings
10
+ raw_response.dig("embeddings")
11
+ end
12
+
13
+ def completions
14
+ raw_response.dig("generations")
15
+ end
16
+
17
+ def completion
18
+ completions&.dig(0, "text")
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class GooglePalmResponse < BaseResponse
5
+ attr_reader :prompt_tokens
6
+
7
+ def initialize(raw_response, model: nil, prompt_tokens: nil)
8
+ @prompt_tokens = prompt_tokens
9
+ super(raw_response, model: model)
10
+ end
11
+
12
+ def completion
13
+ completions&.dig(0, "output")
14
+ end
15
+
16
+ def embedding
17
+ embeddings.first
18
+ end
19
+
20
+ def completions
21
+ raw_response.dig("candidates")
22
+ end
23
+
24
+ def chat_completion
25
+ chat_completions&.dig(0, "content")
26
+ end
27
+
28
+ def chat_completions
29
+ raw_response.dig("candidates")
30
+ end
31
+
32
+ def embeddings
33
+ [raw_response.dig("embedding", "value")]
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class HuggingFaceResponse < BaseResponse
5
+ def embeddings
6
+ [raw_response]
7
+ end
8
+
9
+ def embedding
10
+ embeddings.first
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class OllamaResponse < BaseResponse
5
+ def initialize(raw_response, model: nil, prompt_tokens: nil)
6
+ @prompt_tokens = prompt_tokens
7
+ super(raw_response, model: model)
8
+ end
9
+
10
+ def completion
11
+ raw_response.first
12
+ end
13
+
14
+ def completions
15
+ raw_response.is_a?(String) ? [raw_response] : []
16
+ end
17
+
18
+ def embedding
19
+ embeddings.first
20
+ end
21
+
22
+ def embeddings
23
+ [raw_response&.dig("embedding")]
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class OpenAIResponse < BaseResponse
5
+ def model
6
+ raw_response["model"]
7
+ end
8
+
9
+ def created_at
10
+ if raw_response.dig("created")
11
+ Time.at(raw_response.dig("created"))
12
+ end
13
+ end
14
+
15
+ def completion
16
+ completions&.dig(0, "message", "content")
17
+ end
18
+
19
+ def chat_completion
20
+ completion
21
+ end
22
+
23
+ def embedding
24
+ embeddings&.first
25
+ end
26
+
27
+ def completions
28
+ raw_response.dig("choices")
29
+ end
30
+
31
+ def chat_completions
32
+ raw_response.dig("choices")
33
+ end
34
+
35
+ def embeddings
36
+ raw_response.dig("data")&.map { |datum| datum.dig("embedding") }
37
+ end
38
+
39
+ def prompt_tokens
40
+ raw_response.dig("usage", "prompt_tokens")
41
+ end
42
+
43
+ def completion_tokens
44
+ raw_response.dig("usage", "completion_tokens")
45
+ end
46
+
47
+ def total_tokens
48
+ raw_response.dig("usage", "total_tokens")
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::LLM
4
+ class ReplicateResponse < BaseResponse
5
+ def completions
6
+ # Response comes back as an array of strings, e.g.: ["Hi", "how ", "are ", "you?"]
7
+ # The first array element is missing a space at the end, so we add it manually
8
+ raw_response.output[0] += " "
9
+ [raw_response.output.join]
10
+ end
11
+
12
+ def completion
13
+ completions.first
14
+ end
15
+
16
+ def created_at
17
+ Time.parse(raw_response.created_at)
18
+ end
19
+
20
+ def embedding
21
+ embeddings.first
22
+ end
23
+
24
+ def embeddings
25
+ [raw_response.output]
26
+ end
27
+ end
28
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "forwardable"
4
-
5
3
  module Langchain::Vectorsearch
6
4
  # = Vector Databases
7
5
  # A vector database a type of database that stores data as high-dimensional vectors, which are mathematical representations of features or attributes. Each vector has a certain number of dimensions, which can range from tens to thousands, depending on the complexity and granularity of the data.
@@ -9,11 +7,13 @@ module Langchain::Vectorsearch
9
7
  # == Available vector databases
10
8
  #
11
9
  # - {Langchain::Vectorsearch::Chroma}
10
+ # - {Langchain::Vectorsearch::Elasticsearch}
11
+ # - {Langchain::Vectorsearch::Hnswlib}
12
12
  # - {Langchain::Vectorsearch::Milvus}
13
+ # - {Langchain::Vectorsearch::Pgvector}
13
14
  # - {Langchain::Vectorsearch::Pinecone}
14
15
  # - {Langchain::Vectorsearch::Qdrant}
15
16
  # - {Langchain::Vectorsearch::Weaviate}
16
- # - {Langchain::Vectorsearch::Pgvector}
17
17
  #
18
18
  # == Usage
19
19
  #
@@ -150,9 +150,6 @@ module Langchain::Vectorsearch
150
150
  raise NotImplementedError, "#{self.class.name} does not support asking questions"
151
151
  end
152
152
 
153
- def_delegators :llm,
154
- :default_dimension
155
-
156
153
  # HyDE-style prompt
157
154
  #
158
155
  # @param [String] User's question
@@ -184,7 +181,7 @@ module Langchain::Vectorsearch
184
181
  .flatten
185
182
  .map do |path|
186
183
  data = Langchain::Loader.new(path)&.load&.chunks
187
- data.map { |chunk| chunk[:text] }
184
+ data.map { |chunk| chunk.text }
188
185
  end
189
186
 
190
187
  texts.flatten!
@@ -5,7 +5,8 @@ module Langchain::Vectorsearch
5
5
  #
6
6
  # Wrapper around Chroma DB
7
7
  #
8
- # Gem requirements: gem "chroma-db", "~> 0.6.0"
8
+ # Gem requirements:
9
+ # gem "chroma-db", "~> 0.6.0"
9
10
  #
10
11
  # Usage:
11
12
  # chroma = Langchain::Vectorsearch::Chroma.new(url:, index_name:, llm:, llm_api_key:, api_key: nil)
@@ -28,15 +29,16 @@ module Langchain::Vectorsearch
28
29
  end
29
30
 
30
31
  # Add a list of texts to the index
31
- # @param texts [Array] The list of texts to add
32
+ # @param texts [Array<String>] The list of texts to add
33
+ # @param ids [Array<String>] The list of ids to use for the texts (optional)
34
+ # @param metadatas [Array<Hash>] The list of metadata to use for the texts (optional)
32
35
  # @return [Hash] The response from the server
33
- def add_texts(texts:, ids: [])
36
+ def add_texts(texts:, ids: [], metadatas: [])
34
37
  embeddings = Array(texts).map.with_index do |text, i|
35
38
  ::Chroma::Resources::Embedding.new(
36
39
  id: ids[i] ? ids[i].to_s : SecureRandom.uuid,
37
- embedding: llm.embed(text: text),
38
- # TODO: Add support for passing metadata
39
- metadata: {}, # metadatas[index],
40
+ embedding: llm.embed(text: text).embedding,
41
+ metadata: metadatas[i] || {},
40
42
  document: text # Do we actually need to store the whole original document?
41
43
  )
42
44
  end
@@ -45,13 +47,12 @@ module Langchain::Vectorsearch
45
47
  collection.add(embeddings)
46
48
  end
47
49
 
48
- def update_texts(texts:, ids:)
50
+ def update_texts(texts:, ids:, metadatas: [])
49
51
  embeddings = Array(texts).map.with_index do |text, i|
50
52
  ::Chroma::Resources::Embedding.new(
51
53
  id: ids[i].to_s,
52
- embedding: llm.embed(text: text),
53
- # TODO: Add support for passing metadata
54
- metadata: [], # metadatas[index],
54
+ embedding: llm.embed(text: text).embedding,
55
+ metadata: metadatas[i] || {},
55
56
  document: text # Do we actually need to store the whole original document?
56
57
  )
57
58
  end
@@ -85,7 +86,7 @@ module Langchain::Vectorsearch
85
86
  query:,
86
87
  k: 4
87
88
  )
88
- embedding = llm.embed(text: query)
89
+ embedding = llm.embed(text: query).embedding
89
90
 
90
91
  similarity_search_by_vector(
91
92
  embedding: embedding,
@@ -94,7 +95,7 @@ module Langchain::Vectorsearch
94
95
  end
95
96
 
96
97
  # Search for similar texts by embedding
97
- # @param embedding [Array] The embedding to search for
98
+ # @param embedding [Array<Float>] The embedding to search for
98
99
  # @param k [Integer] The number of results to return
99
100
  # @return [Chroma::Resources::Embedding] The response from the server
100
101
  def similarity_search_by_vector(
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Langchain::Vectorsearch
4
+ class Elasticsearch < Base
5
+ #
6
+ # Wrapper around Elasticsearch vector search capabilities.
7
+ #
8
+ # Setting up Elasticsearch:
9
+ # 1. Get Elasticsearch up and running with Docker: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
10
+ # 2. Copy the HTTP CA certificate SHA-256 fingerprint and set the ELASTICSEARCH_CA_FINGERPRINT environment variable
11
+ # 3. Set the ELASTICSEARCH_URL environment variable
12
+ #
13
+ # Gem requirements:
14
+ # gem "elasticsearch", "~> 8.0.0"
15
+ #
16
+ # Usage:
17
+ # llm = Langchain::LLM::OpenAI.new(api_key: ENV["OPENAI_API_KEY"])
18
+ # es = Langchain::Vectorsearch::Elasticsearch.new(
19
+ # url: ENV["ELASTICSEARCH_URL"],
20
+ # index_name: "docs",
21
+ # llm: llm,
22
+ # es_options: {
23
+ # transport_options: {ssl: {verify: false}},
24
+ # ca_fingerprint: ENV["ELASTICSEARCH_CA_FINGERPRINT"]
25
+ # }
26
+ # )
27
+ #
28
+ # es.create_default_schema
29
+ # es.add_texts(texts: ["..."])
30
+ # es.similarity_search(text: "...")
31
+ #
32
+ attr_accessor :es_client, :index_name, :options
33
+
34
+ def initialize(url:, index_name:, llm:, api_key: nil, es_options: {})
35
+ require "elasticsearch"
36
+
37
+ @options = {
38
+ url: url,
39
+ request_timeout: 20,
40
+ log: false
41
+ }.merge(es_options)
42
+
43
+ @es_client = ::Elasticsearch::Client.new(**options)
44
+ @index_name = index_name
45
+
46
+ super(llm: llm)
47
+ end
48
+
49
+ def add_texts(texts: [])
50
+ body = texts.map do |text|
51
+ [
52
+ {index: {_index: index_name}},
53
+ {input: text, input_vector: llm.embed(text: text).embedding}
54
+ ]
55
+ end.flatten
56
+
57
+ es_client.bulk(body: body)
58
+ end
59
+
60
+ def update_texts(texts: [], ids: [])
61
+ body = texts.map.with_index do |text, i|
62
+ [
63
+ {index: {_index: index_name, _id: ids[i]}},
64
+ {input: text, input_vector: llm.embed(text: text).embedding}
65
+ ]
66
+ end.flatten
67
+
68
+ es_client.bulk(body: body)
69
+ end
70
+
71
+ def create_default_schema
72
+ es_client.indices.create(
73
+ index: index_name,
74
+ body: default_schema
75
+ )
76
+ end
77
+
78
+ def delete_default_schema
79
+ es_client.indices.delete(
80
+ index: index_name
81
+ )
82
+ end
83
+
84
+ def default_vector_settings
85
+ {type: "dense_vector", dims: llm.default_dimension}
86
+ end
87
+
88
+ def vector_settings
89
+ options[:vector_settings] || default_vector_settings
90
+ end
91
+
92
+ def default_schema
93
+ {
94
+ mappings: {
95
+ properties: {
96
+ input: {
97
+ type: "text"
98
+ },
99
+ input_vector: vector_settings
100
+ }
101
+ }
102
+ }
103
+ end
104
+
105
+ def default_query(query_vector)
106
+ {
107
+ script_score: {
108
+ query: {match_all: {}},
109
+ script: {
110
+ source: "cosineSimilarity(params.query_vector, 'input_vector') + 1.0",
111
+ params: {
112
+ query_vector: query_vector
113
+ }
114
+ }
115
+ }
116
+ }
117
+ end
118
+
119
+ # TODO: Implement this
120
+ # def ask()
121
+ # end
122
+
123
+ def similarity_search(text: "", k: 10, query: {})
124
+ if text.empty? && query.empty?
125
+ raise "Either text or query should pass as an argument"
126
+ end
127
+
128
+ if query.empty?
129
+ query_vector = llm.embed(text: text).embedding
130
+
131
+ query = default_query(query_vector)
132
+ end
133
+
134
+ es_client.search(body: {query: query, size: k}).body
135
+ end
136
+
137
+ def similarity_search_by_vector(embedding: [], k: 10, query: {})
138
+ if embedding.empty? && query.empty?
139
+ raise "Either embedding or query should pass as an argument"
140
+ end
141
+
142
+ query = default_query(embedding) if query.empty?
143
+
144
+ es_client.search(body: {query: query, size: k}).body
145
+ end
146
+ end
147
+ end
@@ -35,15 +35,15 @@ module Langchain::Vectorsearch
35
35
  #
36
36
  # Add a list of texts and corresponding IDs to the index
37
37
  #
38
- # @param texts [Array] The list of texts to add
39
- # @param ids [Array] The list of corresponding IDs (integers) to the texts
38
+ # @param texts [Array<String>] The list of texts to add
39
+ # @param ids [Array<Integer>] The list of corresponding IDs (integers) to the texts
40
40
  # @return [Boolean] The response from the HNSW library
41
41
  #
42
42
  def add_texts(texts:, ids:)
43
43
  resize_index(texts.size)
44
44
 
45
45
  Array(texts).each_with_index do |text, i|
46
- embedding = llm.embed(text: text)
46
+ embedding = llm.embed(text: text).embedding
47
47
 
48
48
  client.add_point(embedding, ids[i])
49
49
  end
@@ -64,7 +64,7 @@ module Langchain::Vectorsearch
64
64
  query:,
65
65
  k: 4
66
66
  )
67
- embedding = llm.embed(text: query)
67
+ embedding = llm.embed(text: query).embedding
68
68
 
69
69
  similarity_search_by_vector(
70
70
  embedding: embedding,
@@ -75,7 +75,7 @@ module Langchain::Vectorsearch
75
75
  #
76
76
  # Search for the K nearest neighbors of a given vector
77
77
  #
78
- # @param embedding [Array] The embedding to search for
78
+ # @param embedding [Array<Float>] The embedding to search for
79
79
  # @param k [Integer] The number of results to return
80
80
  # @return [Array] Results in the format `[[id1, distance3], [id2, distance2]]`
81
81
  #
@@ -5,7 +5,8 @@ module Langchain::Vectorsearch
5
5
  #
6
6
  # Wrapper around Milvus REST APIs.
7
7
  #
8
- # Gem requirements: gem "milvus", "~> 0.9.2"
8
+ # Gem requirements:
9
+ # gem "milvus", "~> 0.9.2"
9
10
  #
10
11
  # Usage:
11
12
  # milvus = Langchain::Vectorsearch::Milvus.new(url:, index_name:, llm:, api_key:)
@@ -32,7 +33,7 @@ module Langchain::Vectorsearch
32
33
  }, {
33
34
  field_name: "vectors",
34
35
  type: ::Milvus::DATA_TYPES["float_vector"],
35
- field: Array(texts).map { |text| llm.embed(text: text) }
36
+ field: Array(texts).map { |text| llm.embed(text: text).embedding }
36
37
  }
37
38
  ]
38
39
  )
@@ -70,7 +71,7 @@ module Langchain::Vectorsearch
70
71
  type_params: [
71
72
  {
72
73
  key: "dim",
73
- value: default_dimension.to_s
74
+ value: llm.default_dimension.to_s
74
75
  }
75
76
  ]
76
77
  }
@@ -111,7 +112,7 @@ module Langchain::Vectorsearch
111
112
  end
112
113
 
113
114
  def similarity_search(query:, k: 4)
114
- embedding = llm.embed(text: query)
115
+ embedding = llm.embed(text: query).embedding
115
116
 
116
117
  similarity_search_by_vector(
117
118
  embedding: embedding,
@@ -5,10 +5,12 @@ module Langchain::Vectorsearch
5
5
  #
6
6
  # The PostgreSQL vector search adapter
7
7
  #
8
- # Gem requirements: gem "pgvector", "~> 0.2"
8
+ # Gem requirements:
9
+ # gem "sequel", "~> 5.68.0"
10
+ # gem "pgvector", "~> 0.2"
9
11
  #
10
12
  # Usage:
11
- # pgvector = Langchain::Vectorsearch::Pgvector.new(url:, index_name:, llm:, namespace: nil)
13
+ # pgvector = Langchain::Vectorsearch::Pgvector.new(url:, index_name:, llm:, namespace: nil)
12
14
  #
13
15
 
14
16
  # The operators supported by the PostgreSQL vector search adapter
@@ -52,7 +54,7 @@ module Langchain::Vectorsearch
52
54
  # the added or updated texts.
53
55
  def upsert_texts(texts:, ids:)
54
56
  data = texts.zip(ids).flat_map do |(text, id)|
55
- {id: id, content: text, vectors: llm.embed(text: text).to_s, namespace: namespace}
57
+ {id: id, content: text, vectors: llm.embed(text: text).embedding.to_s, namespace: namespace}
56
58
  end
57
59
  # @db[table_name.to_sym].multi_insert(data, return: :primary_key)
58
60
  @db[table_name.to_sym]
@@ -70,7 +72,7 @@ module Langchain::Vectorsearch
70
72
  def add_texts(texts:, ids: nil)
71
73
  if ids.nil? || ids.empty?
72
74
  data = texts.map do |text|
73
- {content: text, vectors: llm.embed(text: text).to_s, namespace: namespace}
75
+ {content: text, vectors: llm.embed(text: text).embedding.to_s, namespace: namespace}
74
76
  end
75
77
 
76
78
  @db[table_name.to_sym].multi_insert(data, return: :primary_key)
@@ -91,7 +93,7 @@ module Langchain::Vectorsearch
91
93
  def create_default_schema
92
94
  db.run "CREATE EXTENSION IF NOT EXISTS vector"
93
95
  namespace_column = @namespace_column
94
- vector_dimension = default_dimension
96
+ vector_dimension = llm.default_dimension
95
97
  db.create_table? table_name.to_sym do
96
98
  primary_key :id
97
99
  text :content
@@ -110,7 +112,7 @@ module Langchain::Vectorsearch
110
112
  # @param k [Integer] The number of top results to return
111
113
  # @return [Array<Hash>] The results of the search
112
114
  def similarity_search(query:, k: 4)
113
- embedding = llm.embed(text: query)
115
+ embedding = llm.embed(text: query).embedding
114
116
 
115
117
  similarity_search_by_vector(
116
118
  embedding: embedding,
@@ -150,3 +152,7 @@ module Langchain::Vectorsearch
150
152
  end
151
153
  end
152
154
  end
155
+
156
+ # Rails connection when configuring vectorsearch
157
+ # Update READMEs
158
+ # Rails migration to create a migration