使用langchain创建一个ReAct能力的agent

二: 先实例化一个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": "猫的称呼有哪些?"
    }]
})
相关推荐
染指11105 小时前
162.Agent-LangGraph-检查点的作用
人工智能·python·langchain·agents
叼烟扛炮6 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
YIAN7 小时前
RAG 学到最后,我真正学会的不是“检索”,而是让系统知道自己缺什么
langchain·node.js·llm
lee_curry9 小时前
第十周完整学习笔记:继续升级为“检索更准、权限安全、索引可维护、失败可恢复、长期可运行”的企业级 RAG 系统
python·ai·langchain·agent·langgraph
破烂三角裤1 天前
AI 没有记忆?我给儿童故事 Agent 搭了一套“长期记忆”系统
langchain
云和数据.ChenGuang1 天前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain
Maiko Star1 天前
【HM-LC】LangChain RAG查询优化详解:查询重写、混合检索与重排序实战
langchain·rag
2501_913061341 天前
MCP核心能力
langchain
小林ixn1 天前
从线性 RAG 到 Agentic RAG:用 LangGraph 搭一个会判断、会纠错、会兜底的检索闭环
langchain·llm·agent
kyrie_sakura1 天前
大模型学习19 大模型学习 - LangChain2_Retrieval(RAG-文档处理-向量处理检索-Milvus)
学习·langchain·milvus