⚡ بناء تطبيقات مدعومة من LLM في روبي ⚡
للحصول على تكامل Rails العميق، راجع: langchainrb_rails Gem.
متاح للتعاقدات الاستشارية المدفوعة! أرسل لي بريدا إلكترونيا.
قم بتثبيت الجوهرة وإضافتها إلى ملف Gemfile الخاص بالتطبيق عن طريق تنفيذ الأمر التالي:
bundle add langchainrb
إذا لم يتم استخدام المُجمّع لإدارة التبعيات، فقم بتثبيت الجوهرة عن طريق تنفيذ:
gem install langchainrb
قد تكون هناك حاجة إلى جواهر إضافية. ولا يتم تضمينها بشكل افتراضي، لذا يمكنك تضمين ما تحتاجه فقط.
require "langchain"
توفر وحدة Langchain::LLM
واجهة موحدة للتفاعل مع مختلف موفري نماذج اللغات الكبيرة (LLM). يتيح لك هذا التجريد التبديل بسهولة بين واجهات LLM الخلفية المختلفة دون تغيير رمز التطبيق الخاص بك.
جميع فئات LLM ترث من Langchain::LLM::Base
وتوفر واجهة متسقة للعمليات المشتركة:
يمكن تهيئة معظم فئات LLM باستخدام مفتاح API وخيارات افتراضية اختيارية:
llm = Langchain :: LLM :: OpenAI . new (
api_key : ENV [ "OPENAI_API_KEY" ] ,
default_options : { temperature : 0.7 , chat_model : "gpt-4o" }
)
استخدم طريقة embed
لإنشاء التضمينات لنص معين:
response = llm . embed ( text : "Hello, world!" )
embedding = response . embedding
embed()
text
: (مطلوب) نص الإدخال المراد تضمينه.model
: (اختياري) سيتم استخدام اسم النموذج المطلوب استخدامه أو نموذج التضمين الافتراضي. استخدم الطريقة complete
لإنشاء الإكمالات لموجه معين:
response = llm . complete ( prompt : "Once upon a time" )
completion = response . completion
complete()
prompt
: (مطلوب) موجه الإدخال للإكمال.max_tokens
: (اختياري) الحد الأقصى لعدد الرموز المميزة المراد إنشاؤها.temperature
: (اختياري) يتحكم في العشوائية في التوليد. القيم الأعلى (على سبيل المثال، 0.8) تجعل المخرجات أكثر عشوائية، في حين أن القيم المنخفضة (على سبيل المثال، 0.2) تجعلها أكثر حتمية.top_p
: (اختياري) بديل لدرجة الحرارة، ويتحكم في تنوع الرموز المميزة التي تم إنشاؤها.n
: (اختياري) عدد مرات الإكمال التي سيتم إنشاؤها لكل موجه.stop
: (اختياري) التسلسلات التي ستتوقف فيها واجهة برمجة التطبيقات (API) عن إنشاء المزيد من الرموز المميزة.presence_penalty
: (اختياري) يعاقب الرموز المميزة الجديدة بناءً على وجودها في النص حتى الآن.frequency_penalty
: (اختياري) يعاقب الرموز المميزة الجديدة بناءً على تكرارها في النص حتى الآن. استخدم طريقة chat
لإنشاء عمليات إكمال الدردشة:
messages = [
{ role : "system" , content : "You are a helpful assistant." } ,
{ role : "user" , content : "What's the weather like today?" }
# Google Gemini and Google VertexAI expect messages in a different format:
# { role: "user", parts: [{ text: "why is the sky blue?" }]}
]
response = llm . chat ( messages : messages )
chat_completion = response . chat_completion
chat()
messages
: (مطلوب) مجموعة من كائنات الرسائل التي تمثل سجل المحادثة.model
: (اختياري) نموذج الدردشة المحدد المطلوب استخدامه.temperature
: (اختياري) يتحكم في العشوائية في التوليد.top_p
: (اختياري) بديل لدرجة الحرارة، ويتحكم في تنوع الرموز المميزة التي تم إنشاؤها.n
: (اختياري) عدد خيارات إكمال الدردشة المطلوب إنشاؤها.max_tokens
: (اختياري) الحد الأقصى لعدد الرموز المميزة التي سيتم إنشاؤها عند إكمال الدردشة.stop
: (اختياري) التسلسلات التي ستتوقف فيها واجهة برمجة التطبيقات (API) عن إنشاء المزيد من الرموز المميزة.presence_penalty
: (اختياري) يعاقب الرموز المميزة الجديدة بناءً على وجودها في النص حتى الآن.frequency_penalty
: (اختياري) يعاقب الرموز المميزة الجديدة بناءً على تكرارها في النص حتى الآن.logit_bias
: (اختياري) يعدل احتمالية ظهور الرموز المميزة في الإكمال.user
: (اختياري) معرف فريد يمثل المستخدم النهائي الخاص بك.tools
: (اختياري) قائمة الأدوات التي قد يستدعيها النموذج.tool_choice
: (اختياري) يتحكم في كيفية استدعاء النموذج لوظائفه. بفضل الواجهة الموحدة، يمكنك التبديل بسهولة بين مقدمي خدمات LLM المختلفين عن طريق تغيير الفصل الذي تقوم بإنشاء مثيل له:
# Using Anthropic
anthropic_llm = Langchain :: LLM :: Anthropic . new ( api_key : ENV [ "ANTHROPIC_API_KEY" ] )
# Using Google Gemini
gemini_llm = Langchain :: LLM :: GoogleGemini . new ( api_key : ENV [ "GOOGLE_GEMINI_API_KEY" ] )
# Using OpenAI
openai_llm = Langchain :: LLM :: OpenAI . new ( api_key : ENV [ "OPENAI_API_KEY" ] )
تقوم كل طريقة LLM بإرجاع كائن استجابة يوفر واجهة متسقة للوصول إلى النتائج:
embedding
: إرجاع ناقل التضمينcompletion
: إرجاع إكمال النص الذي تم إنشاؤهchat_completion
: إرجاع إكمال الدردشة التي تم إنشاؤهاtool_calls
: إرجاع استدعاءات الأداة التي أجراها LLMprompt_tokens
: إرجاع عدد الرموز المميزة في الموجهcompletion_tokens
: إرجاع عدد الرموز المميزة في الإكمالtotal_tokens
: يُرجع العدد الإجمالي للرموز المميزة المستخدمة ملحوظة
على الرغم من أن الواجهة الأساسية متسقة عبر مقدمي الخدمة، إلا أن بعض حاملي شهادات LLM قد يقدمون ميزات أو معلمات إضافية. راجع الوثائق الخاصة بكل فصل LLM للتعرف على الإمكانيات والخيارات الخاصة بموفر الخدمة.
إنشاء موجه مع متغيرات الإدخال:
prompt = Langchain :: Prompt :: PromptTemplate . new ( template : "Tell me a {adjective} joke about {content}." , input_variables : [ "adjective" , "content" ] )
prompt . format ( adjective : "funny" , content : "chickens" ) # "Tell me a funny joke about chickens."
إنشاء قالب PromptTemplate باستخدام موجه فقط وبدون متغيرات الإدخال:
prompt = Langchain :: Prompt :: PromptTemplate . from_template ( "Tell me a funny joke about chickens." )
prompt . input_variables # []
prompt . format # "Tell me a funny joke about chickens."
حفظ القالب الفوري في ملف JSON:
prompt . save ( file_path : "spec/fixtures/prompt/prompt_template.json" )
تحميل قالب مطالبة جديد باستخدام ملف JSON:
prompt = Langchain :: Prompt . load_from_path ( file_path : "spec/fixtures/prompt/prompt_template.json" )
prompt . input_variables # ["adjective", "content"]
أنشئ مطالبة تحتوي على بعض الأمثلة الملتقطة:
prompt = Langchain :: Prompt :: FewShotPromptTemplate . new (
prefix : "Write antonyms for the following words." ,
suffix : "Input: {adjective} n Output:" ,
example_prompt : Langchain :: Prompt :: PromptTemplate . new (
input_variables : [ "input" , "output" ] ,
template : "Input: {input} n Output: {output}"
) ,
examples : [
{ "input" : "happy" , "output" : "sad" } ,
{ "input" : "tall" , "output" : "short" }
] ,
input_variables : [ "adjective" ]
)
prompt . format ( adjective : "good" )
# Write antonyms for the following words.
#
# Input: happy
# Output: sad
#
# Input: tall
# Output: short
#
# Input: good
# Output:
حفظ القالب الفوري في ملف JSON:
prompt . save ( file_path : "spec/fixtures/prompt/few_shot_prompt_template.json" )
تحميل قالب مطالبة جديد باستخدام ملف JSON:
prompt = Langchain :: Prompt . load_from_path ( file_path : "spec/fixtures/prompt/few_shot_prompt_template.json" )
prompt . prefix # "Write antonyms for the following words."
تحميل قالب مطالبة جديد باستخدام ملف YAML:
prompt = Langchain :: Prompt . load_from_path ( file_path : "spec/fixtures/prompt/prompt_template.yaml" )
prompt . input_variables #=> ["adjective", "content"]
تحليل استجابات نص LLM إلى مخرجات منظمة، مثل JSON.
يمكنك استخدام StructuredOutputParser
لإنشاء موجه يوجه LLM لتوفير استجابة JSON تلتزم بمخطط JSON محدد:
json_schema = {
type : "object" ,
properties : {
name : {
type : "string" ,
description : "Persons name"
} ,
age : {
type : "number" ,
description : "Persons age"
} ,
interests : {
type : "array" ,
items : {
type : "object" ,
properties : {
interest : {
type : "string" ,
description : "A topic of interest"
} ,
levelOfInterest : {
type : "number" ,
description : "A value between 0 and 100 of how interested the person is in this interest"
}
} ,
required : [ "interest" , "levelOfInterest" ] ,
additionalProperties : false
} ,
minItems : 1 ,
maxItems : 3 ,
description : "A list of the person's interests"
}
} ,
required : [ "name" , "age" , "interests" ] ,
additionalProperties : false
}
parser = Langchain :: OutputParsers :: StructuredOutputParser . from_json_schema ( json_schema )
prompt = Langchain :: Prompt :: PromptTemplate . new ( template : "Generate details of a fictional character. n {format_instructions} n Character description: {description}" , input_variables : [ "description" , "format_instructions" ] )
prompt_text = prompt . format ( description : "Korean chemistry student" , format_instructions : parser . get_format_instructions )
# Generate details of a fictional character.
# You must format your output as a JSON value that adheres to a given "JSON Schema" instance.
# ...
ثم قم بتحليل استجابة llm:
llm = Langchain :: LLM :: OpenAI . new ( api_key : ENV [ "OPENAI_API_KEY" ] )
llm_response = llm . chat ( messages : [ { role : "user" , content : prompt_text } ] ) . completion
parser . parse ( llm_response )
# {
# "name" => "Kim Ji-hyun",
# "age" => 22,
# "interests" => [
# {
# "interest" => "Organic Chemistry",
# "levelOfInterest" => 85
# },
# ...
# ]
# }
إذا فشل المحلل اللغوي في تحليل استجابة LLM، فيمكنك استخدام OutputFixingParser
. يرسل رسالة خطأ، ومخرجات سابقة، ونص المطالبة الأصلي إلى LLM، ويطلب استجابة "ثابتة":
begin
parser . parse ( llm_response )
rescue Langchain :: OutputParsers :: OutputParserException => e
fix_parser = Langchain :: OutputParsers :: OutputFixingParser . from_llm (
llm : llm ,
parser : parser
)
fix_parser . parse ( llm_response )
end
وبدلاً من ذلك، إذا لم تكن بحاجة إلى التعامل مع OutputParserException
، فيمكنك تبسيط التعليمات البرمجية:
# we already have the `OutputFixingParser`:
# parser = Langchain::OutputParsers::StructuredOutputParser.from_json_schema(json_schema)
fix_parser = Langchain :: OutputParsers :: OutputFixingParser . from_llm (
llm : llm ,
parser : parser
)
fix_parser . parse ( llm_response )
انظر هنا للحصول على مثال ملموس
RAG هي منهجية تساعد LLMs على توليد معلومات دقيقة وحديثة. يتبع سير عمل RAG النموذجي الخطوات الثلاث التالية:
يوفر Langchain.rb واجهة موحدة مريحة أعلى قواعد بيانات Vectorsearch المدعومة والتي تسهل تكوين الفهرس الخاص بك وإضافة البيانات والاستعلام والاسترجاع منه.
قاعدة البيانات | مفتوح المصدر | العرض السحابي |
---|---|---|
صفاء | ✅ | ✅ |
إبسيلا | ✅ | ✅ |
هنسويب | ✅ | |
ميلفوس | ✅ | ✅سحابة زيليز |
كوز الصنوبر | ✅ | |
Pgvector | ✅ | ✅ |
قدررانت | ✅ | ✅ |
ويفيات | ✅ | ✅ |
بحث مرن | ✅ | ✅ |
اختر قاعدة بيانات بحث المتجهات التي ستستخدمها، وأضف تبعية الجوهرة وقم بإنشاء مثيل للعميل:
gem "weaviate-ruby" , "~> 0.8.9"
اختر وقم بإنشاء مثيل لموفر LLM الذي ستستخدمه لإنشاء عمليات التضمين
llm = Langchain :: LLM :: OpenAI . new ( api_key : ENV [ "OPENAI_API_KEY" ] )
client = Langchain :: Vectorsearch :: Weaviate . new (
url : ENV [ "WEAVIATE_URL" ] ,
api_key : ENV [ "WEAVIATE_API_KEY" ] ,
index_name : "Documents" ,
llm : llm
)
يمكنك إنشاء مثيل لأي قاعدة بيانات بحث متجهة أخرى مدعومة:
client = Langchain :: Vectorsearch :: Chroma . new ( ... ) # `gem "chroma-db", "~> 0.6.0"`
client = Langchain :: Vectorsearch :: Epsilla . new ( ... ) # `gem "epsilla-ruby", "~> 0.0.3"`
client = Langchain :: Vectorsearch :: Hnswlib . new ( ... ) # `gem "hnswlib", "~> 0.8.1"`
client = Langchain :: Vectorsearch :: Milvus . new ( ... ) # `gem "milvus", "~> 0.9.3"`
client = Langchain :: Vectorsearch :: Pinecone . new ( ... ) # `gem "pinecone", "~> 0.1.6"`
client = Langchain :: Vectorsearch :: Pgvector . new ( ... ) # `gem "pgvector", "~> 0.2"`
client = Langchain :: Vectorsearch :: Qdrant . new ( ... ) # `gem "qdrant-ruby", "~> 0.9.3"`
client = Langchain :: Vectorsearch :: Elasticsearch . new ( ... ) # `gem "elasticsearch", "~> 8.2.0"`
إنشاء المخطط الافتراضي:
client . create_default_schema
أضف بيانات نصية عادية إلى قاعدة بيانات بحث المتجهات الخاصة بك:
client . add_texts (
texts : [
"Begin by preheating your oven to 375°F (190°C). Prepare four boneless, skinless chicken breasts by cutting a pocket into the side of each breast, being careful not to cut all the way through. Season the chicken with salt and pepper to taste. In a large skillet, melt 2 tablespoons of unsalted butter over medium heat. Add 1 small diced onion and 2 minced garlic cloves, and cook until softened, about 3-4 minutes. Add 8 ounces of fresh spinach and cook until wilted, about 3 minutes. Remove the skillet from heat and let the mixture cool slightly." ,
"In a bowl, combine the spinach mixture with 4 ounces of softened cream cheese, 1/4 cup of grated Parmesan cheese, 1/4 cup of shredded mozzarella cheese, and 1/4 teaspoon of red pepper flakes. Mix until well combined. Stuff each chicken breast pocket with an equal amount of the spinach mixture. Seal the pocket with a toothpick if necessary. In the same skillet, heat 1 tablespoon of olive oil over medium-high heat. Add the stuffed chicken breasts and sear on each side for 3-4 minutes, or until golden brown."
]
)
أو استخدم موزعي الملفات لتحميل البيانات وتحليلها وفهرستها في قاعدة البيانات الخاصة بك:
my_pdf = Langchain . root . join ( "path/to/my.pdf" )
my_text = Langchain . root . join ( "path/to/my.txt" )
my_docx = Langchain . root . join ( "path/to/my.docx" )
client . add_data ( paths : [ my_pdf , my_text , my_docx ] )
تنسيقات الملفات المدعومة: docx، html، pdf، text، json، jsonl، csv، xlsx، eml، pptx.
استرداد المستندات المشابهة بناءً على سلسلة الاستعلام التي تم تمريرها:
client . similarity_search (
query : ,
k : # number of results to be retrieved
)
استرداد المستندات المشابهة بناءً على سلسلة الاستعلام التي تم تمريرها عبر تقنية HyDE:
client . similarity_search_with_hyde ( )
استرجع المستندات المماثلة بناءً على التضمين الذي تم تمريره في:
client . similarity_search_by_vector (
embedding : ,
k : # number of results to be retrieved
)
الاستعلام القائم على RAG
client . ask ( question : "..." )
Langchain::Assistant
عبارة عن فئة قوية ومرنة تجمع بين نماذج اللغات الكبيرة (LLMs) والأدوات وإدارة المحادثات لإنشاء مساعدين أذكياء وتفاعليين. إنه مصمم للتعامل مع المحادثات المعقدة، وتنفيذ الأدوات، وتقديم استجابات متماسكة بناءً على سياق التفاعل.
llm = Langchain :: LLM :: OpenAI . new ( api_key : ENV [ "OPENAI_API_KEY" ] )
assistant = Langchain :: Assistant . new (
llm : llm ,
instructions : "You're a helpful AI assistant" ,
tools : [ Langchain :: Tool :: NewsRetriever . new ( api_key : ENV [ "NEWS_API_KEY" ] ) ]
)
# Add a user message and run the assistant
assistant . add_message_and_run! ( content : "What's the latest news about AI?" )
# Supply an image to the assistant
assistant . add_message_and_run! (
content : "Show me a picture of a cat" ,
image_url : "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
)
# Access the conversation thread
messages = assistant . messages
# Run the assistant with automatic tool execution
assistant . run ( auto_tool_execution : true )
# If you want to stream the response, you can add a response handler
assistant = Langchain :: Assistant . new (
llm : llm ,
instructions : "You're a helpful AI assistant" ,
tools : [ Langchain :: Tool :: NewsRetriever . new ( api_key : ENV [ "NEWS_API_KEY" ] ) ]
) do | response_chunk |
# ...handle the response stream
# print(response_chunk.inspect)
end
assistant . add_message ( content : "Hello" )
assistant . run ( auto_tool_execution : true )
لاحظ أن البث غير مدعوم حاليًا لجميع برامج LLM.
llm
: مثيل LLM المطلوب استخدامه (مطلوب)tools
: مجموعة من مثيلات الأداة (اختياري)instructions
: تعليمات النظام للمساعد (اختياري)tool_choice
: يحدد كيفية اختيار الأدوات. الافتراضي: "تلقائي". يمكن تمرير اسم وظيفة أداة محددة. سيؤدي هذا إلى إجبار المساعد على استخدام هذه الوظيفة دائمًا .parallel_tool_calls
: ما إذا كان سيتم إجراء استدعاءات متعددة للأداة المتوازية. الافتراضي: صحيحadd_message_callback
: وظيفة رد اتصال (proc، lambda) يتم استدعاؤها عند إضافة أي رسالة إلى المحادثة (اختياري) assistant . add_message_callback = -> ( message ) { puts "New message: #{ message } " }
tool_execution_callback
: وظيفة رد الاتصال (proc، lambda) التي يتم استدعاؤها مباشرة قبل تنفيذ الأداة (اختياري) assistant . tool_execution_callback = -> ( tool_call_id , tool_name , method_name , tool_arguments ) { puts "Executing tool_call_id: #{ tool_call_id } , tool_name: #{ tool_name } , method_name: #{ method_name } , tool_arguments: #{ tool_arguments } " }
add_message
: يضيف رسالة مستخدم إلى مجموعة الرسائلrun!
: يعالج المحادثة ويولد الردودadd_message_and_run!
: يجمع بين إضافة رسالة وتشغيل المساعدsubmit_tool_output
: إرسال المخرجات يدويًا إلى استدعاء الأداةmessages
: إرجاع قائمة بالرسائل المستمرةLangchain::Tool::Calculator
: مفيد لتقييم التعبيرات الرياضية. يتطلب gem "eqn"
.Langchain::Tool::Database
: قم بتوصيل قاعدة بيانات SQL الخاصة بك. يتطلب gem "sequel"
.Langchain::Tool::FileSystem
: التفاعل مع نظام الملفات (القراءة والكتابة).Langchain::Tool::RubyCodeInterpreter
: مفيد لتقييم كود روبي الذي تم إنشاؤه. يتطلب gem "safe_ruby"
(بحاجة إلى حل أفضل).Langchain::Tool::NewsRetriever
: غلاف حول NewsApi.org لجلب المقالات الإخبارية.Langchain::Tool::Tavily
: غلاف حول Tavily AI.Langchain::Tool::Weather
: يستدعي Open Weather API لاسترداد الطقس الحالي.Langchain::Tool::Wikipedia
: استدعاء Wikipedia API. يمكن توسيع Langchain::Assistant بسهولة باستخدام أدوات مخصصة عن طريق إنشاء فئات تعمل على extend Langchain::ToolDefinition
وتنفيذ الأساليب المطلوبة.
class MovieInfoTool
extend Langchain :: ToolDefinition
define_function :search_movie , description : "MovieInfoTool: Search for a movie by title" do
property :query , type : "string" , description : "The movie title to search for" , required : true
end
define_function :get_movie_details , description : "MovieInfoTool: Get detailed information about a specific movie" do
property :movie_id , type : "integer" , description : "The TMDb ID of the movie" , required : true
end
def initialize ( api_key : )
@api_key = api_key
end
def search_movie ( query : )
...
end
def get_movie_details ( movie_id : )
...
end
end
movie_tool = MovieInfoTool . new ( api_key : "..." )
assistant = Langchain :: Assistant . new (
llm : llm ,
instructions : "You're a helpful AI assistant that can provide movie information" ,
tools : [ movie_tool ]
)
assistant . add_message_and_run ( content : "Can you tell me about the movie 'Inception'?" )
# Check the response in the last message in the conversation
assistant . messages . last
يتضمن المساعد معالجة الأخطاء للمدخلات غير الصالحة وأنواع LLM غير المدعومة وفشل تنفيذ الأداة. يستخدم جهاز الحالة لإدارة تدفق المحادثة والتعامل مع السيناريوهات المختلفة بأمان.
وحدة التقييمات عبارة عن مجموعة من الأدوات التي يمكن استخدامها لتقييم وتتبع أداء منتجات المخرجات بواسطة LLM وخطوط أنابيب RAG (الجيل المعزز للاسترجاع).
يساعدك Ragas على تقييم خطوط أنابيب توليد الاسترجاع المعزز (RAG). يعتمد التنفيذ على هذه الورقة وPython repo الأصلي. يتتبع Ragas المقاييس الثلاثة التالية ويعين الدرجات من 0.0 إلى 1.0:
# We recommend using Langchain::LLM::OpenAI as your llm for Ragas
ragas = Langchain :: Evals :: Ragas :: Main . new ( llm : llm )
# The answer that the LLM generated
# The question (or the original prompt) that was asked
# The context that was retrieved (usually from a vectorsearch database)
ragas . score ( answer : "" , question : "" , context : "" )
# =>
# {
# ragas_score: 0.6601257446503674,
# answer_relevance_score: 0.9573145866787608,
# context_relevance_score: 0.6666666666666666,
# faithfulness_score: 0.5
# }
الأمثلة الإضافية المتاحة: /examples
يستخدم Langchain.rb آلية Ruby Logger القياسية ويضبط القيمة الافتراضية على نفس level
(حاليًا Logger::DEBUG
).
لإظهار جميع رسائل السجل:
Langchain . logger . level = Logger :: DEBUG
يقوم المُسجل بتسجيل الدخول إلى STDOUT
بشكل افتراضي. من أجل تكوين وجهة السجل (أي تسجيل الدخول إلى ملف)، قم بما يلي:
Langchain . logger = Logger . new ( "path/to/file" , ** Langchain :: LOGGER_OPTIONS )
إذا كنت تواجه مشكلات في تثبيت unicode
Gem الذي يتطلبه pragmatic_segmenter
، فحاول تشغيل:
gem install unicode -- --with-cflags= " -Wno-incompatible-function-pointer-types "
git clone https://github.com/andreibondarev/langchainrb.git
cp .env.example .env
، ثم املأ متغيرات البيئة في .env
bundle exec rake
للتأكد من اجتياز الاختبارات وتشغيل Standardrbbin/console
لتحميل الجوهرة في جلسة REPL. لا تتردد في إضافة مثيلاتك الخاصة من LLMs والأدوات والوكلاء وما إلى ذلك وتجربتها.gem install lefthook && lefthook install -f
انضم إلينا في خادم Langchain.rb Discord.
نرحب بتقارير الأخطاء وطلبات السحب على GitHub على https://github.com/andreibondarev/langchainrb.
الجوهرة متاحة كمصدر مفتوح بموجب شروط ترخيص MIT.