一、概述
大模型是最近一段時(shí)間以來(lái)最熱門的技術(shù)了。過(guò)年期間我寫了一篇《使用Ollama搭建自己的簡(jiǎn)單知識(shí)庫(kù)》,點(diǎn)擊率頗高,說(shuō)明大家對(duì)大模型方面的知識(shí)還是比較關(guān)注的。特別是過(guò)年期間DeepSeek橫空出世,直接打開(kāi)了AI進(jìn)入普通人工作生活的序幕,現(xiàn)在似乎大家已經(jīng)越來(lái)越離不開(kāi)AI了。
大模型現(xiàn)在有很多,國(guó)內(nèi)也有很多可用的,并且效果非常好,如:DeepSeek,豆包,Kimi,通義千問(wèn),文心一言等等??梢匀〈鷤鹘y(tǒng)的搜索引擎功能,并且可以生成文字、圖像、視頻等等,借助于工具甚至可以實(shí)現(xiàn)PPT自動(dòng)制作,數(shù)據(jù)分析,智能人生成等等。不過(guò)我們技術(shù)人員,不光光要會(huì)用,還要知道一下大模型的原理,以及對(duì)其做一些擴(kuò)展。今天我就簡(jiǎn)單介紹一下通過(guò)langchain來(lái)實(shí)現(xiàn)大模型的訪問(wèn)。
二、大模型
大模型是一種神經(jīng)網(wǎng)絡(luò)模型,具有參數(shù)量大、訓(xùn)練數(shù)據(jù)量大、計(jì)算能力要求高、泛化能力強(qiáng)、應(yīng)用廣泛等特點(diǎn)。與傳統(tǒng)人工智能模型相比,大模型在參數(shù)規(guī)模上涵蓋十億級(jí)、百億級(jí)、千億級(jí)等,遠(yuǎn)遠(yuǎn)超過(guò)傳統(tǒng)模型百萬(wàn)級(jí)、千萬(wàn)級(jí)的參數(shù)規(guī)模。不同于傳統(tǒng)人工智能模型通過(guò)一定量的標(biāo)注數(shù)據(jù)進(jìn)行訓(xùn)練,一個(gè)性能良好的大模型通過(guò)海量數(shù)據(jù)及設(shè)計(jì)良好、內(nèi)容多樣的高質(zhì)量標(biāo)注語(yǔ)料庫(kù)進(jìn)行訓(xùn)練。同時(shí),大模型也很難在單個(gè)GPU(GraphicsProcessing Unit,圖形處理器)上進(jìn)行預(yù)訓(xùn)練,需要使用DeepSpeed、Megatron-LM等訓(xùn)練優(yōu)化技術(shù)在集群中進(jìn)行分布式訓(xùn)練。其核心思想是通過(guò)大規(guī)模的無(wú)監(jiān)督訓(xùn)練學(xué)習(xí)自然語(yǔ)言的模式和結(jié)構(gòu),在一定程度上模擬人類的語(yǔ)言認(rèn)知和生成過(guò)程。大模型的典型代表包括 GPT 系列(如 GPT-4)、PaLM、LLaMA、BERT、Stable Diffusion、MidJourney 等,覆蓋自然語(yǔ)言處理(NLP)、計(jì)算機(jī)視覺(jué)(CV)及多模態(tài)(文本 + 圖像 / 語(yǔ)音等)領(lǐng)域。目前在教育、醫(yī)療、金融、電商與零售、科研與工程等都有廣泛的應(yīng)用。下圖是大模型技術(shù)的發(fā)展歷程:

三、通過(guò)langchain訪問(wèn)大模型
langchain 是一個(gè)開(kāi)源的 LLM 應(yīng)用開(kāi)發(fā)框架,專注于解決 “如何將大語(yǔ)言模型(如 GPT-4、LLaMA、Claude 等)與外部資源(數(shù)據(jù)、工具、API)結(jié)合,構(gòu)建復(fù)雜交互式應(yīng)用” 的問(wèn)題。它通過(guò)模塊化設(shè)計(jì),讓開(kāi)發(fā)者無(wú)需從頭實(shí)現(xiàn)底層邏輯,快速搭建具有 記憶能力、工具調(diào)用、多步推理 的智能應(yīng)用。
langchain可以標(biāo)準(zhǔn)化提示詞的構(gòu)建流程,支持動(dòng)態(tài)填充變量、模板化設(shè)計(jì),提升大模型的輸出質(zhì)量,還允許大模型調(diào)用外部工具獲取實(shí)時(shí)數(shù)據(jù)或執(zhí)行操作,彌補(bǔ)自身知識(shí)局限。langchain可以定義多個(gè)步驟的固定流程,適用于結(jié)構(gòu)化任務(wù)。也可以支持增強(qiáng)檢索生成(RAG)和Agent(智能體)開(kāi)發(fā)。
下面我用三個(gè)簡(jiǎn)單的例子說(shuō)明一下langchain的使用。
1.直接訪問(wèn)大模型獲得結(jié)果
使用langchain直接訪問(wèn)大模型,設(shè)置提示詞,得到返回結(jié)果。
注:我在本地部署了Ollama框架,并在其上部署了deepseek-r1:7b和deepseek-r1:32b以及qwen模型。
from langchain_ollama.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()
# 設(shè)置大模型
llm = ChatOllama(model="deepseek-r1:7b", temperature=0.1)
# 設(shè)置提示詞
prompt = ChatPromptTemplate.from_messages([
("system", "You are world class technical documentation writer."),
("user", "{input}")
])
# 構(gòu)建工作鏈
chain = prompt | llm | output_parser
# 調(diào)用
print(chain.invoke({"input": "What is the capital of France?"}))
返回的結(jié)果如下:
<think>
Okay, so I need to figure out what the capital of France is. Hmm, I remember learning a bit about countries and their capitals in school, but let me try to recall more accurately.
... ...
</think>
The capital of France is Paris. It is renowned for its iconic landmarks such as the Eiffel Tower, Louvre Museum, and Notre-Dame Cathedral. Paris also houses significant government institutions like the Elysée Palace where
the President resides, and it is a hub for international events and meetings.
由于deepseek-r1是推理模型,所以它的返回是帶有推理過(guò)程的,由<think></think>包裹。
2.使用langchain結(jié)合web查詢數(shù)據(jù)獲取大模型返回結(jié)果
langchain不光可以直接訪問(wèn)大模型,還可以從web獲取最新的知識(shí),并和用戶問(wèn)題一起構(gòu)建成完整的提示詞,輸入到大模型,從而得到更準(zhǔn)確的返回結(jié)果。我們?cè)贒eepSeek等大模型界面里面看到的“聯(lián)網(wǎng)搜索”,做的事其實(shí)就是類似的。

from langchain_ollama.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.chains.combine_documents import create_stuff_documents_chain
output_parser = StrOutputParser()
llm = ChatOllama(model="qwen", temperature=0.1)
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:
<context>
{context}
</context>
Question: {input}""")
document_chain = create_stuff_documents_chain(llm, prompt)
################# 從網(wǎng)頁(yè)中獲取文檔內(nèi)容
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://zrzy.jiangsu.gov.cn/xwzx/sbyq/2025/02/05151523141440.html")
docs = loader.load()
print(
document_chain.invoke({
"input": "古樹(shù)名木保護(hù)條例規(guī)定了哪些內(nèi)容?",
"context": docs
})
)
這次我使用的本地的qwen大模型,該模型不是推理模型,所以沒(méi)有推理過(guò)程。我首先從網(wǎng)站上獲取新聞信息,然后把web上的新聞內(nèi)容作為大模型上下文,跟用戶問(wèn)題拼接成完整的提示詞,通過(guò)工作鏈提交給大模型,讓它返回我需要的內(nèi)容,返回結(jié)果如下:

《古樹(shù)名木保護(hù)條例》共30條,主要規(guī)定了以下內(nèi)容:
1. 總體要求:規(guī)定古樹(shù)名木保護(hù)管理工作堅(jiān)持中國(guó)共產(chǎn)黨的領(lǐng)導(dǎo),堅(jiān)持保護(hù)第一、合理利用、分級(jí)管理的原則,構(gòu)建政府主導(dǎo)、屬地負(fù)責(zé)、社會(huì)參與的工作機(jī)制。
2. 分級(jí)分類認(rèn)定公布:科學(xué)界定和劃分古樹(shù)名木的保護(hù)等級(jí),明確古樹(shù)名木普查、認(rèn)定、公布程序,規(guī)定縣級(jí)以上地方人民政府古樹(shù)名木主管部門根據(jù)調(diào)查結(jié)果認(rèn)定古樹(shù)名木,報(bào)本級(jí)人民政府批準(zhǔn)后依法公布。
3. 加強(qiáng)日常養(yǎng)護(hù)管理:規(guī)定縣級(jí)人民政府古樹(shù)名木主管部門應(yīng)當(dāng)按照有利于加強(qiáng)古樹(shù)名木日常養(yǎng)護(hù)的原則,明確有關(guān)單位、個(gè)人作為古樹(shù)名木的日常養(yǎng)護(hù)責(zé)任人;日常養(yǎng)護(hù)責(zé)任人應(yīng)當(dāng)嚴(yán)格履行養(yǎng)護(hù)義務(wù),制止損害古樹(shù)名木及其生長(zhǎng)環(huán)境的行為;對(duì)在古
樹(shù)名木保護(hù)管理工作中作出突出貢獻(xiàn)的單位、個(gè)人,按照國(guó)家有關(guān)規(guī)定給予表彰和獎(jiǎng)勵(lì)。
4. 嚴(yán)格限制采伐和移植:規(guī)定除搶險(xiǎn)救災(zāi)等特殊緊急情形外,禁止采伐古樹(shù)名木;依法采取應(yīng)急處置措施采伐古樹(shù)名木的,應(yīng)當(dāng)及時(shí)報(bào)告。規(guī)定古樹(shù)名木原則上實(shí)行原地保護(hù),不得移植;對(duì)于國(guó)家級(jí)、省級(jí)重點(diǎn)建設(shè)項(xiàng)目等選址確實(shí)無(wú)法避讓古樹(shù)名木,
以及古樹(shù)名木的生長(zhǎng)狀況可能危害公眾生命安全,確需移植的,規(guī)定了嚴(yán)格的審批程序。
5. 強(qiáng)化保障監(jiān)督:將古樹(shù)名木保護(hù)管理情況納入領(lǐng)導(dǎo)干部自然資源資產(chǎn)離任審計(jì);對(duì)古樹(shù)名木保護(hù)管理工作不力、問(wèn)題突出的地區(qū),規(guī)定了約談制度。
3.langchain加載本地文件內(nèi)容獲取大模型返回結(jié)果
langchain不光可以訪問(wèn)web,還可以結(jié)合本地文件內(nèi)容訪問(wèn)大模型。我們可以讀取本地的文件,作為上下文,構(gòu)建出提示詞,通過(guò)langchain來(lái)訪問(wèn)大模型,得到我們需要的返回結(jié)果。
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_ollama.chat_models import ChatOllama
from langchain_core.documents import Document
# 本地DeepSeek-r1:32b大模型
llm = ChatOllama(
model="deepseek-r1:32b",
temperature=0,
# other params...
)
prompt = ChatPromptTemplate.from_template("""Answer the following question based only on the provided context:
<context>
{context}
</context>
Question: {input},用中文回答""")
document_chain = create_stuff_documents_chain(llm, prompt)
content = ""
try:
with open('example.txt', 'r', encoding='utf-8') as file:
# 讀取文件的全部?jī)?nèi)容
content = file.read()
except FileNotFoundError:
print("文件未找到,請(qǐng)檢查文件路徑和文件名。")
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain.schema.runnable import RunnableLambda, RunnablePassthrough
from langchain.prompts import PromptTemplate
# 在線DeepSeek API(滿血版)
model = ChatOpenAI(
model='deepseek-chat',
openai_api_key='<你的API KEY>',
openai_api_base='https://api.deepseek.com',
max_tokens=1024
)
prompt_template2 = "你是一名文檔處理專家,精通閱讀理解和文字編寫,具有很高的審美水平和文字總結(jié)能力。有如下的文章{content},請(qǐng)幫我總結(jié)摘要。"
PROMPT = PromptTemplate(
template=prompt_template2,
input_variables=["content"]
)
# 在線版
chain = (
{"content": RunnablePassthrough()}
| PROMPT
| model
| StrOutputParser()
)
# 本地版
#chain = (
# {"content": RunnablePassthrough()}
# | PROMPT
# | llm
# | StrOutputParser()
#)
input_data = {
"content": content
}
# 使用 invoke 方法調(diào)用鏈
result = chain.invoke(input_data)
print(result)
這里我提供了兩種方法,一種是調(diào)用本地的deepseek-r1大模型(7b和32b),一種是訪問(wèn)在線的deepseek滿血版API。在線版的性能更強(qiáng)大,得到的結(jié)果也更好。我這里在example.txt中放入了小說(shuō)《盜墓筆記1七星魯王宮》的第二章,讓大模型幫我總結(jié)一下摘要。輸出如下:
使用deepseek-r1:7b
<think>
好的,我現(xiàn)在需要幫用戶總結(jié)一個(gè)比較長(zhǎng)的文檔內(nèi)容。首先,我得通讀整個(gè)文檔,了解整體情節(jié)和關(guān)鍵點(diǎn)。
文檔講的是一個(gè)盜墓賊三叔的故事,他從古玩市場(chǎng)轉(zhuǎn)行做盜墓,后來(lái)因?yàn)槟挲g大了,決定退休,但又忍不住出來(lái)倒手。過(guò)程中涉及到一些暗語(yǔ)、交易細(xì)節(jié)以及人物關(guān)系。用戶希望我將這段內(nèi)容進(jìn)行摘要,所以我要抓住主要情節(jié)和人物發(fā)展。
首先,故事的主角是三叔,他在盜墓行業(yè)有多年的經(jīng)驗(yàn),現(xiàn)在開(kāi)始慢慢退休,但依然活躍在古玩市場(chǎng)。接著,他收到了一條短信,里面提到有新貨到杭州,還有一條關(guān)于龍脊背的好東西。三叔對(duì)此很感興趣,并決定去查看情況。
在到達(dá)現(xiàn)場(chǎng)時(shí),遇到了一些問(wèn)題,比如被交警攔下,導(dǎo)致晚點(diǎn),這可能影響了他的計(jì)劃。然后,他發(fā)現(xiàn)年輕人背著一個(gè)樟木盒子,里面可能是寶劍或龍脊背的藏品。三叔確認(rèn)后,覺(jué)得這是好東西,但因?yàn)闀r(shí)間關(guān)系,決定讓年輕人幫忙收錢。
之后,三叔提到有金牙老頭,可能涉及倒賣文物的事情,還有一張地圖,暗示了藏品的位置或其他重要信息。整個(gè)過(guò)程中,人物之間的互動(dòng)和暗語(yǔ)是關(guān)鍵點(diǎn),需要在摘要中體現(xiàn)出來(lái)。
接下來(lái),我需要將這些要點(diǎn)濃縮成一個(gè)簡(jiǎn)潔的摘要,確保涵蓋主要情節(jié)、人物發(fā)展以及關(guān)鍵事件,同時(shí)保持邏輯連貫。
</think>
故事講述了一位盜墓賊三叔從古玩市場(chǎng)轉(zhuǎn)向盜墓行業(yè),并逐漸退休但仍活躍于古玩市場(chǎng)的經(jīng)歷。三叔在一次交易中接到了兩條短信,一條提到杭州有新貨到貨,另一條則指出有一件價(jià)值非凡的龍脊背藏品。他決定前往查看情況,但在途中被交警攔下,導(dǎo)
致晚點(diǎn)。隨后,他在年輕人的樟木盒中發(fā)現(xiàn)可能含有龍脊背的寶劍或刀具,并確認(rèn)了藏品的真實(shí)性。
三叔對(duì)藏品表現(xiàn)出濃厚興趣,但因時(shí)間關(guān)系未能及時(shí)收貨。與此同時(shí),他提到有“北京來(lái)的金牙”涉及文物倒賣事件,并指出藏品可能與山西某墓有關(guān)。三叔還表示年輕人可能平時(shí)接受過(guò)他的教導(dǎo),對(duì)此感到不滿。最終,三叔決定讓年輕人幫忙收錢,并對(duì)
藏品的背景和位置表現(xiàn)出興趣。
整個(gè)故事通過(guò)暗語(yǔ)和人物互動(dòng)展現(xiàn)了三叔在古玩市場(chǎng)的活躍以及他逐漸退休后但仍活躍于盜墓行業(yè)的復(fù)雜性。
使用deepseek-r1:32b
<think>
好的,我現(xiàn)在需要幫用戶總結(jié)一個(gè)文檔的摘要。首先,我得仔細(xì)閱讀用戶提供的文本內(nèi)容,理解其中的主要情節(jié)和關(guān)鍵點(diǎn)。
看起來(lái)這個(gè)故事主要圍繞盜墓和古玩交易展開(kāi),涉及多個(gè)角色,比如“我”、三叔、金牙老頭等。故事開(kāi)始于“我”在店里遇到一位金牙老人,他可能是在刺探情報(bào)。接著,“我”收到三叔的短信,提到有新貨到,特別是提到了“龍脊背”,這似乎是指有價(jià)值的
寶物。
然后,“我”趕往三叔那里,但因?yàn)榻煌▎?wèn)題遲到了,結(jié)果好東西已經(jīng)被賣掉。不過(guò),三叔讓“我”幫忙收錢,并且在喝酒時(shí)聊起了金牙老人的事情。三叔提到北京的金牙和摸金賊最近在山西有動(dòng)作,可能與帛書(shū)有關(guān)。
最后,“我”打印了數(shù)碼相機(jī)里的帛書(shū)給三叔看,三叔回應(yīng)說(shuō)這是一張地圖,暗示背后可能隱藏著更大的秘密或危險(xiǎn)。
總結(jié)時(shí),我需要抓住這些關(guān)鍵點(diǎn):盜墓、古玩交易、角色之間的聯(lián)系、神秘的帛書(shū)以及潛在的危險(xiǎn)。同時(shí),要保持摘要簡(jiǎn)潔明了,突出故事的主要情節(jié)和轉(zhuǎn)折點(diǎn)。
</think>
這段文字描述了一個(gè)與盜墓、古玩交易相關(guān)的故事片段,主要圍繞主人公“我”和三叔的活動(dòng)展開(kāi)。以下是主要內(nèi)容的總結(jié):
1. **金牙老頭的刺探**:一位北京來(lái)的金牙老人來(lái)到店里,試圖刺探情報(bào),可能與近期山西某寶穴被盜有關(guān)。
2. **三叔回憶與線索**:三叔提到近年來(lái)有囂張的摸金賊活動(dòng),尤其是北京的金牙銷貨頻繁,暗示近期山西墓葬可能被倒出大量寶貝。
3. **帛書(shū)地圖的發(fā)現(xiàn)**:“我”將數(shù)碼相機(jī)中拍到的帛書(shū)打印出來(lái)給三叔看,三叔回應(yīng)這是一張地圖,并指出“我”平時(shí)不認(rèn)真學(xué)習(xí)古玩知識(shí)。
4. **潛在危險(xiǎn)與秘密**:三叔對(duì)帛書(shū)表現(xiàn)出異常關(guān)注,暗示這張地圖可能隱藏著重大秘密或危險(xiǎn)。
整個(gè)故事充滿了盜墓、古玩交易的神秘色彩,同時(shí)揭示了主人公所處環(huán)境的復(fù)雜性和潛在風(fēng)險(xiǎn)。
使用deepseek滿血版web api
**摘要:**
主人公在河坊街西泠社的古玩店中遇到一位神秘的金牙老頭,對(duì)方以老癢(一個(gè)已入獄的熟人)的名義前來(lái)打聽(tīng)?wèi)?zhàn)國(guó)帛書(shū)拓本。金牙老頭聲稱自己手上有相關(guān)線索,但主人公懷疑其動(dòng)機(jī),敷衍應(yīng)對(duì)。交談中,金牙老頭透露對(duì)主人公爺爺(長(zhǎng)沙著名盜墓賊
“狗王”)的過(guò)去有所了解,并試圖獲取帛書(shū)信息,但主人公警覺(jué)地將其趕走,僅留下一份帛書(shū)復(fù)印件。
事后,主人公發(fā)現(xiàn)復(fù)印件上有一個(gè)詭異的狐貍?cè)四槇D案,意識(shí)到其價(jià)值,拍照留存。通過(guò)回憶,他簡(jiǎn)述了爺爺作為南派盜墓賊(土夫子)的背景,以及南北派盜墓的差異。當(dāng)晚,主人公收到三叔(家族中仍在從事盜墓的成員)的短信,稱有珍貴文物“龍
脊背”到貨,但等他趕到時(shí)已被他人買走。交談中,主人公提及金牙老頭之事,三叔認(rèn)出對(duì)方可能是北京著名的盜墓銷贓人,并發(fā)現(xiàn)帛書(shū)復(fù)印件實(shí)為一張隱秘的地圖,暗示其中可能隱藏重大秘密。
**核心要點(diǎn):**
1. **神秘訪客**:金牙老頭以老癢為引,試探主人公家族與戰(zhàn)國(guó)帛書(shū)的關(guān)聯(lián),意圖不明。
2. **家族背景**:主人公爺爺是長(zhǎng)沙南派盜墓傳奇人物“狗王”,曾盜取戰(zhàn)國(guó)帛書(shū)但被美國(guó)人騙走。
3. **帛書(shū)線索**:金牙留下的復(fù)印件暗藏玄機(jī),后被三叔解讀為一張地圖,可能指向古墓或?qū)毑亍?
4. **三叔的提示**:三叔暗示金牙老頭背后涉及北京盜墓團(tuán)伙,帛書(shū)或與山西新盜墓穴有關(guān)。
5. **南北派之爭(zhēng)**:插敘盜墓行業(yè)的南北派系分歧及爺爺?shù)慕匚?,為故事增添歷史縱深。
**懸念鋪墊:** 帛書(shū)地圖的真相、金牙老頭的真實(shí)目的、三叔與盜墓團(tuán)伙的潛在沖突,為后續(xù)劇情發(fā)展埋下伏筆。
有沒(méi)有發(fā)現(xiàn)一個(gè)比一個(gè)更厲害,deepseek-r1:7b只看到了三叔的事情,沒(méi)有提到金牙的事情,deepseek-r1:32b,主體內(nèi)容已經(jīng)比較正確了,deepseek滿血版web api把主要內(nèi)容摘要以及核心要點(diǎn)和懸念鋪墊全部都?xì)w納出來(lái)了,明顯是效果最好的。
四、總結(jié)
可以看到,我們通過(guò)langchain可以訪問(wèn)本地大模型以及遠(yuǎn)程大模型的API,同時(shí)還可以結(jié)合web數(shù)據(jù)和本地?cái)?shù)據(jù)構(gòu)建完整提示詞輸入給大模型,以得到更好的回答效果。下一篇文章,我會(huì)介紹一下使用增強(qiáng)檢索生成(RAG)技術(shù)來(lái)提升大模型的能力,定制化實(shí)現(xiàn)高效的查詢。