LangChain开发示例

本文阐述了LangChain结合DeepSeek API,以及本地安装Ollama的模型使用示例,代码经过修改对应的配置即可运行。

参考链接:

英文:Introduction | 🦜️🔗 LangChain

中文:introduction | LangChain中文网

一. 使用DeepSeek API, 进行问答

1.安装LangChain以及相关依赖

pip3 install langchain langchain-openai langchain-community  deepseek-sdk pillow 

2. 使用DeepSeek API Key

DeepSeek API Key创建DeepSeek API KeyDeepSeek API Key: DeepSeek API Key, 替换以下脚本中的sk-xxx,以及选择模型V3还是R1.

from langchain_openai import ChatOpenAI
import os

# 配置API参数
os.environ["OPENAI_API_KEY"] = "sk-xxx"  # 替换为实际密钥
llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",  # API地址
    model="deepseek-chat",                   # 模型名称(支持deepseek-chat/V3或deepseek-reasoner/R1)
    temperature=0.7                          # 控制生成随机性
)

# 调用示例
response = llm.invoke("解释量子计算的基本原理")
print(response.content)

 如果看到以下输出,则配置正常。

三. LangChain集成Ollama

1. 安装依赖:

pip3 install langchain_ollama 

2. 使用Ollama安装的模型进行问答

 以下代码是使用Ollama安装的deepseek-r1:7b模型,安装Ollama以及本地化安装deepseek-r1:7b模型请参考:

Alibaba Cloud Linux 基于Ollama部署DeepSeek R1:7B版本_linux ollama 部署7b deepseek-优快云博客

from langchain.llms.base import LLM
from typing import Optional, List, Mapping, Any
from langchain.chains import ConversationalChain
from langchain.memory import ConversationBufferMemory
import requests
import json

class OllamaLLM(LLM):
    model: str = "deepseek-r1:7b"  # 默认模型
    temperature: float = 0.7
    max_tokens: int = 256
    endpoint: str = "http://localhost:11434"  # Ollama API 地址

    def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
        headers = {"Content-Type": "application/json"}
        payload = {
            "model": self.model,
            "prompt": prompt,
            "temperature": self.temperature,
            "max_length": self.max_tokens,
            "stop": stop  # Ollama 支持 stop 参数
        }
        
        response = requests.post(
            f"{self.endpoint}/api/generate",
            headers=headers,
            json=payload,
            stream=True  # 支持流式响应
        )
        
        # 处理流式响应(可选,LangChain 支持流式)
        if response.status_code == 200:
            full_response = ""
            for chunk in response.iter_lines():
                if chunk:
                    data = json.loads(chunk.decode())
                    if "response" in data:
                        full_response += data["response"]
            return full_response
        else:
            raise Exception(f"Ollama API 错误:{response.status_code}")

    @property
    def _llm_type(self) -> str:
        return "ollama"

ollama_llm = OllamaLLM(model="deepseek-r1:7b", temperature=0.5, max_tokens=500)
print(ollama_llm("写一个关于人工智能的短篇故事开头:"))

四. LangChain 结合Ollama实现RAG

1. 安装依赖:

yum install -y libX11 libXext

2. 使用Ollama 安装的embedding模型,将分块后的信息保存至向量数据库:

这里以安装的nomic-embed-text模型为例,模型安装参考:

AnythingLLM 结合nomic-embed-text 处理文档建立私有知识库-优快云博客

from langchain_community.embeddings import OllamaEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import TextLoader


# 初始化模型 (关键配置)
embed_model = OllamaEmbeddings(
    base_url="http://localhost:11434",  # Ollama 服务地址
    model="nomic-embed-text:latest",      # 模型名称
)


# 加载文档并切分
loader = TextLoader("test.txt")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=2000,
    chunk_overlap=100
)
splits = text_splitter.split_documents(docs)

# 使用nomic模型生成向量库
vector_db = FAISS.from_documents(
    splits,
    embed_model
)

# 持久化存储
vector_db.save_local("./faiss_nomic")


# 打印向量数据库中的分块信息
print("向量数据库中的分块信息:")
for i, doc in enumerate(vector_db.docstore._dict.values()):
    print(f"分块 {i + 1} 内容:")
    print(doc.page_content)
    print(f"分块 {i + 1} 元数据:{doc.metadata}")
    print("-" * 50)

3. 查询已有向量数据库的分块信息:

from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS

# 初始化本地Ollama嵌入模型
nomic_embeddings = OllamaEmbeddings(
    model="nomic-embed-text:latest",
    base_url="http://localhost:11434",  # Ollama默认端口
    temperature=0,  # 温度参数对嵌入模型无效,保持0即可
    # 模型特有参数 (参考官方文档)
    model_kwargs={
        "embedding_mode": "classic",  # classic|new
        "ntokens": 2048               # 上下文长度
    }
)

# 加载已有的FAISS索引库 (必须使用相同嵌入模型创建)
vector_db = FAISS.load_local(
    folder_path="./faiss_nomic",
    embeddings=nomic_embeddings,  # 必须与原索引的嵌入模型一致
    allow_dangerous_deserialization=True  # 安全反序列化开关
)

# 创建检索器配置
retriever = vector_db.as_retriever(
    search_type="mmr",          # mmr: 平衡相关性与多样性
    search_kwargs={
        "k": 5,                  # 返回前5个结果
        "lambda_mult": 0.2,      # MMR调节参数 (0: 纯相关性, 1: 纯多样性)
        #"filter": {              # 元数据过滤 (与原文档架构匹配)
        #    "source": "年度技术报告.pdf"
        #}
    }
)

# 打印向量数据库中的分块信息
print("向量数据库中的分块信息:")
for i, doc in enumerate(vector_db.docstore._dict.values()):
    print(f"分块 {i + 1} 内容:")
    print(doc.page_content)
    print(f"分块 {i + 1} 元数据:{doc.metadata}")
    print("-" * 50)

五.  通过LangServe将LangChain发布为Restful接口

1. 安装依赖:

pip install "langserve[all]"

2. 将使用本地Ollama安装的模型的服务发布为Restful接口

以编写一个主题的笑话为例:

from langchain.llms.base import LLM
from typing import Optional, List, Mapping, Any
import requests
import json
from fastapi import FastAPI
from langchain.prompts import PromptTemplate
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatAnthropic, ChatOpenAI
from langserve import add_routes
from langchain.chains import LLMChain
from pydantic import BaseModel

app = FastAPI(
    title="LangChain Server",
    version="1.0",
    description="A simple api server using Langchain's Runnable interfaces",
)
class OllamaLLM(LLM):
    model: str = "deepseek-r1:7b"  # 默认模型
    temperature: float = 0.7
    max_tokens: int = 256
    endpoint: str = "http://localhost:11434"  # Ollama API 地址

    def _call(self, prompt: str, stop: Optional[List[str]] = None,run_manager=None) -> str:
        headers = {"Content-Type": "application/json"}
        payload = {
            "model": self.model,
            "prompt": prompt,
            "temperature": self.temperature,
            "max_length": self.max_tokens,
            "stop": stop  # Ollama 支持 stop 参数
        }

        response = requests.post(
            f"{self.endpoint}/api/generate",
            headers=headers,
            json=payload,
            stream=True  # 支持流式响应
        )

        # 处理流式响应(可选,LangChain 支持流式)
        if response.status_code == 200:
            full_response = ""
            for chunk in response.iter_lines():
                if chunk:
                    data = json.loads(chunk.decode())
                    if "response" in data:
                        full_response += data["response"]
                    # 如果支持流式响应并需要回调,可以在这里调用 run_manager
                    if run_manager:
                        run_manager.on_llm_new_token(data["response"])
            return full_response
        else:
            raise Exception(f"Ollama API 错误:{response.status_code}")

    @property
    def _llm_type(self) -> str:
        return "ollama"



ollama_llm = OllamaLLM(model="deepseek-r1:7b", temperature=0.5, max_tokens=500)

# 定义输入模型
class JokeInput(BaseModel):
    topic: str

# 定义提示模板
prompt = PromptTemplate(
    input_variables=["topic"],
    template="请给我讲一个关于 {topic} 的笑话。"
)
#prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")

# 创建 LLMChain 实例
chain = LLMChain(llm=ollama_llm, prompt=prompt)

add_routes(
    app,
    chain,
    path="/joke",
    input_type=JokeInput
)


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="*", port=8000)

3: 通过LangServe Playground体验:

http://ip:port/joke/playground/

4. 使用curl命令测试Restful接口,注意其中的地址使用/joke/invoke:

curl -X POST -H "Content-Type: application/json" -d '{"input": {"topic": "猫"}}' http://localhost:8000/joke/invoke

### 关于 LangChain开发教程、示例和项目 LangChain 是一种用于构建基于大型语言模型的应用程序的框架,它提供了一系列工具来简化复杂任务的实现过程。以下是有关 LangChain 开发的内容总结: #### 1. **LangChain 中文文档** LangChain 的中文文档由社区维护,旨在为国内开发者提供更多便利的学习资源[^1]。该文档涵盖了从基础概念到高级功能的各种主题,并提供了详细的安装指南以及核心模块说明。 访问地址如下: ```plaintext https://gitcode.com/gh_mirrors/la/langchainzh ``` #### 2. **智能文档问答系统的构建** 通过 LangChain 构建智能文档问答系统是一项常见的应用场景。这种系统可以解析并理解指定文档内容,进而回答与之相关的问题[^2]。具体流程包括以下几个方面: - 使用 `Document Loaders` 加载不同类型的文件(PDF、TXT 等)。 - 应用文本分割器 (`Text Splitter`) 将长篇幅内容划分为更易于管理的小片段。 - 利用嵌入模型 (Embedding Model) 和向量存储库(如 Chroma 或 Pinecone),创建语义索引以便快速检索相似内容。 下面展示了一个简单的 Python 实现案例: ```python from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chains.question_answering import load_qa_chain from langchain.llms import OpenAI # 步骤一:加载数据源 loader = TextLoader('./data/sample.txt') documents = loader.load() # 步骤二:切割文本 text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) # 步骤三:生成嵌入并向量化 embeddings = OpenAIEmbeddings() docsearch = Chroma.from_texts([t.page_content for t in texts], embeddings).as_retriever() # 步骤四:加载 QA 链接 llm = OpenAI(temperature=0) qa_chain = load_qa_chain(llm, chain_type="stuff") query = "请解释一下本文的核心观点是什么?" docs = docsearch.search(query) response = qa_chain.run(input_documents=docs, question=query) print(response) ``` 上述脚本演示了如何利用 LangChain 完成基本的 Q&A 功能。 #### 3. **RAG 方法论下的文档处理技术** 在自然语言处理领域中,“Retrieval-Augmented Generation”(简称 RAG)是一种结合信息检索与生成式方法的技术路线[^3]。为了支持这一模式,LangChain 提供了一些实用组件,比如多种格式的支持(HTML、Markdown)、自定义化预处理器等。 例如,在实际操作过程中可能涉及以下环节: - 转换原始 HTML 页面至纯文本形式; - 对超大规模文章实施分段策略以优化性能表现。 这些特性使得开发者能够更加灵活地应对各种业务需求场景。 #### 4. **全面的大规模模型应用指导材料** 除了官方提供的详尽手册外,还有许多第三方整理出来的优质学习素材可供参考[^4]。其中包括但不限于: - 思维导图梳理知识点结构; - 推荐书单深入探讨理论背景; - 录制好的教学录像直观呈现实践技巧; 它们共同构成了一个完整的知识体系架构,有助于初学者迅速上手同时也能满足资深工程师进一步探索的需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyzcto

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值