LangChain相关

263 阅读7分钟

api api.python.langchain.com/en/latest/a…

python langchain官网python.langchain.com/docs/get_st…

langchain github python.langchain.com/docs/get_st…

What is LangChain?

LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。

LangChain有很多核心概念:

1. Components and Chains

在 LangChain 中,Component 是模块化的构建块,可以组合起来创建强大的应用程序。Chain 是组合在一起以完成特定任务的一系列 Components(或其他 Chain)。例如,一个 Chain 可能包括一个 Prompt 模板、一个语言模型和一个输出解析器,它们一起工作以处理用户输入、生成响应并处理输出。

基础Chains

LLM Chain

最基础的一个Chain

Utility Chains

解决数学问题, 根据输入,在prompt里自动增加示例, 将数学问题交给python工具运行, 从而得到数学运算的结果. 还可以请求sql/api等得到结果.

Generic Chains

TransformChain 清理乱格式的文字 ...

复杂Chains

教学视频见

SequentialChain

可构造有向无环调用链, 前面的输出可作为后面的输入.

RouterChain

根据输入的内容判断属于哪种类型, 再根据定义好的路由使用对应的chain调用模型(猜测是根据description选择name, 再根据name选中路由). 会使用到MultiPromptChain

MultiPromptChain

2. Prompt Templates and Values

Prompt Template 为了LLM能更好地理解用户的需求,而建立的输入模板.

例如: 我想让你做一种什么事儿(抽象的); 具体的例子是怎样的; 对输出的结果的要求是什么; 现在请你回答...

image.png PromptValues 是具有方法的类,这些方法可以转换为每个模型类型期望的确切输入类型(如文本或聊天消息)。

3. Example Selectors

当您想要在 Prompts 中动态包含示例时,Example Selectors 很有用。他们接受用户输入并返回一个示例列表以在提示中使用,使其更强大和特定于上下文。

4. Output Parsers

Output Parsers 负责将语言模型响应构建为更有用的格式。它们实现了两种主要方法:一种用于提供格式化指令,另一种用于将语言模型的响应解析为结构化格式。这使得在您的应用程序中处理输出数据变得更加容易。

5. Indexes and Retrievers

Index 是一种组织文档的方式,使语言模型更容易与它们交互。检索器是用于获取相关文档并将它们与语言模型组合的接口。LangChain 提供了用于处理不同类型的索引和检索器的工具和功能,例如矢量数据库文本拆分器

6. Chat Message History

LangChain 主要通过聊天界面与语言模型进行交互。ChatMessageHistory 类负责记住所有以前的聊天交互数据,然后可以将这些交互数据传递回模型、汇总或以其他方式组合。这有助于维护上下文并提高模型对对话的理解。 有短期记忆和长期记忆, 如果记忆太大了,会生成摘要信息

7. Agents and Toolkits

Agent 是在 LangChain 中推动决策制定的实体。他可以将用户输入的目标分解成多个过程/子任务, 并且可以访问一套工具(访问天气服务器等)。Tookits 是一组工具,当它们一起使用时,可以完成特定的任务。代理执行器负责使用适当的工具运行代理。

通过理解和利用这些核心概念,您可以利用 LangChain 的强大功能来构建适应性强、高效且能够处理复杂用例的高级语言模型应用程序。

部署

1 安装依赖

安装OpenSSL(如果不使用https则不需要)

www.openssl.org/source/open…

编译安装

tar -zxf openssl-1.1.1s.tar.gz
cd openssl-1.1.1s/
./config -fPIC --prefix=/usr/include/openssl enable-shared
make
make install

安装sqlite3 wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz

安装Python环境

升级python3【腾讯云默认最新版本为3.6.8,需要手动安装更新版本,否则会报错future feature annotations is not defined】

下载python >= 3.7.0安装包并上传www.python.org/ftp/python/…

解压安装包并执行如下命令

mkdir /usr/local/python3
 // 进入 python安装包解压目录后执行

需要修改解压后的python Modules/Setup文件
209 # Socket module helper for SSL support; you must comment out the other
210 # socket line above, and edit the OPENSSL variable:
211  OPENSSL=/usr/include/openssl
212  _ssl _ssl.c \
213      -I$(OPENSSL)/include -L$(OPENSSL)/lib \
214      -lssl -lcrypto


./configure --prefix=/usr/local/python3
make -j && make install

更改环境变量

更改linux的path变量,添加python3

执行 vim ~/.bash_profile,打开配置文件,添加如下配置:

#配置python
export PYTHON_HOME=/usr/local/python3
export PATH=$PYTHON_HOME/bin:$PATH

保存退出(:wq),执行source ~/.bash_profile命令使配置生效。

执行echo $PYTHON_HOME,查看是否配置成功,如图:

[root@VM-16-3-opencloudos Python-3.10.12]# echo $PYTHON_HOME
/usr/local/python3
[root@VM-16-3-opencloudos Python-3.10.12]# python3 --version
Python 3.10.12
[root@VM-16-3-opencloudos Python-3.10.12]# pip3 --version
pip 23.0.1 from /usr/local/python3/lib/python3.10/site-packages/pip (python 3.10)
[root@VM-16-3-opencloudos Python-3.10.12]#

2 安装langchain & openai

pip3 install langchain

pip3 install openai

3 使用langchain进行openai chat demo示例

import os
from langchain.llms import OpenAI
 
os.environ["OPENAI_API_KEY"] = 'xxx'
 
 
llm = OpenAI(model_name="text-davinci-003", max_tokens=1024)
result = llm("怎么评价人工智能")
print(result)

17cd2962-899b-4368-9b5e-6bc95a86ca1f.png

e1577982-8f92-42fe-899a-de8c2986017b.png

4 使用langchain进行azure openai调用示例

import os

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_VERSION"] = "2022-12-01"
os.environ["OPENAI_API_BASE"] = "https://makee.openai.azure.com/"
os.environ["OPENAI_API_KEY"] = "9c39b5c77ce34b5cb77b39d513b467bd"

from langchain.llms import AzureOpenAI

llm = AzureOpenAI(deployment_name="makee", model_name="text-davinci-002",)
result = llm("么评价人工智能")
print(result)

477774df-0c4f-4d75-bdea-5ab906a3df82.png

5 使用向量存储

因chromadb安装依赖较多且有些依赖需要重新安装python, 可能影响操作系统, 所以改为使用FAISS.

安装faiss

pip install faiss-cpu

注意: python可能是操作系统组件, 一定不要卸载python

yum install libffi-devel sqlite3 # (sqlite3 >= 3.35.0, 直接yum install的版本可能比较低)
pip3 install chromadb tiktoken jq # (使用向量数据库时安装, 如果报错缺少模块_ctypes, 需要先yum install libffi-devel, 再重新安装python3)

测试

from langchain.document_loaders import JSONLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
os.environ["OPENAI_API_BASE"] = "https://makee.openai.azure.com"
os.environ["OPENAI_API_KEY"] = "9c39b5c77ce34b5cb77b39d513b467bd"

logger = logging.getLogger("makee.com")

# 初始化向量db
loader = JSONLoader(file_path='resources/santi.json', jq_schema='.[].content')
raw_docs = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=10, chunk_overlap=0)
documents = text_splitter.split_documents(raw_docs)
# 现在embedding对应的部署名是embedding, 模型是text-embedding-ada-002
embeds = OpenAIEmbeddings(deployment='embedding',
                          model='text-embedding-ada-002',
                          chunk_size=10)
db = FAISS.from_documents(documents, embeds)

query = "What's Waterdrop?"
docs = db.similarity_search(query)
print(docs)

开发中遇到的问题

The API deployment for this resource does not exist

调用下面的语句后报错

embeds = OpenAIEmbeddings()
db = Chroma.from_documents(documents, embeds)
2023-08-09 10:59:16,556 - openai - DEBUG - message='OpenAI API response' path=https://makee.openai.azure.com//openai/deployments/text-embedding-ada-002/embeddings?api-version=2023-07-01-preview processing_ms=2146.9511 request_id=None response_code=404
2023-08-09 10:59:16,556 - openai - INFO - error_code=DeploymentNotFound error_message='The API deployment for this resource does not exist. If you created the deployment within the last 5 minutes, please wait a moment and try again.' error_param=None error_type=None message='OpenAI API error received' stream_error=False

如此问题原因是

image.png 我的langchain版本为0.0.252,改为下面的代码后不再报该错误

embeds = OpenAIEmbeddings(deployment='makee')
db = Chroma.from_documents(documents, embeds)

The embeddings operation does not work with the specified model, gpt-35-turbo

报错语句还是下面的第2句

embeds = OpenAIEmbeddings(deployment='makee')
db = Chroma.from_documents(documents, embeds)

错误详细内容

openai.error.InvalidRequestError: The embeddings operation does not work with the specified model, gpt-35-turbo. Please choose different model and try again. You can learn more about which models can be used with each operation here: https://go.microsoft.com/fwlink/?linkid=2197993.

问题是1.我没有指定使用gpt3.5 2.微软列表里包含gpt3.5

试了使用VectorstoreIndexCreator替换chromadb也没用(VectorstoreIndexCreator)

问题解决了, 原因 embeddings在Azure里申请时有一个对应的部署名和模型名,与聊天模型不同, 因为之前不是我申请的,所以我不清楚,后来确定了一下是部署名错了, 改成申请的部署名和模型名就OK了.