Mac os 本地搭建 Langchain 基础环境

一、本地所需环境安装

1.1 安装 python

查看本地 python 版本,命令台输入 python -V

建议升级 python 到 3.0 以上,如果已经安装了 Homebrew,直接通过命令brew install python3安装即可(注:该方法会比较慢,如一直在卡在Updating Homebrew...,按control + c 可仅仅取消Homebrew本次更新操作)

安装或更新完成后,控制台会打印出安装所在路径,copy 路径

把安装路径设置环境变量中,输入open ~/.bash_profile打开文件,把安装路径新增到文件中

新增 alias python="/usr/local/bin/python3"(注:路径为各自控制台输出安装路径) 完成后控制台执行保存 source ~/.bash_profile,再次执行python -V发现已经升级了本地 pytho 版本

1.2 安装 pip 包

查看本地 pip 版本,执行命令 pip -V

如果没有安装,执行命令python3 -m pip install --upgrade pip安装 pip 包

然后设置环境变量,执行open ~/.bash_profile,新增export HNSWLIB_NO_NATIVE=1,更新环境source ~/.bash_profile

1.3 安装 langchain&chroma db

直接使用 pip 安装,执行pip install langchain(注:安装比较慢,如遇下载超时情况,重新执行命令即可) 执行pip install chromadb(注:安装比较慢,如遇下载超时情况,重新执行命令即可)

1.4 安装其它环境

直接使用 pip 安装,一般执行pip install xxx,比如安装 openAI,pip install openai

1.5 执行 python 脚本

示例:输入命令pyhton3进入 python 中,依次输入以下命令

 

import chromadb(导包) chroma_client = chromadb.Client()(创建客户端) collection = chroma_client.create_collection(name="my_collection")(设置表名称) collection.add( documents=["This is a document", "This is another document"], metadatas=[{"source": "my_source"}, {"source": "my_source"}], ids=["id1", "id2"] )(执行插入) results = collection.query( query_texts=["This is a query document"], n_results=2 )(设置查询) print(results)(打印查询数据)

退出 python 执行 exit()


二、私有知识库 Demo

2.1 保存&查询并持久化到磁盘

      
# 导包
import chromadb
from chromadb.config import Settings

# 保存数据路径
persist_directory = "/Users/baixiaobai/SHUIDI/shuidi/chroma_db"
# 创建启用持久性的新 Chroma 客户端
client = chromadb.Client(
    Settings(
        persist_directory=persist_directory,
        chroma_db_impl="duckdb+parquet",
    )
)

# 重置数据库
client.reset()

# 创建集合
collection_name = "peristed_collection"
collection = client.create_collection(name=collection_name)

# 添加一些数据到集合中
collection.add(
    embeddings=[
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
    ],
    metadatas=[
        {"uri": "img1.png", "style": "style1"},
        {"uri": "img2.png", "style": "style2"},
        {"uri": "img3.png", "style": "style1"},
        {"uri": "img4.png", "style": "style1"},
        {"uri": "img5.png", "style": "style1"},
        {"uri": "img6.png", "style": "style1"},
        {"uri": "img7.png", "style": "style1"},
        {"uri": "img8.png", "style": "style1"},
    ],
    documents=["doc1", "doc2", "doc3", "doc4", "doc5", "doc6", "doc7", "doc8"],
    ids=["id1", "id2", "id3", "id4", "id5", "id6", "id7", "id8"],
)

# 显示手动调用,保存数据到磁盘
client.persist()

# 使用相同的设置创建一个新客户端
client = chromadb.Client(
    Settings(
        persist_directory=persist_directory,
        chroma_db_impl="duckdb+parquet",
    )
)

# 加载集合
collection = client.get_collection(collection_name)

# 查询集合
results = collection.query(
    query_embeddings=[1.1, 2.2, 3.2],
    n_results=1,
    include=["embeddings", "documents", "metadatas", "distances"]
)

# 打印结果
print(results)

    

2.2 利用 openai 进行 Embeddings 保存数据

      
import chromadb
from chromadb.utils import embedding_functions
client = chromadb.Client()
# Using OpenAI Embeddings. This assumes you have the openai package installed
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key="*********************************",
    model_name="text-embedding-ada-002"
)
openai_collection = client.create_collection(name="openai_embeddings", embedding_function=openai_ef)
openai_collection.add(
    documents=["This is a document", "This is another document"],
    metadatas=[{"source": "my_source"}, {"source": "my_source"}],
    ids=["id1", "id2"]
)
results = openai_collection.query(
    query_texts=["This is a query document"],
    n_results=2,
    include=["embeddings", "documents", "metadatas", "distances"]
)
print(results)

    

2.3 利用 langchain 框架进行向量数据并查询

      
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
import os
from langchain import PromptTemplate
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import TextLoader
# key
OPENAI_API_KEY = '********'
# 加载文件
loader = TextLoader('/Users/baixiaobai/SHUIDI/shuidi/11.txt')
documents = loader.load()
# 按照句号切块数据
text_splitter = CharacterTextSplitter(chunk_size=20, chunk_overlap=0, separator='。')
split_docs = text_splitter.split_documents(documents)
# 初始请求向量化数据
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)
# 持久化文件地址
persist_directory = 'chroma_storage'
# 执行向量化
vectorstore = Chroma.from_documents(split_docs, embeddings, persist_directory=persist_directory)
# 持久化到本地
vectorstore.persist()
# 从本地加载数据
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
query = "小黄今天干什么?"
# 查询
docs = vectordb.similarity_search(query,1)
# 创建提示模板
output_parser = CommaSeparatedListOutputParser()
format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
    template="已知信息:{background}。 根据上述已知信息,以客服的语气来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。 问题是:{question}",
    input_variables=["question"],
    partial_variables={"background": str(docs[0].page_content)}
)
# 初始化
llm = OpenAI(temperature=0, openai_api_key=OPENAI_API_KEY)
input = prompt.format(question="小黄明天干什么?")
# 调用openai
output = llm(input)
print(output)

    

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值