langchainrb 0.5.5 → 0.5.6
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/CHANGELOG.md +8 -0
- data/Gemfile.lock +3 -1
- data/README.md +7 -5
- data/examples/store_and_query_with_pinecone.rb +5 -4
- data/lib/langchain/agent/base.rb +5 -0
- data/lib/langchain/agent/chain_of_thought_agent/chain_of_thought_agent.rb +22 -10
- data/lib/langchain/agent/chain_of_thought_agent/chain_of_thought_agent_prompt.yaml +26 -0
- data/lib/langchain/agent/sql_query_agent/sql_query_agent.rb +7 -7
- data/lib/langchain/agent/sql_query_agent/sql_query_agent_answer_prompt.yaml +11 -0
- data/lib/langchain/agent/sql_query_agent/sql_query_agent_sql_prompt.yaml +21 -0
- data/lib/langchain/chunker/base.rb +15 -0
- data/lib/langchain/chunker/text.rb +38 -0
- data/lib/langchain/contextual_logger.rb +60 -0
- data/lib/langchain/conversation.rb +35 -4
- data/lib/langchain/data.rb +4 -0
- data/lib/langchain/llm/google_palm.rb +3 -2
- data/lib/langchain/llm/openai.rb +16 -6
- data/lib/langchain/llm/prompts/summarize_template.yaml +9 -0
- data/lib/langchain/llm/replicate.rb +1 -1
- data/lib/langchain/prompt/base.rb +2 -2
- data/lib/langchain/tool/base.rb +9 -3
- data/lib/langchain/tool/calculator.rb +2 -2
- data/lib/langchain/tool/database.rb +3 -3
- data/lib/langchain/tool/{serp_api.rb → google_search.rb} +9 -9
- data/lib/langchain/tool/ruby_code_interpreter.rb +1 -1
- data/lib/langchain/tool/weather.rb +2 -2
- data/lib/langchain/tool/wikipedia.rb +1 -1
- data/lib/langchain/utils/token_length/base_validator.rb +38 -0
- data/lib/langchain/utils/token_length/google_palm_validator.rb +9 -29
- data/lib/langchain/utils/token_length/openai_validator.rb +10 -27
- data/lib/langchain/utils/token_length/token_limit_exceeded.rb +17 -0
- data/lib/langchain/vectorsearch/base.rb +6 -0
- data/lib/langchain/vectorsearch/chroma.rb +1 -1
- data/lib/langchain/vectorsearch/hnswlib.rb +2 -2
- data/lib/langchain/vectorsearch/milvus.rb +1 -14
- data/lib/langchain/vectorsearch/pgvector.rb +1 -5
- data/lib/langchain/vectorsearch/pinecone.rb +1 -4
- data/lib/langchain/vectorsearch/qdrant.rb +1 -4
- data/lib/langchain/vectorsearch/weaviate.rb +1 -4
- data/lib/langchain/version.rb +1 -1
- data/lib/langchain.rb +28 -12
- metadata +30 -11
- data/lib/langchain/agent/chain_of_thought_agent/chain_of_thought_agent_prompt.json +0 -10
- data/lib/langchain/agent/sql_query_agent/sql_query_agent_answer_prompt.json +0 -10
- data/lib/langchain/agent/sql_query_agent/sql_query_agent_sql_prompt.json +0 -10
- data/lib/langchain/llm/prompts/summarize_template.json +0 -5
@@ -45,11 +45,11 @@ module Langchain::Prompt
|
|
45
45
|
end
|
46
46
|
|
47
47
|
#
|
48
|
-
# Save the object to a file in JSON format.
|
48
|
+
# Save the object to a file in JSON or YAML format.
|
49
49
|
#
|
50
50
|
# @param file_path [String, Pathname] The path to the file to save the object to
|
51
51
|
#
|
52
|
-
# @raise [ArgumentError] If file_path doesn't end with .json
|
52
|
+
# @raise [ArgumentError] If file_path doesn't end with .json or .yaml or .yml
|
53
53
|
#
|
54
54
|
# @return [void]
|
55
55
|
#
|
data/lib/langchain/tool/base.rb
CHANGED
@@ -9,7 +9,7 @@ module Langchain::Tool
|
|
9
9
|
#
|
10
10
|
# - {Langchain::Tool::Calculator}: Calculate the result of a math expression
|
11
11
|
# - {Langchain::Tool::RubyCodeInterpretor}: Runs ruby code
|
12
|
-
# - {Langchain::Tool::
|
12
|
+
# - {Langchain::Tool::GoogleSearch}: search on Google (via SerpAPI)
|
13
13
|
# - {Langchain::Tool::Wikipedia}: search on Wikipedia
|
14
14
|
#
|
15
15
|
# == Usage
|
@@ -30,13 +30,13 @@ module Langchain::Tool
|
|
30
30
|
# agent = Langchain::Agent::ChainOfThoughtAgent.new(
|
31
31
|
# llm: :openai, # or :cohere, :hugging_face, :google_palm or :replicate
|
32
32
|
# llm_api_key: ENV["OPENAI_API_KEY"],
|
33
|
-
# tools: ["
|
33
|
+
# tools: ["google_search", "calculator", "wikipedia"]
|
34
34
|
# )
|
35
35
|
#
|
36
36
|
# 4. Confirm that the Agent is using the Tools you passed in:
|
37
37
|
#
|
38
38
|
# agent.tools
|
39
|
-
# # => ["
|
39
|
+
# # => ["google_search", "calculator", "wikipedia"]
|
40
40
|
#
|
41
41
|
# == Adding Tools
|
42
42
|
#
|
@@ -57,6 +57,12 @@ module Langchain::Tool
|
|
57
57
|
self.class.const_get(:NAME)
|
58
58
|
end
|
59
59
|
|
60
|
+
def self.logger_options
|
61
|
+
{
|
62
|
+
color: :light_blue
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
60
66
|
#
|
61
67
|
# Returns the DESCRIPTION constant of the tool
|
62
68
|
#
|
@@ -28,14 +28,14 @@ module Langchain::Tool
|
|
28
28
|
# @param input [String] math expression
|
29
29
|
# @return [String] Answer
|
30
30
|
def execute(input:)
|
31
|
-
Langchain.logger.info("
|
31
|
+
Langchain.logger.info("Executing \"#{input}\"", for: self.class)
|
32
32
|
|
33
33
|
Eqn::Calculator.calc(input)
|
34
34
|
rescue Eqn::ParseError, Eqn::NoVariableValueError
|
35
35
|
# Sometimes the input is not a pure math expression, e.g: "12F in Celsius"
|
36
36
|
# We can use the google answer box to evaluate this expression
|
37
37
|
# TODO: Figure out to find a better way to evaluate these language expressions.
|
38
|
-
hash_results = Langchain::Tool::
|
38
|
+
hash_results = Langchain::Tool::GoogleSearch
|
39
39
|
.new(api_key: ENV["SERPAPI_API_KEY"])
|
40
40
|
.execute_search(input: input)
|
41
41
|
hash_results.dig(:answer_box, :to) ||
|
@@ -39,7 +39,7 @@ module Langchain::Tool
|
|
39
39
|
# @return [String] schema
|
40
40
|
#
|
41
41
|
def schema
|
42
|
-
Langchain.logger.info("
|
42
|
+
Langchain.logger.info("Dumping schema", for: self.class)
|
43
43
|
db.dump_schema_migration(same_db: true, indexes: false) unless db.adapter_scheme == :mock
|
44
44
|
end
|
45
45
|
|
@@ -50,11 +50,11 @@ module Langchain::Tool
|
|
50
50
|
# @return [Array] results
|
51
51
|
#
|
52
52
|
def execute(input:)
|
53
|
-
Langchain.logger.info("
|
53
|
+
Langchain.logger.info("Executing \"#{input}\"", for: self.class)
|
54
54
|
|
55
55
|
db[input].to_a
|
56
56
|
rescue Sequel::DatabaseError => e
|
57
|
-
Langchain.logger.error(
|
57
|
+
Langchain.logger.error(e.message, for: self.class)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Langchain::Tool
|
4
|
-
class
|
4
|
+
class GoogleSearch < Base
|
5
5
|
#
|
6
|
-
# Wrapper around
|
6
|
+
# Wrapper around Google Serp SPI
|
7
7
|
#
|
8
8
|
# Gem requirements: gem "google_search_results", "~> 2.0.0"
|
9
9
|
#
|
10
10
|
# Usage:
|
11
|
-
# search = Langchain::Tool::
|
11
|
+
# search = Langchain::Tool::GoogleSearch.new(api_key: "YOUR_API_KEY")
|
12
12
|
# search.execute(input: "What is the capital of France?")
|
13
13
|
#
|
14
14
|
|
15
|
-
NAME = "
|
15
|
+
NAME = "google_search"
|
16
16
|
|
17
17
|
description <<~DESC
|
18
18
|
A wrapper around Google Search.
|
@@ -26,10 +26,10 @@ module Langchain::Tool
|
|
26
26
|
attr_reader :api_key
|
27
27
|
|
28
28
|
#
|
29
|
-
# Initializes the
|
29
|
+
# Initializes the Google Search tool
|
30
30
|
#
|
31
|
-
# @param api_key [String]
|
32
|
-
# @return [Langchain::Tool::
|
31
|
+
# @param api_key [String] Search API key
|
32
|
+
# @return [Langchain::Tool::GoogleSearch] Google search tool
|
33
33
|
#
|
34
34
|
def initialize(api_key:)
|
35
35
|
depends_on "google_search_results"
|
@@ -54,7 +54,7 @@ module Langchain::Tool
|
|
54
54
|
# @return [String] Answer
|
55
55
|
#
|
56
56
|
def execute(input:)
|
57
|
-
Langchain.logger.info("
|
57
|
+
Langchain.logger.info("Executing \"#{input}\"", for: self.class)
|
58
58
|
|
59
59
|
hash_results = execute_search(input: input)
|
60
60
|
|
@@ -72,7 +72,7 @@ module Langchain::Tool
|
|
72
72
|
# @return [Hash] hash_results JSON
|
73
73
|
#
|
74
74
|
def execute_search(input:)
|
75
|
-
GoogleSearch
|
75
|
+
::GoogleSearch
|
76
76
|
.new(q: input, serp_api_key: api_key)
|
77
77
|
.get_hash
|
78
78
|
end
|
@@ -21,7 +21,7 @@ module Langchain::Tool
|
|
21
21
|
# @param input [String] ruby code expression
|
22
22
|
# @return [String] Answer
|
23
23
|
def execute(input:)
|
24
|
-
Langchain.logger.info("
|
24
|
+
Langchain.logger.info("Executing \"#{input}\"", for: self.class)
|
25
25
|
|
26
26
|
safe_eval(input)
|
27
27
|
end
|
@@ -21,7 +21,7 @@ module Langchain::Tool
|
|
21
21
|
|
22
22
|
description <<~DESC
|
23
23
|
Useful for getting current weather data
|
24
|
-
|
24
|
+
|
25
25
|
The input to this tool should be a city name followed by the units (imperial, metric, or standard)
|
26
26
|
Usage:
|
27
27
|
Action Input: St Louis, Missouri; metric
|
@@ -54,7 +54,7 @@ module Langchain::Tool
|
|
54
54
|
# @param input [String] comma separated city and unit (optional: imperial, metric, or standard)
|
55
55
|
# @return [String] Answer
|
56
56
|
def execute(input:)
|
57
|
-
Langchain.logger.info("
|
57
|
+
Langchain.logger.info("Executing for \"#{input}\"", for: self.class)
|
58
58
|
|
59
59
|
input_array = input.split(";")
|
60
60
|
city, units = *input_array.map(&:strip)
|
@@ -26,7 +26,7 @@ module Langchain::Tool
|
|
26
26
|
# @param input [String] search query
|
27
27
|
# @return [String] Answer
|
28
28
|
def execute(input:)
|
29
|
-
Langchain.logger.info("
|
29
|
+
Langchain.logger.info("Executing \"#{input}\"", for: self.class)
|
30
30
|
|
31
31
|
page = ::Wikipedia.find(input)
|
32
32
|
# It would be nice to figure out a way to provide page.content but the LLM token limit is an issue
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Langchain
|
4
|
+
module Utils
|
5
|
+
module TokenLength
|
6
|
+
#
|
7
|
+
# Calculate the `max_tokens:` parameter to be set by calculating the context length of the text minus the prompt length
|
8
|
+
#
|
9
|
+
# @param content [String | Array<String>] The text or array of texts to validate
|
10
|
+
# @param model_name [String] The model name to validate against
|
11
|
+
# @return [Integer] Whether the text is valid or not
|
12
|
+
# @raise [TokenLimitExceeded] If the text is too long
|
13
|
+
#
|
14
|
+
class BaseValidator
|
15
|
+
def self.validate_max_tokens!(content, model_name, options = {})
|
16
|
+
text_token_length = if content.is_a?(Array)
|
17
|
+
content.sum { |item| token_length(item.to_json, model_name, options) }
|
18
|
+
else
|
19
|
+
token_length(content, model_name, options)
|
20
|
+
end
|
21
|
+
|
22
|
+
leftover_tokens = token_limit(model_name) - text_token_length
|
23
|
+
|
24
|
+
# Raise an error even if whole prompt is equal to the model's token limit (leftover_tokens == 0)
|
25
|
+
if leftover_tokens <= 0
|
26
|
+
raise limit_exceeded_exception(token_limit(model_name), text_token_length)
|
27
|
+
end
|
28
|
+
|
29
|
+
leftover_tokens
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.limit_exceeded_exception(limit, length)
|
33
|
+
TokenLimitExceeded.new("This model's maximum context length is #{limit} tokens, but the given text is #{length} tokens long.", length - limit)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -7,7 +7,7 @@ module Langchain
|
|
7
7
|
# This class is meant to validate the length of the text passed in to Google Palm's API.
|
8
8
|
# It is used to validate the token length before the API call is made
|
9
9
|
#
|
10
|
-
class GooglePalmValidator
|
10
|
+
class GooglePalmValidator < BaseValidator
|
11
11
|
TOKEN_LIMITS = {
|
12
12
|
# Source:
|
13
13
|
# This data can be pulled when `list_models()` method is called: https://github.com/andreibondarev/google_palm_api#usage
|
@@ -26,43 +26,23 @@ module Langchain
|
|
26
26
|
# }
|
27
27
|
}.freeze
|
28
28
|
|
29
|
-
#
|
30
|
-
# Validate the context length of the text
|
31
|
-
#
|
32
|
-
# @param content [String | Array<String>] The text or array of texts to validate
|
33
|
-
# @param model_name [String] The model name to validate against
|
34
|
-
# @return [Integer] Whether the text is valid or not
|
35
|
-
# @raise [TokenLimitExceeded] If the text is too long
|
36
|
-
#
|
37
|
-
def self.validate_max_tokens!(google_palm_llm, content, model_name)
|
38
|
-
text_token_length = if content.is_a?(Array)
|
39
|
-
content.sum { |item| token_length(google_palm_llm, item.to_json, model_name) }
|
40
|
-
else
|
41
|
-
token_length(google_palm_llm, content, model_name)
|
42
|
-
end
|
43
|
-
|
44
|
-
leftover_tokens = TOKEN_LIMITS.dig(model_name, "input_token_limit") - text_token_length
|
45
|
-
|
46
|
-
# Raise an error even if whole prompt is equal to the model's token limit (leftover_tokens == 0)
|
47
|
-
if leftover_tokens <= 0
|
48
|
-
raise TokenLimitExceeded, "This model's maximum context length is #{TOKEN_LIMITS.dig(model_name, "input_token_limit")} tokens, but the given text is #{text_token_length} tokens long."
|
49
|
-
end
|
50
|
-
|
51
|
-
leftover_tokens
|
52
|
-
end
|
53
|
-
|
54
29
|
#
|
55
30
|
# Calculate token length for a given text and model name
|
56
31
|
#
|
57
|
-
# @param llm [Langchain::LLM:GooglePalm] The Langchain::LLM:GooglePalm instance
|
58
32
|
# @param text [String] The text to calculate the token length for
|
59
33
|
# @param model_name [String] The model name to validate against
|
34
|
+
# @param options [Hash] the options to create a message with
|
35
|
+
# @option options [Langchain::LLM:GooglePalm] :llm The Langchain::LLM:GooglePalm instance
|
60
36
|
# @return [Integer] The token length of the text
|
61
37
|
#
|
62
|
-
def self.token_length(
|
63
|
-
response = llm.client.count_message_tokens(model: model_name, prompt: text)
|
38
|
+
def self.token_length(text, model_name = "chat-bison-001", options)
|
39
|
+
response = options[:llm].client.count_message_tokens(model: model_name, prompt: text)
|
64
40
|
response.dig("tokenCount")
|
65
41
|
end
|
42
|
+
|
43
|
+
def self.token_limit(model_name)
|
44
|
+
TOKEN_LIMITS.dig(model_name, "input_token_limit")
|
45
|
+
end
|
66
46
|
end
|
67
47
|
end
|
68
48
|
end
|
@@ -9,7 +9,7 @@ module Langchain
|
|
9
9
|
# This class is meant to validate the length of the text passed in to OpenAI's API.
|
10
10
|
# It is used to validate the token length before the API call is made
|
11
11
|
#
|
12
|
-
class OpenAIValidator
|
12
|
+
class OpenAIValidator < BaseValidator
|
13
13
|
TOKEN_LIMITS = {
|
14
14
|
# Source:
|
15
15
|
# https://platform.openai.com/docs/api-reference/embeddings
|
@@ -17,6 +17,9 @@ module Langchain
|
|
17
17
|
"text-embedding-ada-002" => 8191,
|
18
18
|
"gpt-3.5-turbo" => 4096,
|
19
19
|
"gpt-3.5-turbo-0301" => 4096,
|
20
|
+
"gpt-3.5-turbo-0613" => 4096,
|
21
|
+
"gpt-3.5-turbo-16k" => 16384,
|
22
|
+
"gpt-3.5-turbo-16k-0613" => 16384,
|
20
23
|
"text-davinci-003" => 4097,
|
21
24
|
"text-davinci-002" => 4097,
|
22
25
|
"code-davinci-002" => 8001,
|
@@ -24,6 +27,7 @@ module Langchain
|
|
24
27
|
"gpt-4-0314" => 8192,
|
25
28
|
"gpt-4-32k" => 32768,
|
26
29
|
"gpt-4-32k-0314" => 32768,
|
30
|
+
"gpt-4-32k-0613" => 32768,
|
27
31
|
"text-curie-001" => 2049,
|
28
32
|
"text-babbage-001" => 2049,
|
29
33
|
"text-ada-001" => 2049,
|
@@ -33,31 +37,6 @@ module Langchain
|
|
33
37
|
"ada" => 2049
|
34
38
|
}.freeze
|
35
39
|
|
36
|
-
#
|
37
|
-
# Calculate the `max_tokens:` parameter to be set by calculating the context length of the text minus the prompt length
|
38
|
-
#
|
39
|
-
# @param content [String | Array<String>] The text or array of texts to validate
|
40
|
-
# @param model_name [String] The model name to validate against
|
41
|
-
# @return [Integer] Whether the text is valid or not
|
42
|
-
# @raise [TokenLimitExceeded] If the text is too long
|
43
|
-
#
|
44
|
-
def self.validate_max_tokens!(content, model_name)
|
45
|
-
text_token_length = if content.is_a?(Array)
|
46
|
-
content.sum { |item| token_length(item.to_json, model_name) }
|
47
|
-
else
|
48
|
-
token_length(content, model_name)
|
49
|
-
end
|
50
|
-
|
51
|
-
max_tokens = TOKEN_LIMITS[model_name] - text_token_length
|
52
|
-
|
53
|
-
# Raise an error even if whole prompt is equal to the model's token limit (max_tokens == 0) since not response will be returned
|
54
|
-
if max_tokens <= 0
|
55
|
-
raise TokenLimitExceeded, "This model's maximum context length is #{TOKEN_LIMITS[model_name]} tokens, but the given text is #{text_token_length} tokens long."
|
56
|
-
end
|
57
|
-
|
58
|
-
max_tokens
|
59
|
-
end
|
60
|
-
|
61
40
|
#
|
62
41
|
# Calculate token length for a given text and model name
|
63
42
|
#
|
@@ -65,10 +44,14 @@ module Langchain
|
|
65
44
|
# @param model_name [String] The model name to validate against
|
66
45
|
# @return [Integer] The token length of the text
|
67
46
|
#
|
68
|
-
def self.token_length(text, model_name)
|
47
|
+
def self.token_length(text, model_name, options = {})
|
69
48
|
encoder = Tiktoken.encoding_for_model(model_name)
|
70
49
|
encoder.encode(text).length
|
71
50
|
end
|
51
|
+
|
52
|
+
def self.token_limit(model_name)
|
53
|
+
TOKEN_LIMITS[model_name]
|
54
|
+
end
|
72
55
|
end
|
73
56
|
end
|
74
57
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Langchain
|
4
|
+
module Utils
|
5
|
+
module TokenLength
|
6
|
+
class TokenLimitExceeded < StandardError
|
7
|
+
attr_reader :token_overflow
|
8
|
+
|
9
|
+
def initialize(message = "", token_overflow = 0)
|
10
|
+
super message
|
11
|
+
|
12
|
+
@token_overflow = token_overflow
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -8,7 +8,7 @@ module Langchain::Vectorsearch
|
|
8
8
|
# Gem requirements: gem "chroma-db", "~> 0.3.0"
|
9
9
|
#
|
10
10
|
# Usage:
|
11
|
-
# chroma = Langchain::Vectorsearch::Chroma.new(url:, index_name:, llm:, api_key: nil)
|
11
|
+
# chroma = Langchain::Vectorsearch::Chroma.new(url:, index_name:, llm:, llm_api_key:, api_key: nil)
|
12
12
|
#
|
13
13
|
|
14
14
|
# Initialize the Chroma client
|
@@ -110,12 +110,12 @@ module Langchain::Vectorsearch
|
|
110
110
|
if File.exist?(path_to_index)
|
111
111
|
client.load_index(path_to_index)
|
112
112
|
|
113
|
-
Langchain.logger.info("
|
113
|
+
Langchain.logger.info("Successfully loaded the index at \"#{path_to_index}\"", for: self.class)
|
114
114
|
else
|
115
115
|
# Default max_elements: 100, but we constantly resize the index as new data is written to it
|
116
116
|
client.init_index(max_elements: 100)
|
117
117
|
|
118
|
-
Langchain.logger.info("
|
118
|
+
Langchain.logger.info("Creating a new index at \"#{path_to_index}\"", for: self.class)
|
119
119
|
end
|
120
120
|
end
|
121
121
|
end
|
@@ -8,17 +8,9 @@ module Langchain::Vectorsearch
|
|
8
8
|
# Gem requirements: gem "milvus", "~> 0.9.0"
|
9
9
|
#
|
10
10
|
# Usage:
|
11
|
-
# milvus = Langchain::Vectorsearch::Milvus.new(url:, index_name:, llm:)
|
11
|
+
# milvus = Langchain::Vectorsearch::Milvus.new(url:, index_name:, llm:, llm_api_key:)
|
12
12
|
#
|
13
13
|
|
14
|
-
#
|
15
|
-
# Initialize the Milvus client
|
16
|
-
#
|
17
|
-
# @param url [String] The URL of the Milvus server
|
18
|
-
# @param api_key [String] The API key to use
|
19
|
-
# @param index_name [String] The name of the index to use
|
20
|
-
# @param llm [Object] The LLM client to use
|
21
|
-
#
|
22
14
|
def initialize(url:, index_name:, llm:, api_key: nil)
|
23
15
|
depends_on "milvus"
|
24
16
|
require "milvus"
|
@@ -29,11 +21,6 @@ module Langchain::Vectorsearch
|
|
29
21
|
super(llm: llm)
|
30
22
|
end
|
31
23
|
|
32
|
-
#
|
33
|
-
# Add a list of texts to the index
|
34
|
-
#
|
35
|
-
# @param texts [Array] The list of texts to add
|
36
|
-
#
|
37
24
|
def add_texts(texts:)
|
38
25
|
client.entities.insert(
|
39
26
|
collection_name: index_name,
|
@@ -8,7 +8,7 @@ module Langchain::Vectorsearch
|
|
8
8
|
# Gem requirements: gem "pgvector", "~> 0.2"
|
9
9
|
#
|
10
10
|
# Usage:
|
11
|
-
# pgvector = Langchain::Vectorsearch::Pgvector.new(url:, index_name:, llm:)
|
11
|
+
# pgvector = Langchain::Vectorsearch::Pgvector.new(url:, index_name:, llm:, llm_api_key:)
|
12
12
|
#
|
13
13
|
|
14
14
|
# The operators supported by the PostgreSQL vector search adapter
|
@@ -20,14 +20,10 @@ module Langchain::Vectorsearch
|
|
20
20
|
|
21
21
|
attr_reader :operator, :quoted_table_name
|
22
22
|
|
23
|
-
#
|
24
|
-
# Initialize the PostgreSQL client
|
25
|
-
#
|
26
23
|
# @param url [String] The URL of the PostgreSQL database
|
27
24
|
# @param index_name [String] The name of the table to use for the index
|
28
25
|
# @param llm [Object] The LLM client to use
|
29
26
|
# @param api_key [String] The API key for the Vectorsearch DB (not used for PostgreSQL)
|
30
|
-
#
|
31
27
|
def initialize(url:, index_name:, llm:, api_key: nil)
|
32
28
|
require "pg"
|
33
29
|
require "pgvector"
|
@@ -8,17 +8,14 @@ module Langchain::Vectorsearch
|
|
8
8
|
# Gem requirements: gem "pinecone", "~> 0.1.6"
|
9
9
|
#
|
10
10
|
# Usage:
|
11
|
-
# pinecone = Langchain::Vectorsearch::Pinecone.new(environment:, api_key:, index_name:, llm:)
|
11
|
+
# pinecone = Langchain::Vectorsearch::Pinecone.new(environment:, api_key:, index_name:, llm:, llm_api_key:)
|
12
12
|
#
|
13
13
|
|
14
|
-
#
|
15
14
|
# Initialize the Pinecone client
|
16
|
-
#
|
17
15
|
# @param environment [String] The environment to use
|
18
16
|
# @param api_key [String] The API key to use
|
19
17
|
# @param index_name [String] The name of the index to use
|
20
18
|
# @param llm [Object] The LLM client to use
|
21
|
-
#
|
22
19
|
def initialize(environment:, api_key:, index_name:, llm:)
|
23
20
|
depends_on "pinecone"
|
24
21
|
require "pinecone"
|
@@ -8,17 +8,14 @@ module Langchain::Vectorsearch
|
|
8
8
|
# Gem requirements: gem "qdrant-ruby", "~> 0.9.0"
|
9
9
|
#
|
10
10
|
# Usage:
|
11
|
-
# qdrant = Langchain::Vectorsearch::Qdrant.new(url:, api_key:, index_name:, llm:)
|
11
|
+
# qdrant = Langchain::Vectorsearch::Qdrant.new(url:, api_key:, index_name:, llm:, llm_api_key:)
|
12
12
|
#
|
13
13
|
|
14
|
-
#
|
15
14
|
# Initialize the Qdrant client
|
16
|
-
#
|
17
15
|
# @param url [String] The URL of the Qdrant server
|
18
16
|
# @param api_key [String] The API key to use
|
19
17
|
# @param index_name [String] The name of the index to use
|
20
18
|
# @param llm [Object] The LLM client to use
|
21
|
-
#
|
22
19
|
def initialize(url:, api_key:, index_name:, llm:)
|
23
20
|
depends_on "qdrant-ruby"
|
24
21
|
require "qdrant"
|
@@ -8,17 +8,14 @@ module Langchain::Vectorsearch
|
|
8
8
|
# Gem requirements: gem "weaviate-ruby", "~> 0.8.0"
|
9
9
|
#
|
10
10
|
# Usage:
|
11
|
-
# weaviate = Langchain::Vectorsearch::Weaviate.new(url:, api_key:, index_name:, llm:)
|
11
|
+
# weaviate = Langchain::Vectorsearch::Weaviate.new(url:, api_key:, index_name:, llm:, llm_api_key:)
|
12
12
|
#
|
13
13
|
|
14
|
-
#
|
15
14
|
# Initialize the Weaviate adapter
|
16
|
-
#
|
17
15
|
# @param url [String] The URL of the Weaviate instance
|
18
16
|
# @param api_key [String] The API key to use
|
19
17
|
# @param index_name [String] The name of the index to use
|
20
18
|
# @param llm [Object] The LLM client to use
|
21
|
-
#
|
22
19
|
def initialize(url:, api_key:, index_name:, llm:)
|
23
20
|
depends_on "weaviate-ruby"
|
24
21
|
require "weaviate"
|
data/lib/langchain/version.rb
CHANGED
data/lib/langchain.rb
CHANGED
@@ -46,36 +46,48 @@ require_relative "./langchain/version"
|
|
46
46
|
#
|
47
47
|
# LangChain.rb uses standard logging mechanisms and defaults to :debug level. Most messages are at info level, but we will add debug or warn statements as needed. To show all log messages:
|
48
48
|
#
|
49
|
-
#
|
49
|
+
# Langchain.logger.level = :info
|
50
50
|
module Langchain
|
51
|
+
autoload :Loader, "langchain/loader"
|
52
|
+
autoload :Data, "langchain/data"
|
53
|
+
autoload :Conversation, "langchain/conversation"
|
54
|
+
autoload :DependencyHelper, "langchain/dependency_helper"
|
55
|
+
autoload :ContextualLogger, "langchain/contextual_logger"
|
56
|
+
|
51
57
|
class << self
|
52
|
-
# @return [
|
53
|
-
|
58
|
+
# @return [ContextualLogger]
|
59
|
+
attr_reader :logger
|
60
|
+
|
61
|
+
# @param logger [Logger]
|
62
|
+
# @return [ContextualLogger]
|
63
|
+
def logger=(logger)
|
64
|
+
@logger = ContextualLogger.new(logger)
|
65
|
+
end
|
54
66
|
|
55
67
|
# @return [Pathname]
|
56
68
|
attr_reader :root
|
57
69
|
end
|
58
70
|
|
59
|
-
|
71
|
+
self.logger ||= ::Logger.new($stdout, level: :warn)
|
60
72
|
|
61
73
|
@root = Pathname.new(__dir__)
|
62
74
|
|
63
|
-
autoload :Loader, "langchain/loader"
|
64
|
-
autoload :Data, "langchain/data"
|
65
|
-
autoload :Conversation, "langchain/conversation"
|
66
|
-
autoload :DependencyHelper, "langchain/dependency_helper"
|
67
|
-
|
68
75
|
module Agent
|
69
76
|
autoload :Base, "langchain/agent/base"
|
70
77
|
autoload :ChainOfThoughtAgent, "langchain/agent/chain_of_thought_agent/chain_of_thought_agent.rb"
|
71
78
|
autoload :SQLQueryAgent, "langchain/agent/sql_query_agent/sql_query_agent.rb"
|
72
79
|
end
|
73
80
|
|
81
|
+
module Chunker
|
82
|
+
autoload :Base, "langchain/chunker/base"
|
83
|
+
autoload :Text, "langchain/chunker/text"
|
84
|
+
end
|
85
|
+
|
74
86
|
module Tool
|
75
87
|
autoload :Base, "langchain/tool/base"
|
76
88
|
autoload :Calculator, "langchain/tool/calculator"
|
77
89
|
autoload :RubyCodeInterpreter, "langchain/tool/ruby_code_interpreter"
|
78
|
-
autoload :
|
90
|
+
autoload :GoogleSearch, "langchain/tool/google_search"
|
79
91
|
autoload :Weather, "langchain/tool/weather"
|
80
92
|
autoload :Wikipedia, "langchain/tool/wikipedia"
|
81
93
|
autoload :Database, "langchain/tool/database"
|
@@ -95,8 +107,8 @@ module Langchain
|
|
95
107
|
|
96
108
|
module Utils
|
97
109
|
module TokenLength
|
98
|
-
|
99
|
-
|
110
|
+
autoload :BaseValidator, "langchain/utils/token_length/base_validator"
|
111
|
+
autoload :TokenLimitExceeded, "langchain/utils/token_length/token_limit_exceeded"
|
100
112
|
autoload :OpenAIValidator, "langchain/utils/token_length/openai_validator"
|
101
113
|
autoload :GooglePalmValidator, "langchain/utils/token_length/google_palm_validator"
|
102
114
|
end
|
@@ -130,4 +142,8 @@ module Langchain
|
|
130
142
|
autoload :PromptTemplate, "langchain/prompt/prompt_template"
|
131
143
|
autoload :FewShotPromptTemplate, "langchain/prompt/few_shot_prompt_template"
|
132
144
|
end
|
145
|
+
|
146
|
+
module Errors
|
147
|
+
class BaseError < StandardError; end
|
148
|
+
end
|
133
149
|
end
|