二: 先实例化一个LLM
- 引入
ChatOpenAI - 注册想要使用模型的key
python
from @langchain_openai import ChatOpenAI;
llm = ChatOpenAI(
model="deepseek-chat",
api_key="********",
base_url="https://api.deepseek.com/v1",
)
二: loader文档并splitter
前提:内部文档一般都存放于公司内网。直接使用大模型是无法获取到这些信息的。所以需要我们做一下这些处理
- 使用loader加载这些文档,不同的类型的文件有可以使用不同loader。loader加载器有社区维护所以一般会放在
@langchain_community.document_loader中。但是社区实现的loader底层实现一般都是采用和继承自@langchain_core.documents中的BaseLoader,BlobLoader,BaseBlobParser - 将loader加载的内容,使用
from langchain_text_splitter import RecursiveCharacterTextSplitter进行分割为Document。因为潜入模型有输入长度限制,同时我们又想保持语义的连贯,所以将文本拆分为更小的块。 - 代码实现如下
python
from @langchain_community.document import WebBaseLoader;
from langchain_text_splitter import RecursiveCharacterTextSplitter;
# 使用WebBaseLoader加载网页
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8C%AB")
# 获取网页内容
text = loader.load();
# 实例化文本切割对象
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200);
# 将文档分为小的document对象集合
documents = splitter.split_documents(text);
三:使用文本潜入模型,将文本向量化
- 指定文本潜入模型,这里使用
text-embedding-v3 - 文本潜入模型厂家也很多,一般也在社区维护的包里
from @langchain_community.embeddings,将文本向量化 - 指定向量数据库,向量数据库厂家有很多,所以也是在社区维护的包中。
from @langchain_community.vectorstores
python
import os
from typing import List;
from @langchain_community.embeddings import DashScopeEmbeddings;
# 练习过程中使用Chroma向量数据库
from @langchain_community.vectorStores import Chroma;
from @langchain_core.documents import Document;
from @lamgchain_core.tools.retriever import create_retriever_tool;
embedding = DashScopeEmbeddings(
model="text-embedding-v3",
descope_api_key="******",
)
def creatr_and_load_vector_store(docs:List[Document], persist_directory: str):
vector_store = None
if os.path.exists(persist_directory):
vector_store=Chroma(persist_directory=persist_directory, embedding_function=embedding);
vector_store.add_documents(docs)
else:
vector_store = Chrome.from_documents(docs, embedding, persist_directory=persist_directory;
vector_store.persist();
return vector_store;
vector_store = creatr_and_load_vector_store(documents, "./db/demo_db")
# 方式一:采用mmr检索
retriever = vector_store.as_retriever(search_type="mmr",config={"k": 4, "fetch_k": 20})
# 方式二:采用相似性打分检索
retriever = vector_store.as_retriver(search_type="similarity_score_threshold", config={"score_threshold": 0.5, "key": 1})
# 方式三:采用多轮检索,不过MulitQueryRetriever已经放在classic包里了,后期可能不维护了,不太推荐使用。(后期我们可以自己定义一个prompt,prompt让llm生成和用户输入类似的3个问题,将3个问题通过vector_store检索出的文档进行合并,达到类似效果)
from "@langcain_classic.retrievers import MulitQueryRetriever";
retriever = MulitQueryRetriever(
retriever=vector_store.as_retriever(search_type="mmr", config={"k": 4, "fetch_k": 20})
llm=llm,
include_original=True,
)
# 以上三种生成检索器的方式,选一种就可以
# 通过create_retriever_tool将检索器生成为tool
tool = create_retriever_tool(retriever, "search", "搜索")
四:生成待ReAct功能的agent
- 引入create_agent,
from @langchain.agents import create_agent;。
css
from @langchain.agents import create_agent;
tools = [tool]
agent = create_agent(llm=llm, tools=tools)
agent.invoke({
message: [{
"role": "user",
"content": "猫的称呼有哪些?"
}]
})