mirror of
https://github.com/hwchase17/langchain.git
synced 2026-02-04 00:00:34 +00:00
Compare commits
47 Commits
eugene/llm
...
bagatur/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f99baade3 | ||
|
|
77d3af43d7 | ||
|
|
7b214ee83d | ||
|
|
bc6600d86f | ||
|
|
3b0e993e20 | ||
|
|
5b5a782196 | ||
|
|
86b6d9df9a | ||
|
|
d6e9d6fee1 | ||
|
|
4b7a7ed4b1 | ||
|
|
be7a5aa726 | ||
|
|
27170b08da | ||
|
|
6ed6c7f409 | ||
|
|
cd17444711 | ||
|
|
3a5523bf82 | ||
|
|
f883981446 | ||
|
|
b8550e7d3a | ||
|
|
946a0a38bd | ||
|
|
5a40413bfd | ||
|
|
cb45caa02e | ||
|
|
bc84bc44b6 | ||
|
|
b199db9767 | ||
|
|
91c6117fd5 | ||
|
|
65e6239f14 | ||
|
|
4bf7add9b8 | ||
|
|
c9ec8c5d07 | ||
|
|
d53de65aca | ||
|
|
f02e27b664 | ||
|
|
a79c8b3834 | ||
|
|
4ea6f882d4 | ||
|
|
03bd0f51c9 | ||
|
|
be3d5904da | ||
|
|
9d850054bc | ||
|
|
5c07a96de1 | ||
|
|
7440ce0cb4 | ||
|
|
73a5b3dd98 | ||
|
|
cfd827b574 | ||
|
|
a71c4e22d1 | ||
|
|
29be604023 | ||
|
|
25f8467ffb | ||
|
|
0c84aea1d4 | ||
|
|
d0f043a765 | ||
|
|
264f677528 | ||
|
|
3b99f428a0 | ||
|
|
6eab0a4709 | ||
|
|
be8006fa9c | ||
|
|
e316d30dcb | ||
|
|
61b5159ed0 |
1
.github/workflows/_release.yml
vendored
1
.github/workflows/_release.yml
vendored
@@ -78,6 +78,7 @@ jobs:
|
||||
- build
|
||||
uses:
|
||||
./.github/workflows/_test_release.yml
|
||||
permissions: write-all
|
||||
with:
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
dangerous-nonmaster-release: ${{ inputs.dangerous-nonmaster-release }}
|
||||
|
||||
4
.github/workflows/codespell.yml
vendored
4
.github/workflows/codespell.yml
vendored
@@ -3,9 +3,9 @@ name: CI / cd . / make spell_check
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
branches: [master, v0.1]
|
||||
pull_request:
|
||||
branches: [master]
|
||||
branches: [master, v0.1]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
2
Makefile
2
Makefile
@@ -17,7 +17,7 @@ clean: docs_clean api_docs_clean
|
||||
|
||||
## docs_build: Build the documentation.
|
||||
docs_build:
|
||||
cd docs && make build-local
|
||||
cd docs && make build
|
||||
|
||||
## docs_clean: Clean the documentation build artifacts.
|
||||
docs_clean:
|
||||
|
||||
@@ -13,7 +13,7 @@ OUTPUT_NEW_DOCS_DIR = $(OUTPUT_NEW_DIR)/docs
|
||||
|
||||
PYTHON = .venv/bin/python
|
||||
|
||||
PARTNER_DEPS_LIST := $(shell ls -1 ../libs/partners | grep -vE "airbyte|ibm" | xargs -I {} echo "../libs/partners/{}" | tr '\n' ' ')
|
||||
PARTNER_DEPS_LIST := $(shell find ../libs/partners -mindepth 1 -maxdepth 1 -type d -exec test -e "{}/pyproject.toml" \; -print | grep -vE "airbyte|ibm|ai21" | tr '\n' ' ')
|
||||
|
||||
PORT ?= 3001
|
||||
|
||||
@@ -45,11 +45,6 @@ generate-files:
|
||||
wget -q https://raw.githubusercontent.com/langchain-ai/langserve/main/README.md -O $(INTERMEDIATE_DIR)/langserve.md
|
||||
$(PYTHON) scripts/resolve_local_links.py $(INTERMEDIATE_DIR)/langserve.md https://github.com/langchain-ai/langserve/tree/main/
|
||||
|
||||
wget -q https://raw.githubusercontent.com/langchain-ai/langgraph/main/README.md -O $(INTERMEDIATE_DIR)/langgraph.md
|
||||
$(PYTHON) scripts/resolve_local_links.py $(INTERMEDIATE_DIR)/langgraph.md https://github.com/langchain-ai/langgraph/tree/main/
|
||||
|
||||
$(PYTHON) scripts/generate_api_reference_links.py --docs_dir $(INTERMEDIATE_DIR)
|
||||
|
||||
copy-infra:
|
||||
mkdir -p $(OUTPUT_NEW_DIR)
|
||||
cp -r src $(OUTPUT_NEW_DIR)
|
||||
@@ -68,7 +63,20 @@ render:
|
||||
md-sync:
|
||||
rsync -avm --include="*/" --include="*.mdx" --include="*.md" --include="*.png" --exclude="*" $(INTERMEDIATE_DIR)/ $(OUTPUT_NEW_DOCS_DIR)
|
||||
|
||||
build: install-py-deps generate-files copy-infra render md-sync
|
||||
generate-references:
|
||||
$(PYTHON) scripts/generate_api_reference_links.py --docs_dir $(OUTPUT_NEW_DOCS_DIR)
|
||||
|
||||
build: install-py-deps generate-files copy-infra render md-sync generate-references
|
||||
|
||||
vercel-build: install-vercel-deps build
|
||||
rm -rf docs
|
||||
mv $(OUTPUT_NEW_DOCS_DIR) docs
|
||||
rm -rf build
|
||||
yarn run docusaurus build
|
||||
mv build v0.1
|
||||
mkdir build
|
||||
mv v0.1 build
|
||||
mv build/v0.1/404.html build
|
||||
|
||||
start:
|
||||
cd $(OUTPUT_NEW_DIR) && yarn && yarn start --port=$(PORT)
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
"source": [
|
||||
"# Create a runnable with the @chain decorator\n",
|
||||
"\n",
|
||||
"You can also turn an arbitrary function into a chain by adding a `@chain` decorator. This is functionaly equivalent to wrapping in a [`RunnableLambda`](/docs/expression_language/primitives/functions).\n",
|
||||
"You can also turn an arbitrary function into a chain by adding a `@chain` decorator. This is functionally equivalent to wrapping in a [`RunnableLambda`](/docs/expression_language/primitives/functions).\n",
|
||||
"\n",
|
||||
"This will have the benefit of improved observability by tracing your chain correctly. Any calls to runnables inside this function will be traced as nested childen.\n",
|
||||
"This will have the benefit of improved observability by tracing your chain correctly. Any calls to runnables inside this function will be traced as nested children.\n",
|
||||
"\n",
|
||||
"It will also allow you to use this as any other runnable, compose it in chain, etc.\n",
|
||||
"\n",
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# LangChain Expression Language (LCEL)
|
||||
|
||||
|
||||
LangChain Expression Language, or LCEL, is a declarative way to easily compose chains together.
|
||||
LCEL was designed from day 1 to **support putting prototypes in production, with no code changes**, from the simplest “prompt + LLM” chain to the most complex chains (we’ve seen folks successfully run LCEL chains with 100s of steps in production). To highlight a few of the reasons you might want to use LCEL:
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"id": "9a9acd2e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
|
||||
"To make it as easy as possible to create custom chains, we've implemented a [\"Runnable\"](https://api.python.langchain.com/en/stable/runnables/langchain_core.runnables.base.Runnable.html#langchain_core.runnables.base.Runnable) protocol. Many LangChain components implement the `Runnable` protocol, including chat models, LLMs, output parsers, retrievers, prompt templates, and more. There are also several useful primitives for working with runnables, which you can read about [in this section](/docs/expression_language/primitives).\n",
|
||||
"\n",
|
||||
"This is a standard interface, which makes it easy to define custom chains as well as invoke them in a standard way. \n",
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_position: 2
|
||||
|
||||
# Installation
|
||||
|
||||
|
||||
## Official release
|
||||
|
||||
To install LangChain run:
|
||||
|
||||
@@ -5,6 +5,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# Introduction
|
||||
|
||||
|
||||
**LangChain** is a framework for developing applications powered by large language models (LLMs).
|
||||
|
||||
LangChain simplifies every stage of the LLM application lifecycle:
|
||||
@@ -13,12 +14,13 @@ LangChain simplifies every stage of the LLM application lifecycle:
|
||||
- **Deployment**: Turn any chain into an API with [LangServe](/docs/langserve).
|
||||
|
||||
import ThemedImage from '@theme/ThemedImage';
|
||||
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||
|
||||
<ThemedImage
|
||||
alt="Diagram outlining the hierarchical organization of the LangChain framework, displaying the interconnected parts across multiple layers."
|
||||
sources={{
|
||||
light: '/svg/langchain_stack.svg',
|
||||
dark: '/svg/langchain_stack_dark.svg',
|
||||
light: useBaseUrl('/svg/langchain_stack.svg'),
|
||||
dark: useBaseUrl('/svg/langchain_stack_dark.svg'),
|
||||
}}
|
||||
title="LangChain Framework Overview"
|
||||
/>
|
||||
@@ -29,7 +31,7 @@ Concretely, the framework consists of the following open-source libraries:
|
||||
- **`langchain-community`**: Third party integrations.
|
||||
- Partner packages (e.g. **`langchain-openai`**, **`langchain-anthropic`**, etc.): Some integrations have been further split into their own lightweight packages that only depend on **`langchain-core`**.
|
||||
- **`langchain`**: Chains, agents, and retrieval strategies that make up an application's cognitive architecture.
|
||||
- **[langgraph](/docs/langgraph)**: Build robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph.
|
||||
- **[langgraph](https://langchain-ai.github.io/langgraph/)**: Build robust and stateful multi-actor applications with LLMs by modeling steps as edges and nodes in a graph.
|
||||
- **[langserve](/docs/langserve)**: Deploy LangChain chains as REST APIs.
|
||||
|
||||
The broader ecosystem includes:
|
||||
@@ -73,7 +75,7 @@ LangChain Expression Language (LCEL) is the foundation of many of LangChain's co
|
||||
### [🦜🛠️ LangSmith](/docs/langsmith)
|
||||
Trace and evaluate your language model applications and intelligent agents to help you move from prototype to production.
|
||||
|
||||
### [🦜🕸️ LangGraph](/docs/langgraph)
|
||||
### [🦜🕸️ LangGraph](https://langchain-ai.github.io/langgraph/)
|
||||
Build stateful, multi-actor applications with LLMs, built on top of (and intended to be used with) LangChain primitives.
|
||||
|
||||
### [🦜🏓 LangServe](/docs/langserve)
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_position: 1
|
||||
|
||||
# Quickstart
|
||||
|
||||
|
||||
In this quickstart we'll show you how to:
|
||||
- Get setup with LangChain, LangSmith and LangServe
|
||||
- Use the most basic and common components of LangChain: prompt templates, models, and output parsers
|
||||
|
||||
@@ -17,7 +17,7 @@ Here's a summary of the key methods and properties of a comparison evaluator:
|
||||
- `requires_reference`: This property specifies whether this evaluator requires a reference label.
|
||||
|
||||
:::note LangSmith Support
|
||||
The [run_on_dataset](https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.smith) evaluation method is designed to evaluate only a single model at a time, and thus, doesn't support these evaluators.
|
||||
Pairwise evaluations are supported in LangSmith via the [`evaluate_comparative`](https://docs.smith.langchain.com/how_to_guides/evaluation/evaluate_pairwise) function.
|
||||
:::
|
||||
|
||||
Detailed information about creating custom evaluators and the available built-in comparison evaluators is provided in the following sections.
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
"from transformers import AutoTokenizer, pipeline\n",
|
||||
"\n",
|
||||
"# Using https://huggingface.co/protectai/deberta-v3-base-prompt-injection-v2\n",
|
||||
"model_path = \"laiyer/deberta-v3-base-prompt-injection-v2\"\n",
|
||||
"model_path = \"protectai/deberta-v3-base-prompt-injection-v2\"\n",
|
||||
"revision = None # We recommend specifiying the revision to avoid breaking changes or supply chain attacks\n",
|
||||
"tokenizer = AutoTokenizer.from_pretrained(\n",
|
||||
" model_path, revision=revision, model_input_names=[\"input_ids\", \"attention_mask\"]\n",
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": 1,
|
||||
"id": "238bdbaa-526a-4130-89e9-523aa44bb196",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -250,16 +250,7 @@
|
||||
"execution_count": 3,
|
||||
"id": "42f87466-cb8e-490d-a9f8-aa0f8e9b4217",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/Users/bagatur/langchain/libs/core/langchain_core/_api/beta_decorator.py:87: LangChainBetaWarning: The function `bind_tools` is in beta. It is actively being worked on, so the API may change.\n",
|
||||
" warn_beta(\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from langchain_core.pydantic_v1 import BaseModel, Field\n",
|
||||
"\n",
|
||||
@@ -369,13 +360,49 @@
|
||||
"id": "90e015e0-c6e5-4ff5-8fb9-be0cd3c86395",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"::: {.callout-tip}\n",
|
||||
":::tip\n",
|
||||
"\n",
|
||||
"ChatAnthropic model outputs are always a single AI message that can have either a single string or a list of content blocks. The content blocks can be text blocks or tool-duse blocks. There can be multiple of each and they can be interspersed.\n",
|
||||
"\n",
|
||||
":::"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b5145dea-0183-4cab-b9e2-0e35fb8370cf",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Forcing tool calls\n",
|
||||
"\n",
|
||||
"By default the model can choose whether to call any tools. To force the model to call at least one tool we can specify `bind_tools(..., tool_choice=\"any\")` and to force the model to call a specific tool we can pass in that tool name `bind_tools(..., tool_choice=\"GetWeather\")`"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "05993626-060c-449f-8069-e52d31442977",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'name': 'GetWeather',\n",
|
||||
" 'args': {'location': '<UNKNOWN>'},\n",
|
||||
" 'id': 'toolu_01DwWjKzHPs6EHCUPxsGm9bN'}]"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"llm_with_force_tools = llm.bind_tools([GetWeather], tool_choice=\"GetWeather\")\n",
|
||||
"# Notice the model will still return tool calls despite a message that\n",
|
||||
"# doesn't have anything to do with the tools.\n",
|
||||
"llm_with_force_tools.invoke(\"this doesn't really require tool use\").tool_calls"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8652ee98-814c-4ed6-9def-275eeaa9651e",
|
||||
|
||||
@@ -9,6 +9,12 @@
|
||||
"source": [
|
||||
"# NVIDIA AI Foundation Endpoints\n",
|
||||
"\n",
|
||||
":::{.callout-caution}\n",
|
||||
"\n",
|
||||
"These are the LangChain v0.1 docs. Please refer to the updated [LangChain v0.2 docs](https://python.langchain.com/v0.2/docs/integrations/chat/nvidia_ai_endpoints/) instead.\n",
|
||||
"\n",
|
||||
":::\n",
|
||||
"\n",
|
||||
"The `ChatNVIDIA` class is a LangChain chat model that connects to [NVIDIA AI Foundation Endpoints](https://www.nvidia.com/en-us/ai-data-science/foundation-models/).\n",
|
||||
"\n",
|
||||
"\n",
|
||||
@@ -1149,7 +1155,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.18"
|
||||
"version": "3.11.9"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -15,6 +15,12 @@
|
||||
"source": [
|
||||
"# OllamaFunctions\n",
|
||||
"\n",
|
||||
":::{.callout-caution}\n",
|
||||
"\n",
|
||||
"This was an experimental wrapper that bolted-on tool calling support to models that do not natively support it. The primary Ollama integration now supports tool calling, and should be used instead. See example usage in LangChain v0.2 documentation [here](https://python.langchain.com/v0.2/docs/integrations/chat/ollama/).\n",
|
||||
"\n",
|
||||
":::\n",
|
||||
"\n",
|
||||
"This notebook shows how to use an experimental wrapper around Ollama that gives it the same API as OpenAI Functions.\n",
|
||||
"\n",
|
||||
"Note that more powerful and capable models will perform better with complex schema and/or multiple functions. The examples below use llama3 and phi3 models.\n",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"source": [
|
||||
"# ChatOpenAI\n",
|
||||
"\n",
|
||||
|
||||
"This notebook covers how to get started with OpenAI chat models."
|
||||
]
|
||||
},
|
||||
@@ -147,7 +148,7 @@
|
||||
"\n",
|
||||
"### ChatOpenAI.bind_tools()\n",
|
||||
"\n",
|
||||
"With `ChatAnthropic.bind_tools`, we can easily pass in Pydantic classes, dict schemas, LangChain tools, or even functions as tools to the model. Under the hood these are converted to an Anthropic tool schemas, which looks like:\n",
|
||||
"With `ChatOpenAI.bind_tools`, we can easily pass in Pydantic classes, dict schemas, LangChain tools, or even functions as tools to the model. Under the hood these are converted to an OpenAI tool schemas, which looks like:\n",
|
||||
"```\n",
|
||||
"{\n",
|
||||
" \"name\": \"...\",\n",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"source": [
|
||||
"# Llama.cpp\n",
|
||||
"\n",
|
||||
|
||||
"[llama-cpp-python](https://github.com/abetlen/llama-cpp-python) is a Python binding for [llama.cpp](https://github.com/ggerganov/llama.cpp).\n",
|
||||
"\n",
|
||||
"It supports inference for [many LLMs](https://github.com/ggerganov/llama.cpp#description) models, which can be accessed on [Hugging Face](https://huggingface.co/TheBloke).\n",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"source": [
|
||||
"# Ollama\n",
|
||||
"\n",
|
||||
|
||||
"[Ollama](https://ollama.ai/) allows you to run open-source large language models, such as Llama 2, locally.\n",
|
||||
"\n",
|
||||
"Ollama bundles model weights, configuration, and data into a single package, defined by a Modelfile. \n",
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"source": [
|
||||
"# OpenAI\n",
|
||||
"\n",
|
||||
|
||||
"[OpenAI](https://platform.openai.com/docs/introduction) offers a spectrum of models with different levels of power suitable for different tasks.\n",
|
||||
"\n",
|
||||
"This example goes over how to use LangChain to interact with `OpenAI` [models](https://platform.openai.com/docs/models)"
|
||||
|
||||
@@ -5,6 +5,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# Providers
|
||||
|
||||
|
||||
:::info
|
||||
|
||||
If you'd like to write your own integration, see [Extending LangChain](/docs/guides/development/extending_langchain/).
|
||||
|
||||
@@ -205,7 +205,7 @@ For chat models is very useful to define prompt as a set of message templates...
|
||||
def simulate_conversation(human_input:str, agent_role:str="a pirate"):
|
||||
"""
|
||||
## System message
|
||||
- note the `:system` sufix inside the <prompt:_role_> tag
|
||||
- note the `:system` suffix inside the <prompt:_role_> tag
|
||||
|
||||
|
||||
```<prompt:system>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"source": [
|
||||
"# Chroma\n",
|
||||
"\n",
|
||||
|
||||
">[Chroma](https://docs.trychroma.com/getting-started) is a AI-native open-source vector database focused on developer productivity and happiness. Chroma is licensed under Apache 2.0.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"source": [
|
||||
"# Faiss\n",
|
||||
"\n",
|
||||
|
||||
">[Facebook AI Similarity Search (Faiss)](https://engineering.fb.com/2017/03/29/data-infrastructure/faiss-a-library-for-efficient-similarity-search/) is a library for efficient similarity search and clustering of dense vectors. It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM. It also contains supporting code for evaluation and parameter tuning.\n",
|
||||
"\n",
|
||||
"[Faiss documentation](https://faiss.ai/).\n",
|
||||
@@ -83,7 +84,7 @@
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
|
||||
@@ -5,6 +5,7 @@ title: Types
|
||||
|
||||
# Agent Types
|
||||
|
||||
|
||||
This categorizes all the available agents along a few dimensions.
|
||||
|
||||
**Intended Model Type**
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"source": [
|
||||
"# ReAct\n",
|
||||
"\n",
|
||||
|
||||
"This walkthrough showcases using an agent to implement the [ReAct](https://react-lm.github.io/) logic."
|
||||
]
|
||||
},
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"source": [
|
||||
"# Tool calling agent\n",
|
||||
"\n",
|
||||
|
||||
"[Tool calling](/docs/modules/model_io/chat/function_calling) allows a model to detect when one or more tools should be called and respond with the inputs that should be passed to those tools. In an API call, you can describe tools and have the model intelligently choose to output a structured object like JSON containing arguments to call these tools. The goal of tools APIs is to more reliably return valid and useful tool calls than what can be done using a generic text completion or chat API.\n",
|
||||
"\n",
|
||||
"We can take advantage of this structured output, combined with the fact that you can bind multiple tools to a [tool calling chat model](/docs/integrations/chat/) and\n",
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
"source": [
|
||||
"# Custom XML Agents\n",
|
||||
"\n",
|
||||
"**Note:** For greater customizability, we recommend checking out [LangGraph](/docs/langgraph).\n",
|
||||
"**Note:** For greater customizability, we recommend checking out [LangGraph](https://langchain-ai.github.io/langgraph/).\n",
|
||||
"\n",
|
||||
"Here we provide an example of a custom XML Agent implementation, to give a sense for what `create_xml_agent` is doing under the hood."
|
||||
]
|
||||
@@ -365,7 +365,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.4"
|
||||
"version": "3.10.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"source": [
|
||||
"# Custom agent\n",
|
||||
"\n",
|
||||
|
||||
"This notebook goes through how to create your own custom agent.\n",
|
||||
"\n",
|
||||
"In this example, we will use OpenAI Tool Calling to create this agent.\n",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"id": "f4c03f40-1328-412d-8a48-1db0cd481b77",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
|
||||
"The core idea of agents is to use a language model to choose a sequence of actions to take.\n",
|
||||
"In chains, a sequence of actions is hardcoded (in code).\n",
|
||||
"In agents, a language model is used as a reasoning engine to determine which actions to take and in which order.\n",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"source": [
|
||||
"# Quickstart\n",
|
||||
"\n",
|
||||
|
||||
"To best understand the agent framework, let's build an agent that has two tools: one to look things up online, and one to look up specific data that we've loaded into a index.\n",
|
||||
"\n",
|
||||
"This will assume knowledge of [LLMs](/docs/modules/model_io/) and [retrieval](/docs/modules/data_connection/) so if you haven't already explored those sections, it is recommended you do so.\n",
|
||||
@@ -705,7 +706,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.10.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"id": "b872d874-ad6e-49b5-9435-66063a64d1a8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
|
||||
"Chains refer to sequences of calls - whether to an LLM, a tool, or a data preprocessing step. The primary supported way to do this is with [LCEL](/docs/expression_language). \n",
|
||||
"\n",
|
||||
"LCEL is great for constructing your chains, but it's also nice to have chains used off the shelf. There are two types of off-the-shelf chains that LangChain supports:\n",
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_class_name: hidden
|
||||
---
|
||||
# Document loaders
|
||||
|
||||
|
||||
:::info
|
||||
Head to [Integrations](/docs/integrations/document_loaders/) for documentation on built-in document loader integrations with 3rd-party tools.
|
||||
:::
|
||||
|
||||
@@ -4,6 +4,7 @@ keywords: [PyPDFDirectoryLoader, PyMuPDFLoader]
|
||||
|
||||
# PDF
|
||||
|
||||
|
||||
>[Portable Document Format (PDF)](https://en.wikipedia.org/wiki/PDF), standardized as ISO 32000, is a file format developed by Adobe in 1992 to present documents, including text formatting and images, in a manner independent of application software, hardware, and operating systems.
|
||||
|
||||
This covers how to load `PDF` documents into the Document format that we use downstream.
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_class_name: hidden
|
||||
---
|
||||
# Text Splitters
|
||||
|
||||
|
||||
Once you've loaded documents, you'll often want to transform them to better suit your application. The simplest example
|
||||
is you may want to split a long document into smaller chunks that can fit into your model's context window. LangChain
|
||||
has a number of built-in document transformers that make it easy to split, combine, filter, and otherwise manipulate documents.
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"source": [
|
||||
"# Recursively split by character\n",
|
||||
"\n",
|
||||
|
||||
"This text splitter is the recommended one for generic text. It is parameterized by a list of characters. It tries to split on them in order until the chunks are small enough. The default list is `[\"\\n\\n\", \"\\n\", \" \", \"\"]`. This has the effect of trying to keep all paragraphs (and then sentences, and then words) together as long as possible, as those would generically seem to be the strongest semantically related pieces of text.\n",
|
||||
"\n",
|
||||
"1. How the text is split: by list of characters.\n",
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"source": [
|
||||
"# Semantic Chunking\n",
|
||||
"\n",
|
||||
|
||||
"Splits the text based on semantic similarity.\n",
|
||||
"\n",
|
||||
"Taken from Greg Kamradt's wonderful notebook:\n",
|
||||
|
||||
@@ -5,6 +5,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# Retrieval
|
||||
|
||||
|
||||
Many LLM applications require user-specific data that is not part of the model's training set.
|
||||
The primary way of accomplishing this is through Retrieval Augmented Generation (RAG).
|
||||
In this process, external data is *retrieved* and then passed to the LLM when doing the *generation* step.
|
||||
|
||||
@@ -6,6 +6,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# Retrievers
|
||||
|
||||
|
||||
A retriever is an interface that returns documents given an unstructured query. It is more general than a vector store.
|
||||
A retriever does not need to be able to store documents, only to return (or retrieve) them. Vector stores can be used
|
||||
as the backbone of a retriever, but there are other types of retrievers as well.
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"source": [
|
||||
"# Vector store-backed retriever\n",
|
||||
"\n",
|
||||
|
||||
"A vector store retriever is a retriever that uses a vector store to retrieve documents. It is a lightweight wrapper around the vector store class to make it conform to the retriever interface.\n",
|
||||
"It uses the search methods implemented by a vector store, like similarity search and MMR, to query the texts in the vector store.\n",
|
||||
"\n",
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_class_name: hidden
|
||||
---
|
||||
# Text embedding models
|
||||
|
||||
|
||||
:::info
|
||||
Head to [Integrations](/docs/integrations/text_embedding/) for documentation on built-in integrations with text embedding model providers.
|
||||
:::
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_class_name: hidden
|
||||
---
|
||||
# Vector stores
|
||||
|
||||
|
||||
:::info
|
||||
Head to [Integrations](/docs/integrations/vectorstores/) for documentation on built-in integrations with 3rd-party vector stores.
|
||||
:::
|
||||
@@ -56,6 +57,50 @@ documents = text_splitter.split_documents(raw_documents)
|
||||
db = Chroma.from_documents(documents, OpenAIEmbeddings())
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="pinecone" label="Pinecone">
|
||||
|
||||
This walkthrough uses the `Pinecone` vector database, which provides broad functionality to store and search over vectors.
|
||||
|
||||
```bash
|
||||
pip install langchain-pinecone
|
||||
```
|
||||
|
||||
We want to use OpenAIEmbeddings so we have to get the OpenAI API Key.
|
||||
|
||||
```python
|
||||
import os
|
||||
import getpass
|
||||
|
||||
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
|
||||
```
|
||||
|
||||
```python
|
||||
from langchain_community.document_loaders import TextLoader
|
||||
from langchain_openai import OpenAIEmbeddings
|
||||
from langchain_text_splitters import CharacterTextSplitter
|
||||
|
||||
# Load the document, split it into chunks, and embed each chunk.
|
||||
loader = TextLoader("../../modules/state_of_the_union.txt")
|
||||
documents = loader.load()
|
||||
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
|
||||
docs = text_splitter.split_documents(documents)
|
||||
|
||||
embeddings = OpenAIEmbeddings()
|
||||
```
|
||||
|
||||
Next, go to the [Pinecone console](https://app.pinecone.io) and create a new index with `dimension=1536` called "langchain-test-index". Then, copy the API key and index name.
|
||||
|
||||
```python
|
||||
from langchain_pinecone import PineconeVectorStore
|
||||
|
||||
os.environ['PINECONE_API_KEY'] = '<YOUR_PINECONE_API_KEY>'
|
||||
|
||||
index_name = "langchain-test-index"
|
||||
|
||||
# Connect to Pinecone index and insert the chunked docs as contents
|
||||
docsearch = PineconeVectorStore.from_documents(docs, embeddings, index_name=index_name)
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="faiss" label="FAISS">
|
||||
|
||||
@@ -280,4 +325,4 @@ I’ve worked on these issues a long time.
|
||||
I know what works: Investing in crime prevention and community police officers who’ll walk the beat, who’ll know the neighborhood, and who can restore trust and safety.
|
||||
```
|
||||
|
||||
</CodeOutputBlock>
|
||||
</CodeOutputBlock>
|
||||
@@ -4,6 +4,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# Components
|
||||
|
||||
|
||||
LangChain provides standard, extendable interfaces and external integrations for the following main components:
|
||||
|
||||
## [Model I/O](/docs/modules/model_io/)
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"source": [
|
||||
"# Tool calling\n",
|
||||
"\n",
|
||||
|
||||
"```{=mdx}\n",
|
||||
":::info\n",
|
||||
"We use the term \"tool calling\" interchangeably with \"function calling\". Although\n",
|
||||
|
||||
@@ -5,6 +5,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# Chat Models
|
||||
|
||||
|
||||
Chat Models are a core component of LangChain.
|
||||
|
||||
A chat model is a language model that uses chat messages as inputs and returns chat messages as outputs (as opposed to using plain text).
|
||||
|
||||
@@ -5,6 +5,7 @@ sidebar_class_name: hidden
|
||||
|
||||
# LLMs
|
||||
|
||||
|
||||
Large Language Models (LLMs) are a core component of LangChain.
|
||||
LangChain does not serve its own LLMs, but rather provides a standard interface for interacting with many different LLMs. To be specific, this interface is one that takes as input a string and returns a string.
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ sidebar_class_name: hidden
|
||||
---
|
||||
# Output Parsers
|
||||
|
||||
|
||||
Output parsers are responsible for taking the output of an LLM and transforming it to a more suitable format. This is very useful when you are using LLMs to generate any form of structured data.
|
||||
|
||||
Besides having a large collection of different types of output parsers, one distinguishing benefit of LangChain OutputParsers is that many of them support streaming.
|
||||
|
||||
@@ -4,6 +4,7 @@ sidebar_class_name: hidden
|
||||
---
|
||||
# Prompts
|
||||
|
||||
|
||||
A prompt for a language model is a set of instructions or input provided by a user to
|
||||
guide the model's response, helping it understand the context and generate relevant
|
||||
and coherent language-based output, such as answering questions, completing sentences,
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"source": [
|
||||
"# Quick reference\n",
|
||||
"\n",
|
||||
|
||||
"Prompt templates are predefined recipes for generating prompts for language models.\n",
|
||||
"\n",
|
||||
"A template may include instructions, few-shot examples, and specific context and\n",
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"source": [
|
||||
"# Defining Custom Tools\n",
|
||||
"\n",
|
||||
|
||||
"When constructing your own agent, you will need to provide it with a list of Tools that it can use. Besides the actual function that is called, the Tool consists of several components:\n",
|
||||
"\n",
|
||||
"- `name` (str), is required and must be unique within a set of tools provided to an agent\n",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"source": [
|
||||
"# Tools\n",
|
||||
"\n",
|
||||
|
||||
"Tools are interfaces that an agent, chain, or LLM can use to interact with the world.\n",
|
||||
"They combine a few things:\n",
|
||||
"\n",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"id": "a15e6a18",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/use_cases/apis.ipynb)\n",
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/v0.1/docs/docs/use_cases/apis.ipynb)\n",
|
||||
"\n",
|
||||
"## Use case \n",
|
||||
"\n",
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"source": [
|
||||
"# Chatbots\n",
|
||||
"\n",
|
||||
|
||||
"## Overview\n",
|
||||
"\n",
|
||||
"Chatbots are one of the most popular use-cases for LLMs. The core features of chatbots are that they can have long-running, stateful conversations and can answer user questions using relevant information.\n",
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"source": [
|
||||
"# Quickstart\n",
|
||||
"\n",
|
||||
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/use_cases/chatbots.ipynb)"
|
||||
]
|
||||
},
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"source": [
|
||||
"# Tool usage\n",
|
||||
"\n",
|
||||
|
||||
"This section will cover how to create conversational agents: chatbots that can interact with other systems and APIs using tools.\n",
|
||||
"\n",
|
||||
"Before reading this guide, we recommend you read both [the chatbot quickstart](/docs/use_cases/chatbots/quickstart) in this section and be familiar with [the documentation on agents](/docs/modules/agents/).\n",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/use_cases/code_understanding.ipynb)\n",
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/v0.1/docs/docs/use_cases/code_understanding.ipynb)\n",
|
||||
"\n",
|
||||
"## Use case\n",
|
||||
"\n",
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"id": "aa3571cc",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/use_cases/data_generation.ipynb)\n",
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/v0.1/docs/docs/use_cases/data_generation.ipynb)\n",
|
||||
"\n",
|
||||
"## Use case\n",
|
||||
"\n",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"source": [
|
||||
"## Overview\n",
|
||||
"\n",
|
||||
|
||||
"Large Language Models (LLMs) are emerging as an extremely capable technology for powering information extraction applications.\n",
|
||||
"\n",
|
||||
"Classical solutions to information extraction rely on a combination of people, (many) hand-crafted rules (e.g., regular expressions), and custom fine-tuned ML models.\n",
|
||||
@@ -56,9 +57,9 @@
|
||||
"\n",
|
||||
"Head to the [Guidelines](/docs/use_cases/extraction/guidelines) page to see a list of opinionated guidelines on how to get the best performance for extraction use cases.\n",
|
||||
"\n",
|
||||
"## Use Case Accelerant\n",
|
||||
"## Reference Application\n",
|
||||
"\n",
|
||||
"[langchain-extract](https://github.com/langchain-ai/langchain-extract) is a starter repo that implements a simple web server for information extraction from text and files using LLMs. It is build using **FastAPI**, **LangChain** and **Postgresql**. Feel free to adapt it to your own use cases.\n",
|
||||
"[langchain-extract](https://github.com/langchain-ai/langchain-extract) is a starter repo that implements a simple web server for information extraction from text and files using LLMs. It is built using **FastAPI**, **LangChain** and **Postgresql**. Feel free to adapt it to your own use cases.\n",
|
||||
"\n",
|
||||
"## Other Resources\n",
|
||||
"\n",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"source": [
|
||||
"# Add chat history\n",
|
||||
"\n",
|
||||
|
||||
"In many Q&A applications we want to allow the user to have a back-and-forth conversation, meaning the application needs some sort of \"memory\" of past questions and answers, and some logic for incorporating those into its current thinking.\n",
|
||||
"\n",
|
||||
"In this guide we focus on **adding logic for incorporating historical messages.** Further details on chat history management is [covered here](/docs/expression_language/how_to/message_history).\n",
|
||||
|
||||
@@ -5,6 +5,7 @@ title: Quickstart
|
||||
|
||||
# Quickstart
|
||||
|
||||
|
||||
LangChain has a number of components designed to help build
|
||||
question-answering applications, and RAG applications more generally. To
|
||||
familiarize ourselves with these, we’ll build a simple Q&A application
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"source": [
|
||||
"# Agents\n",
|
||||
"\n",
|
||||
|
||||
"LangChain has a SQL Agent which provides a more flexible way of interacting with SQL Databases than a chain. The main advantages of using the SQL Agent are:\n",
|
||||
"\n",
|
||||
"- It can answer questions based on the databases' schema as well as on the databases' content (like describing a specific table).\n",
|
||||
@@ -798,7 +799,7 @@
|
||||
"\n",
|
||||
"Under the hood, `create_sql_agent` is just passing in SQL tools to more generic agent constructors. To learn more about the built-in generic agent types as well as how to build custom agents, head to the [Agents Modules](/docs/modules/agents/).\n",
|
||||
"\n",
|
||||
"The built-in `AgentExecutor` runs a simple Agent action -> Tool call -> Agent action... loop. To build more complex agent runtimes, head to the [LangGraph section](/docs/langgraph)."
|
||||
"The built-in `AgentExecutor` runs a simple Agent action -> Tool call -> Agent action... loop. To build more complex agent runtimes, head to the [LangGraph section](https://langchain-ai.github.io/langgraph/)."
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"source": [
|
||||
"# SQL\n",
|
||||
"\n",
|
||||
|
||||
"One of the most common types of databases that we can build Q&A systems for are SQL databases. LangChain comes with a number of built-in chains and agents that are compatible with any SQL dialect supported by SQLAlchemy (e.g., MySQL, PostgreSQL, Oracle SQL, Databricks, SQLite). They enable use cases such as:\n",
|
||||
"\n",
|
||||
"* Generating queries that will be run based on natural language questions,\n",
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
"source": [
|
||||
"# Quickstart\n",
|
||||
"\n",
|
||||
|
||||
"In this guide we'll go over the basic ways to create a Q&A chain and agent over a SQL database. These systems will allow us to ask a question about the data in a SQL database and get back a natural language answer. The main difference between the two is that our agent can query the database in a loop as many time as it needs to answer the question.\n",
|
||||
"\n",
|
||||
"## ⚠️ Security note ⚠️\n",
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"id": "cf13f702",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/use_cases/summarization.ipynb)\n",
|
||||
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/v0.1/docs/docs/use_cases/summarization.ipynb)\n",
|
||||
"\n",
|
||||
"## Use case\n",
|
||||
"\n",
|
||||
@@ -589,9 +590,9 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "poetry-venv",
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "poetry-venv"
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
@@ -603,7 +604,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.1"
|
||||
"version": "3.10.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"id": "a0507a4b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/use_cases/tagging.ipynb)\n",
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/v0.1/docs/docs/use_cases/tagging.ipynb)\n",
|
||||
"\n",
|
||||
"## Use case\n",
|
||||
"\n",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"id": "6605e7f7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/use_cases/web_scraping.ipynb)\n",
|
||||
"[](https://colab.research.google.com/github/langchain-ai/langchain/blob/v0.1/docs/docs/use_cases/web_scraping.ipynb)\n",
|
||||
"\n",
|
||||
"## Use case\n",
|
||||
"\n",
|
||||
|
||||
@@ -9,6 +9,8 @@ require("dotenv").config();
|
||||
const baseLightCodeBlockTheme = require("prism-react-renderer/themes/vsLight");
|
||||
const baseDarkCodeBlockTheme = require("prism-react-renderer/themes/vsDark");
|
||||
|
||||
const baseUrl = "/v0.1/";
|
||||
|
||||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
title: "🦜️🔗 LangChain",
|
||||
@@ -18,7 +20,7 @@ const config = {
|
||||
url: "https://python.langchain.com",
|
||||
// Set the /<baseUrl>/ pathname under which your site is served
|
||||
// For GitHub pages deployment, it is often '/<projectName>/'
|
||||
baseUrl: "/",
|
||||
baseUrl: baseUrl,
|
||||
trailingSlash: true,
|
||||
onBrokenLinks: "throw",
|
||||
onBrokenMarkdownLinks: "throw",
|
||||
@@ -118,6 +120,11 @@ const config = {
|
||||
themeConfig:
|
||||
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
|
||||
({
|
||||
announcementBar: {
|
||||
content:
|
||||
'A newer LangChain version is out! Check out the <a href="https://python.langchain.com/docs/introduction">latest version</a>.',
|
||||
isCloseable: false,
|
||||
},
|
||||
docs: {
|
||||
sidebar: {
|
||||
hideable: true,
|
||||
@@ -165,7 +172,7 @@ const config = {
|
||||
position: "left",
|
||||
},
|
||||
{
|
||||
href: "https://api.python.langchain.com",
|
||||
href: "https://api.python.langchain.com/en/v0.1/",
|
||||
label: "API Reference",
|
||||
position: "left",
|
||||
},
|
||||
@@ -205,6 +212,25 @@ const config = {
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
type: "dropdown",
|
||||
label: "v0.1",
|
||||
position: "right",
|
||||
items: [
|
||||
{
|
||||
label: "Latest",
|
||||
href: "https://python.langchain.com/docs/introduction"
|
||||
},
|
||||
{
|
||||
label: "v0.2",
|
||||
href: "https://python.langchain.com/v0.2/docs/introduction"
|
||||
},
|
||||
{
|
||||
label: "v0.1",
|
||||
href: "/docs/get_started/introduction"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: "dropdown",
|
||||
label: "🦜️🔗",
|
||||
@@ -318,7 +344,7 @@ const config = {
|
||||
}),
|
||||
|
||||
scripts: [
|
||||
"/js/google_analytics.js",
|
||||
baseUrl + "js/google_analytics.js",
|
||||
{
|
||||
src: "https://www.googletagmanager.com/gtag/js?id=G-9B66JQQH2F",
|
||||
async: true,
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"scripts": {
|
||||
"docusaurus": "docusaurus",
|
||||
"start": "rm -rf ./docs/api && docusaurus start",
|
||||
"build": "bash vercel_build.sh && rm -rf ./build && docusaurus build",
|
||||
"build": "make vercel-build",
|
||||
"swizzle": "docusaurus swizzle",
|
||||
"deploy": "docusaurus deploy",
|
||||
"clear": "docusaurus clear",
|
||||
|
||||
@@ -7,7 +7,7 @@ from typing import Iterable, Tuple
|
||||
|
||||
import nbformat
|
||||
from nbconvert.exporters import MarkdownExporter
|
||||
from nbconvert.preprocessors import Preprocessor, RegexRemovePreprocessor
|
||||
from nbconvert.preprocessors import Preprocessor
|
||||
|
||||
|
||||
class EscapePreprocessor(Preprocessor):
|
||||
@@ -27,7 +27,9 @@ class EscapePreprocessor(Preprocessor):
|
||||
)
|
||||
# rewrite .ipynb links to .md
|
||||
cell.source = re.sub(
|
||||
r"\[([^\]]*)\]\(([^)]*).ipynb\)", r"[\1](\2.md)", cell.source
|
||||
r"\[([^\]]*)\]\((?![^\)]*//)([^)]*)\.ipynb\)",
|
||||
r"[\1](\2.md)",
|
||||
cell.source,
|
||||
)
|
||||
return cell, resources
|
||||
|
||||
@@ -79,11 +81,26 @@ class ExtractAttachmentsPreprocessor(Preprocessor):
|
||||
return cell, resources
|
||||
|
||||
|
||||
class CustomRegexRemovePreprocessor(Preprocessor):
|
||||
def check_conditions(self, cell):
|
||||
pattern = re.compile(r"(?s)(?:\s*\Z)|(?:.*#\s*\|\s*output:\s*false.*)")
|
||||
rtn = not pattern.match(cell.source)
|
||||
if not rtn:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def preprocess(self, nb, resources):
|
||||
nb.cells = [cell for cell in nb.cells if self.check_conditions(cell)]
|
||||
|
||||
return nb, resources
|
||||
|
||||
|
||||
exporter = MarkdownExporter(
|
||||
preprocessors=[
|
||||
EscapePreprocessor,
|
||||
ExtractAttachmentsPreprocessor,
|
||||
RegexRemovePreprocessor(patterns=[r"^\s*$"]),
|
||||
CustomRegexRemovePreprocessor,
|
||||
],
|
||||
template_name="mdoutput",
|
||||
extra_template_basedirs=["./scripts/notebook_convert_templates"],
|
||||
|
||||
@@ -153,7 +153,11 @@
|
||||
id: "langsmith/index"
|
||||
},
|
||||
},
|
||||
"langgraph",
|
||||
{
|
||||
type: "link",
|
||||
label: "🦜🕸️ LangGraph",
|
||||
href: "https://langchain-ai.github.io/langgraph/"
|
||||
},
|
||||
"langserve",
|
||||
]
|
||||
},
|
||||
|
||||
@@ -243,3 +243,27 @@ nav, h1, h2, h3, h4 {
|
||||
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
|
||||
no-repeat;
|
||||
}
|
||||
|
||||
div[class^='announcementBar_'] {
|
||||
font-size: 20px;
|
||||
|
||||
/*
|
||||
--site-announcement-bar-stripe-color1: hsl(
|
||||
var(--site-primary-hue-saturation) 85%
|
||||
);
|
||||
--site-announcement-bar-stripe-color2: hsl(
|
||||
var(--site-primary-hue-saturation) 95%
|
||||
);
|
||||
*/
|
||||
--site-announcement-bar-stripe-color1: rgb(197,186,254);
|
||||
--site-announcement-bar-stripe-color2: rgb(255,246,224);
|
||||
|
||||
background: repeating-linear-gradient(
|
||||
-35deg,
|
||||
var(--site-announcement-bar-stripe-color1),
|
||||
var(--site-announcement-bar-stripe-color1) 20px,
|
||||
var(--site-announcement-bar-stripe-color2) 10px,
|
||||
var(--site-announcement-bar-stripe-color2) 40px
|
||||
);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
|
||||
import React from "react";
|
||||
import { Redirect } from "@docusaurus/router";
|
||||
import useBaseUrl from "@docusaurus/useBaseUrl";
|
||||
|
||||
export default function Home() {
|
||||
return <Redirect to="docs/get_started/introduction" />;
|
||||
return <Redirect to={useBaseUrl("/docs/get_started/introduction")} />;
|
||||
}
|
||||
|
||||
2971
docs/src/theme/DocVersionBanner/index.js
Normal file
2971
docs/src/theme/DocVersionBanner/index.js
Normal file
File diff suppressed because it is too large
Load Diff
2984
docs/src/theme/SiteMetadata/index.js
Normal file
2984
docs/src/theme/SiteMetadata/index.js
Normal file
File diff suppressed because it is too large
Load Diff
1206
docs/vercel.json
1206
docs/vercel.json
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
-e ../libs/core
|
||||
-e ../libs/langchain
|
||||
-e ../libs/community
|
||||
-e ../libs/core
|
||||
-e ../libs/experimental
|
||||
-e ../libs/text-splitters
|
||||
langchain-cohere
|
||||
|
||||
@@ -32,7 +32,7 @@ class GoogleDocumentAIWarehouseRetriever(BaseRetriever):
|
||||
|
||||
Documents should be created and documents should be uploaded
|
||||
in a separate flow, and this retriever uses only Document AI
|
||||
schema_id provided to search for revelant documents.
|
||||
schema_id provided to search for relevant documents.
|
||||
|
||||
More info: https://cloud.google.com/document-ai-warehouse.
|
||||
"""
|
||||
|
||||
@@ -543,7 +543,7 @@ class Unparser:
|
||||
"Is": "is",
|
||||
"IsNot": "is not",
|
||||
"In": "in",
|
||||
"NotIn": "not in",
|
||||
"NotIn": "not in", # codespell:ignore
|
||||
}
|
||||
|
||||
def _Compare(self, t):
|
||||
|
||||
@@ -62,7 +62,7 @@ class Milvus(VectorStore):
|
||||
primary_field (str): Name of the primary key field. Defaults to "pk".
|
||||
text_field (str): Name of the text field. Defaults to "text".
|
||||
vector_field (str): Name of the vector field. Defaults to "vector".
|
||||
metadata_field (str): Name of the metadta field. Defaults to None.
|
||||
metadata_field (str): Name of the metadata field. Defaults to None.
|
||||
When metadata_field is specified,
|
||||
the document's metadata will store as json.
|
||||
|
||||
|
||||
4
libs/community/poetry.lock
generated
4
libs/community/poetry.lock
generated
@@ -3964,7 +3964,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "langchain-core"
|
||||
version = "0.1.51"
|
||||
version = "0.1.52"
|
||||
description = "Building applications with LLMs through composability"
|
||||
optional = false
|
||||
python-versions = ">=3.8.1,<4.0"
|
||||
@@ -10044,4 +10044,4 @@ extended-testing = ["aiosqlite", "aleph-alpha-client", "anthropic", "arxiv", "as
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = ">=3.8.1,<4.0"
|
||||
content-hash = "ca64e52a60e8ee6f2f4ea303e1779a4508f401e283f63861161cb6a9560e2178"
|
||||
content-hash = "6427b52f752b6b8e46c1bc56f03db5a25e959fb471d0b2de3607696a97fdcd77"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "langchain-community"
|
||||
version = "0.0.37"
|
||||
version = "0.0.38"
|
||||
description = "Community contributed LangChain integrations."
|
||||
authors = []
|
||||
license = "MIT"
|
||||
@@ -9,7 +9,7 @@ repository = "https://github.com/langchain-ai/langchain"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.8.1,<4.0"
|
||||
langchain-core = "^0.1.51"
|
||||
langchain-core = "^0.1.52"
|
||||
SQLAlchemy = ">=1.4,<3"
|
||||
requests = "^2"
|
||||
PyYAML = ">=5.3"
|
||||
|
||||
@@ -330,7 +330,7 @@ class TestAGEGraph(unittest.TestCase):
|
||||
graph.refresh_schema()
|
||||
|
||||
# check that schema is refreshed
|
||||
self.assertIn(
|
||||
self.assertIn( # codespell:ignore
|
||||
re.sub(r"\s", "", graph.get_schema),
|
||||
[re.sub(r"\s", "", x) for x in expected_possibilities],
|
||||
)
|
||||
|
||||
@@ -21,7 +21,7 @@ class BaseFakeCallbackHandler(BaseModel):
|
||||
ignore_retriever_: bool = False
|
||||
ignore_chat_model_: bool = False
|
||||
|
||||
# to allow for similar callback handlers that are not technicall equal
|
||||
# to allow for similar callback handlers that are not technically equal
|
||||
fake_id: Union[str, None] = None
|
||||
|
||||
# add finer-grained counters for easier debugging of failing tests
|
||||
|
||||
@@ -4,7 +4,6 @@ from langchain_core.prompt_values import ImagePromptValue, ImageURL, PromptValue
|
||||
from langchain_core.prompts.base import BasePromptTemplate
|
||||
from langchain_core.pydantic_v1 import Field
|
||||
from langchain_core.runnables import run_in_executor
|
||||
from langchain_core.utils import image as image_utils
|
||||
|
||||
|
||||
class ImagePromptTemplate(BasePromptTemplate[ImageURL]):
|
||||
@@ -54,6 +53,11 @@ class ImagePromptTemplate(BasePromptTemplate[ImageURL]):
|
||||
Returns:
|
||||
A formatted string.
|
||||
|
||||
Raises:
|
||||
ValueError: If the url is not provided.
|
||||
ValueError: If the url is not a string.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
@@ -67,23 +71,38 @@ class ImagePromptTemplate(BasePromptTemplate[ImageURL]):
|
||||
else:
|
||||
formatted[k] = v
|
||||
url = kwargs.get("url") or formatted.get("url")
|
||||
path = kwargs.get("path") or formatted.get("path")
|
||||
if kwargs.get("path") or formatted.get("path"):
|
||||
msg = (
|
||||
"Loading images from 'path' has been removed as of 0.3.15 for security "
|
||||
"reasons. Please specify images by 'url'."
|
||||
)
|
||||
raise ValueError(msg)
|
||||
detail = kwargs.get("detail") or formatted.get("detail")
|
||||
if not url and not path:
|
||||
raise ValueError("Must provide either url or path.")
|
||||
if not url:
|
||||
if not isinstance(path, str):
|
||||
raise ValueError("path must be a string.")
|
||||
url = image_utils.image_to_data_url(path)
|
||||
if not isinstance(url, str):
|
||||
raise ValueError("url must be a string.")
|
||||
output: ImageURL = {"url": url}
|
||||
if detail:
|
||||
# Don't check literal values here: let the API check them
|
||||
output["detail"] = detail # type: ignore[typeddict-item]
|
||||
msg = "Must provide url."
|
||||
raise ValueError(msg)
|
||||
elif not isinstance(url, str):
|
||||
msg = "url must be a string."
|
||||
raise ValueError(msg)
|
||||
else:
|
||||
output: ImageURL = {"url": url}
|
||||
if detail:
|
||||
# Don't check literal values here: let the API check them
|
||||
output["detail"] = detail # type: ignore[typeddict-item]
|
||||
return output
|
||||
|
||||
async def aformat(self, **kwargs: Any) -> ImageURL:
|
||||
"""Async format the prompt with the inputs.
|
||||
|
||||
Args:
|
||||
kwargs: Any arguments to be passed to the prompt template.
|
||||
|
||||
Returns:
|
||||
A formatted string.
|
||||
|
||||
Raises:
|
||||
ValueError: If the path or url is not a string.
|
||||
"""
|
||||
return await run_in_executor(None, self.format, **kwargs)
|
||||
|
||||
def pretty_repr(self, html: bool = False) -> str:
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
import base64
|
||||
import mimetypes
|
||||
from typing import Any
|
||||
|
||||
|
||||
def encode_image(image_path: str) -> str:
|
||||
"""Get base64 string from image URI."""
|
||||
with open(image_path, "rb") as image_file:
|
||||
return base64.b64encode(image_file.read()).decode("utf-8")
|
||||
|
||||
|
||||
def image_to_data_url(image_path: str) -> str:
|
||||
encoding = encode_image(image_path)
|
||||
mime_type = mimetypes.guess_type(image_path)[0]
|
||||
return f"data:{mime_type};base64,{encoding}"
|
||||
def __getattr__(name: str) -> Any:
|
||||
if name in ("encode_image", "image_to_data_url"):
|
||||
msg = (
|
||||
f"'{name}' has been removed for security reasons.\n\n"
|
||||
f"Usage of this utility in environments with user-input paths is a "
|
||||
f"security vulnerability. Out of an abundance of caution, the utility "
|
||||
f"has been removed to prevent possible misuse."
|
||||
)
|
||||
raise ValueError(msg)
|
||||
raise AttributeError(name)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
"""A fake callback handler for testing purposes."""
|
||||
|
||||
from itertools import chain
|
||||
from typing import Any, Dict, List, Optional, Union
|
||||
from uuid import UUID
|
||||
@@ -22,7 +23,7 @@ class BaseFakeCallbackHandler(BaseModel):
|
||||
ignore_retriever_: bool = False
|
||||
ignore_chat_model_: bool = False
|
||||
|
||||
# to allow for similar callback handlers that are not technicall equal
|
||||
# to allow for similar callback handlers that are not technically equal
|
||||
fake_id: Union[str, None] = None
|
||||
|
||||
# add finer-grained counters for easier debugging of failing tests
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import base64
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from typing import Any, List, Union
|
||||
|
||||
@@ -568,6 +570,49 @@ async def test_chat_tmpl_from_messages_multipart_image() -> None:
|
||||
assert messages == expected
|
||||
|
||||
|
||||
async def test_chat_tmpl_from_messages_multipart_formatting_with_path() -> None:
|
||||
"""Verify that we cannot pass `path` for an image as a variable."""
|
||||
in_mem = "base64mem"
|
||||
in_file_data = "base64file01"
|
||||
|
||||
with tempfile.NamedTemporaryFile(delete=True, suffix=".jpg") as temp_file:
|
||||
temp_file.write(base64.b64decode(in_file_data))
|
||||
temp_file.flush()
|
||||
|
||||
template = ChatPromptTemplate.from_messages(
|
||||
[
|
||||
("system", "You are an AI assistant named {name}."),
|
||||
(
|
||||
"human",
|
||||
[
|
||||
{"type": "text", "text": "What's in this image?"},
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": "data:image/jpeg;base64,{in_mem}",
|
||||
},
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {"path": "{file_path}"},
|
||||
},
|
||||
],
|
||||
),
|
||||
]
|
||||
)
|
||||
with pytest.raises(ValueError):
|
||||
template.format_messages(
|
||||
name="R2D2",
|
||||
in_mem=in_mem,
|
||||
file_path=temp_file.name,
|
||||
)
|
||||
|
||||
with pytest.raises(ValueError):
|
||||
await template.aformat_messages(
|
||||
name="R2D2",
|
||||
in_mem=in_mem,
|
||||
file_path=temp_file.name,
|
||||
)
|
||||
|
||||
|
||||
def test_messages_placeholder() -> None:
|
||||
prompt = MessagesPlaceholder("history")
|
||||
with pytest.raises(KeyError):
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"""Tool for the identification of prompt injection attacks."""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING, Union
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from langchain.pydantic_v1 import Field, root_validator
|
||||
from langchain.tools.base import BaseTool
|
||||
@@ -59,7 +59,7 @@ class HuggingFaceInjectionIdentifier(BaseTool):
|
||||
"Useful for when you need to ensure that prompt is free of injection attacks. "
|
||||
"Input should be any message from the user."
|
||||
)
|
||||
model: Union[Pipeline, str, None] = Field(default_factory=_model_default_factory)
|
||||
model: Any = Field(default_factory=_model_default_factory)
|
||||
"""Model to use for prompt injection detection.
|
||||
|
||||
Can be specified as transformers Pipeline or string. String should correspond to the
|
||||
@@ -98,3 +98,6 @@ class HuggingFaceInjectionIdentifier(BaseTool):
|
||||
raise PromptInjectionException("Prompt injection attack detected", score)
|
||||
|
||||
return query
|
||||
|
||||
|
||||
HuggingFaceInjectionIdentifier.update_forward_refs()
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
"""Pass input through a moderation endpoint."""
|
||||
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from langchain_core.callbacks import CallbackManagerForChainRun
|
||||
from langchain_core.pydantic_v1 import root_validator
|
||||
from langchain_core.utils import get_from_dict_or_env
|
||||
from langchain_core.callbacks import (
|
||||
AsyncCallbackManagerForChainRun,
|
||||
CallbackManagerForChainRun,
|
||||
)
|
||||
from langchain_core.pydantic_v1 import Field, root_validator
|
||||
from langchain_core.utils import check_package_version, get_from_dict_or_env
|
||||
|
||||
from langchain.chains.base import Chain
|
||||
|
||||
@@ -25,6 +29,7 @@ class OpenAIModerationChain(Chain):
|
||||
"""
|
||||
|
||||
client: Any #: :meta private:
|
||||
async_client: Any #: :meta private:
|
||||
model_name: Optional[str] = None
|
||||
"""Moderation model name to use."""
|
||||
error: bool = False
|
||||
@@ -33,6 +38,7 @@ class OpenAIModerationChain(Chain):
|
||||
output_key: str = "output" #: :meta private:
|
||||
openai_api_key: Optional[str] = None
|
||||
openai_organization: Optional[str] = None
|
||||
_openai_pre_1_0: bool = Field(default=None)
|
||||
|
||||
@root_validator()
|
||||
def validate_environment(cls, values: Dict) -> Dict:
|
||||
@@ -52,7 +58,16 @@ class OpenAIModerationChain(Chain):
|
||||
openai.api_key = openai_api_key
|
||||
if openai_organization:
|
||||
openai.organization = openai_organization
|
||||
values["client"] = openai.Moderation # type: ignore
|
||||
values["_openai_pre_1_0"] = False
|
||||
try:
|
||||
check_package_version("openai", gte_version="1.0")
|
||||
except ValueError:
|
||||
values["_openai_pre_1_0"] = True
|
||||
if values["_openai_pre_1_0"]:
|
||||
values["client"] = openai.Moderation
|
||||
else:
|
||||
values["client"] = openai.OpenAI()
|
||||
values["async_client"] = openai.AsyncOpenAI()
|
||||
except ImportError:
|
||||
raise ImportError(
|
||||
"Could not import openai python package. "
|
||||
@@ -76,8 +91,12 @@ class OpenAIModerationChain(Chain):
|
||||
"""
|
||||
return [self.output_key]
|
||||
|
||||
def _moderate(self, text: str, results: dict) -> str:
|
||||
if results["flagged"]:
|
||||
def _moderate(self, text: str, results: Any) -> str:
|
||||
if self._openai_pre_1_0:
|
||||
condition = results["flagged"]
|
||||
else:
|
||||
condition = results.flagged
|
||||
if condition:
|
||||
error_str = "Text was found that violates OpenAI's content policy."
|
||||
if self.error:
|
||||
raise ValueError(error_str)
|
||||
@@ -87,10 +106,26 @@ class OpenAIModerationChain(Chain):
|
||||
|
||||
def _call(
|
||||
self,
|
||||
inputs: Dict[str, str],
|
||||
inputs: Dict[str, Any],
|
||||
run_manager: Optional[CallbackManagerForChainRun] = None,
|
||||
) -> Dict[str, str]:
|
||||
) -> Dict[str, Any]:
|
||||
text = inputs[self.input_key]
|
||||
results = self.client.create(text)
|
||||
output = self._moderate(text, results["results"][0])
|
||||
if self._openai_pre_1_0:
|
||||
results = self.client.create(text)
|
||||
output = self._moderate(text, results["results"][0])
|
||||
else:
|
||||
results = self.client.moderations.create(input=text)
|
||||
output = self._moderate(text, results.results[0])
|
||||
return {self.output_key: output}
|
||||
|
||||
async def _acall(
|
||||
self,
|
||||
inputs: Dict[str, Any],
|
||||
run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
|
||||
) -> Dict[str, Any]:
|
||||
if self._openai_pre_1_0:
|
||||
return await super()._acall(inputs, run_manager=run_manager)
|
||||
text = inputs[self.input_key]
|
||||
results = await self.async_client.moderations.create(input=text)
|
||||
output = self._moderate(text, results.results[0])
|
||||
return {self.output_key: output}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Prompts for scoring the outputs of a models for a given question.
|
||||
|
||||
This prompt is used to socre the responses and evaluate how it follows the instructions
|
||||
This prompt is used to score the responses and evaluate how it follows the instructions
|
||||
and answers the question. The prompt is based on the paper from
|
||||
Zheng, et. al. https://arxiv.org/abs/2306.05685
|
||||
"""
|
||||
|
||||
16
libs/langchain/poetry.lock
generated
16
libs/langchain/poetry.lock
generated
@@ -1,4 +1,4 @@
|
||||
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
|
||||
# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
|
||||
|
||||
[[package]]
|
||||
name = "aiodns"
|
||||
@@ -3469,7 +3469,7 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "langchain-community"
|
||||
version = "0.0.37"
|
||||
version = "0.0.38"
|
||||
description = "Community contributed LangChain integrations."
|
||||
optional = false
|
||||
python-versions = ">=3.8.1,<4.0"
|
||||
@@ -3479,7 +3479,7 @@ develop = true
|
||||
[package.dependencies]
|
||||
aiohttp = "^3.8.3"
|
||||
dataclasses-json = ">= 0.5.7, < 0.7"
|
||||
langchain-core = "^0.1.51"
|
||||
langchain-core = "^0.1.52"
|
||||
langsmith = "^0.1.0"
|
||||
numpy = "^1"
|
||||
PyYAML = ">=5.3"
|
||||
@@ -3497,7 +3497,7 @@ url = "../community"
|
||||
|
||||
[[package]]
|
||||
name = "langchain-core"
|
||||
version = "0.1.51"
|
||||
version = "0.1.52"
|
||||
description = "Building applications with LLMs through composability"
|
||||
optional = false
|
||||
python-versions = ">=3.8.1,<4.0"
|
||||
@@ -4727,6 +4727,7 @@ description = "Nvidia JIT LTO Library"
|
||||
optional = true
|
||||
python-versions = ">=3"
|
||||
files = [
|
||||
{file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_aarch64.whl", hash = "sha256:75d6498c96d9adb9435f2bbdbddb479805ddfb97b5c1b32395c694185c20ca57"},
|
||||
{file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c6428836d20fe7e327191c175791d38570e10762edc588fb46749217cd444c74"},
|
||||
{file = "nvidia_nvjitlink_cu12-12.4.99-py3-none-win_amd64.whl", hash = "sha256:991905ffa2144cb603d8ca7962d75c35334ae82bf92820b6ba78157277da1ad2"},
|
||||
]
|
||||
@@ -6074,26 +6075,31 @@ python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "PyMuPDF-1.23.26-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:645a05321aecc8c45739f71f0eb574ce33138d19189582ffa5241fea3a8e2549"},
|
||||
{file = "PyMuPDF-1.23.26-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:2dfc9e010669ae92fade6fb72aaea49ebe3b8dcd7ee4dcbbe50115abcaa4d3fe"},
|
||||
{file = "PyMuPDF-1.23.26-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:734ee380b3abd038602be79114194a3cb74ac102b7c943bcb333104575922c50"},
|
||||
{file = "PyMuPDF-1.23.26-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:b22f8d854f8196ad5b20308c1cebad3d5189ed9f0988acbafa043947ea7e6c55"},
|
||||
{file = "PyMuPDF-1.23.26-cp310-none-win32.whl", hash = "sha256:cc0f794e3466bc96b5bf79d42fbc1551428751e3fef38ebc10ac70396b676144"},
|
||||
{file = "PyMuPDF-1.23.26-cp310-none-win_amd64.whl", hash = "sha256:2eb701247d8e685a24e45899d1175f01a3ce5fc792a4431c91fbb68633b29298"},
|
||||
{file = "PyMuPDF-1.23.26-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:e2804a64bb57da414781e312fb0561f6be67658ad57ed4a73dce008b23fc70a6"},
|
||||
{file = "PyMuPDF-1.23.26-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:97b40bb22e3056874634617a90e0ed24a5172cf71791b9e25d1d91c6743bc567"},
|
||||
{file = "PyMuPDF-1.23.26-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:fab8833559bc47ab26ce736f915b8fc1dd37c108049b90396f7cd5e1004d7593"},
|
||||
{file = "PyMuPDF-1.23.26-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:f25aafd3e7fb9d7761a22acf2b67d704f04cc36d4dc33a3773f0eb3f4ec3606f"},
|
||||
{file = "PyMuPDF-1.23.26-cp311-none-win32.whl", hash = "sha256:05e672ed3e82caca7ef02a88ace30130b1dd392a1190f03b2b58ffe7aa331400"},
|
||||
{file = "PyMuPDF-1.23.26-cp311-none-win_amd64.whl", hash = "sha256:92b3c4dd4d0491d495f333be2d41f4e1c155a409bc9d04b5ff29655dccbf4655"},
|
||||
{file = "PyMuPDF-1.23.26-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:a217689ede18cc6991b4e6a78afee8a440b3075d53b9dec4ba5ef7487d4547e9"},
|
||||
{file = "PyMuPDF-1.23.26-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:42ad2b819b90ce1947e11b90ec5085889df0a2e3aa0207bc97ecacfc6157cabc"},
|
||||
{file = "PyMuPDF-1.23.26-cp312-none-manylinux2014_aarch64.whl", hash = "sha256:99607649f89a02bba7d8ebe96e2410664316adc95e9337f7dfeff6a154f93049"},
|
||||
{file = "PyMuPDF-1.23.26-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:bb42d4b8407b4de7cb58c28f01449f16f32a6daed88afb41108f1aeb3552bdd4"},
|
||||
{file = "PyMuPDF-1.23.26-cp312-none-win32.whl", hash = "sha256:c40d044411615e6f0baa7d3d933b3032cf97e168c7fa77d1be8a46008c109aee"},
|
||||
{file = "PyMuPDF-1.23.26-cp312-none-win_amd64.whl", hash = "sha256:3f876533aa7f9a94bcd9a0225ce72571b7808260903fec1d95c120bc842fb52d"},
|
||||
{file = "PyMuPDF-1.23.26-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:52df831d46beb9ff494f5fba3e5d069af6d81f49abf6b6e799ee01f4f8fa6799"},
|
||||
{file = "PyMuPDF-1.23.26-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:0bbb0cf6593e53524f3fc26fb5e6ead17c02c64791caec7c4afe61b677dedf80"},
|
||||
{file = "PyMuPDF-1.23.26-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:5ef4360f20015673c20cf59b7e19afc97168795188c584254ed3778cde43ce77"},
|
||||
{file = "PyMuPDF-1.23.26-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:d7cd88842b2e7f4c71eef4d87c98c35646b80b60e6375392d7ce40e519261f59"},
|
||||
{file = "PyMuPDF-1.23.26-cp38-none-win32.whl", hash = "sha256:6577e2f473625e2d0df5f5a3bf1e4519e94ae749733cc9937994d1b256687bfa"},
|
||||
{file = "PyMuPDF-1.23.26-cp38-none-win_amd64.whl", hash = "sha256:fbe1a3255b2cd0d769b2da2c4efdd0c0f30d4961a1aac02c0f75cf951b337aa4"},
|
||||
{file = "PyMuPDF-1.23.26-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:73fce034f2afea886a59ead2d0caedf27e2b2a8558b5da16d0286882e0b1eb82"},
|
||||
{file = "PyMuPDF-1.23.26-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:b3de8618b7cb5b36db611083840b3bcf09b11a893e2d8262f4e042102c7e65de"},
|
||||
{file = "PyMuPDF-1.23.26-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:879e7f5ad35709d8760ab6103c3d5dac8ab8043a856ab3653fd324af7358ee87"},
|
||||
{file = "PyMuPDF-1.23.26-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:deee96c2fd415ded7b5070d8d5b2c60679aee6ed0e28ac0d2cb998060d835c2c"},
|
||||
{file = "PyMuPDF-1.23.26-cp39-none-win32.whl", hash = "sha256:9f7f4ef99dd8ac97fb0b852efa3dcbee515798078b6c79a6a13c7b1e7c5d41a4"},
|
||||
{file = "PyMuPDF-1.23.26-cp39-none-win_amd64.whl", hash = "sha256:ba9a54552c7afb9ec85432c765e2fa9a81413acfaa7d70db7c9b528297749e5b"},
|
||||
@@ -9404,4 +9410,4 @@ text-helpers = ["chardet"]
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = ">=3.8.1,<4.0"
|
||||
content-hash = "9ed4d0b11749d1f98e8fbe2895a94e4bc90975817873e52a70f2bbcee934ce19"
|
||||
content-hash = "56e0417edc75e591b9265c6986b87115c27ddd98b87466f698c68df6f3fb60d3"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "langchain"
|
||||
version = "0.1.18"
|
||||
version = "0.1.20"
|
||||
description = "Building applications with LLMs through composability"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
@@ -12,9 +12,9 @@ langchain-server = "langchain.server:main"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.8.1,<4.0"
|
||||
langchain-core = "^0.1.48"
|
||||
langchain-core = "^0.1.52"
|
||||
langchain-text-splitters = ">=0.0.1,<0.1"
|
||||
langchain-community = ">=0.0.37,<0.1"
|
||||
langchain-community = ">=0.0.38,<0.1"
|
||||
langsmith = "^0.1.17"
|
||||
pydantic = ">=1,<3"
|
||||
SQLAlchemy = ">=1.4,<3"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
"""A fake callback handler for testing purposes."""
|
||||
|
||||
from itertools import chain
|
||||
from typing import Any, Dict, List, Optional, Union
|
||||
from uuid import UUID
|
||||
@@ -21,7 +22,7 @@ class BaseFakeCallbackHandler(BaseModel):
|
||||
ignore_retriever_: bool = False
|
||||
ignore_chat_model_: bool = False
|
||||
|
||||
# to allow for similar callback handlers that are not technicall equal
|
||||
# to allow for similar callback handlers that are not technically equal
|
||||
fake_id: Union[str, None] = None
|
||||
|
||||
# add finer-grained counters for easier debugging of failing tests
|
||||
|
||||
@@ -19,7 +19,7 @@ class BaseFakeCallbackHandler(BaseModel):
|
||||
ignore_retriever_: bool = False
|
||||
ignore_chat_model_: bool = False
|
||||
|
||||
# to allow for similar callback handlers that are not technicall equal
|
||||
# to allow for similar callback handlers that are not technically equal
|
||||
fake_id: Union[str, None] = None
|
||||
|
||||
# add finer-grained counters for easier debugging of failing tests
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
"""A fake callback handler for testing purposes."""
|
||||
|
||||
from itertools import chain
|
||||
from typing import Any, Dict, List, Optional, Union
|
||||
from uuid import UUID
|
||||
@@ -22,7 +23,7 @@ class BaseFakeCallbackHandler(BaseModel):
|
||||
ignore_retriever_: bool = False
|
||||
ignore_chat_model_: bool = False
|
||||
|
||||
# to allow for similar callback handlers that are not technicall equal
|
||||
# to allow for similar callback handlers that are not technically equal
|
||||
fake_id: Union[str, None] = None
|
||||
|
||||
# add finer-grained counters for easier debugging of failing tests
|
||||
|
||||
@@ -58,30 +58,29 @@ ipykernel = "^6.29.2"
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
|
||||
[tool.codespell]
|
||||
skip = '.git,*.pdf,*.svg,*.pdf,*.yaml,*.ipynb,poetry.lock,*.min.js,*.css,package-lock.json,example_data,_dist,examples,templates,*.trig'
|
||||
skip = '.git,*.pdf,*.svg,*.pdf,*.yaml,*.ipynb,poetry.lock,*.min.js,*.css,package-lock.json,example_data,_dist,examples,templates,*.trig,trulens.mdx'
|
||||
# Ignore latin etc
|
||||
ignore-regex = '.*(Stati Uniti|Tense=Pres).*'
|
||||
# whats is a typo but used frequently in queries so kept as is
|
||||
# aapply - async apply
|
||||
# unsecure - typo but part of API, decided to not bother for now
|
||||
ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate,aadd,symbl,precesses,accademia,nin'
|
||||
ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate,aadd,symbl,precesses,accademia,nin,checkin'
|
||||
|
||||
[tool.ruff]
|
||||
extend-include = ["*.ipynb"]
|
||||
extend-exclude = [
|
||||
"docs/docs/expression_language/why.ipynb" # TODO: look into why linter errors
|
||||
"docs/docs/expression_language/why.ipynb", # TODO: look into why linter errors
|
||||
]
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
"**/{cookbook,docs}/*" = [
|
||||
"E402", # allow imports to appear anywhere in docs
|
||||
"F401", # allow "imported but unused" example code
|
||||
"F811", # allow re-importing the same module, so that cells can stay independent
|
||||
"F841", # allow assignments to variables that are never read -- it's example code
|
||||
"E402", # allow imports to appear anywhere in docs
|
||||
"F401", # allow "imported but unused" example code
|
||||
"F811", # allow re-importing the same module, so that cells can stay independent
|
||||
"F841", # allow assignments to variables that are never read -- it's example code
|
||||
]
|
||||
|
||||
# These files were failing the listed rules at the time ruff was adopted for notebooks.
|
||||
# Don't require them to change at once, though we should look into them eventually.
|
||||
"cookbook/gymnasium_agent_simulation.ipynb" = ["F821"]
|
||||
"docs/docs/integrations/document_loaders/tensorflow_datasets.ipynb" = ["F821"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user