Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Mencipta Ejen RAG Tempatan dengan Ollama dan LangChain

Cara Mencipta Ejen RAG Tempatan dengan Ollama dan LangChain

王林
王林asal
2024-08-14 10:31:13927semak imbas

How to Create a Local RAG Agent with Ollama and LangChain

Apakah RAG?

RAG adalah singkatan kepada Retrieval-Augmented Generation, teknik berkuasa yang direka untuk meningkatkan prestasi model bahasa besar (LLM) dengan menyediakannya konteks khusus dan relevan dalam bentuk dokumen. Tidak seperti LLM tradisional yang menjana respons semata-mata berdasarkan pengetahuan pra-latihan mereka, RAG membolehkan anda menyelaraskan output model dengan lebih dekat dengan hasil yang anda inginkan dengan mendapatkan dan menggunakan data masa nyata atau maklumat khusus domain.

RAG lwn Penalaan Halus

Walaupun kedua-dua RAG dan penalaan halus bertujuan untuk meningkatkan prestasi LLM, RAG selalunya merupakan kaedah yang lebih cekap dan mesra sumber. Penalaan halus melibatkan latihan semula model pada set data khusus, yang memerlukan sumber pengiraan, masa dan kepakaran yang signifikan. RAG, sebaliknya, mengambil semula maklumat yang berkaitan secara dinamik dan memasukkannya ke dalam proses penjanaan, membolehkan penyesuaian yang lebih fleksibel dan menjimatkan kos kepada tugas baharu tanpa latihan semula yang meluas.

Membina Agen RAG

Memasang Keperluan

Pasang Ollama

Ollama menyediakan infrastruktur bahagian belakang yang diperlukan untuk menjalankan LLaMA secara tempatan. Untuk bermula, pergi ke tapak web Ollama dan muat turun aplikasi. Ikut arahan untuk menyediakannya pada mesin tempatan anda.

Pasang Keperluan LangChain

LangChain ialah rangka kerja Python yang direka untuk berfungsi dengan pelbagai LLM dan pangkalan data vektor, menjadikannya sesuai untuk membina ejen RAG. Pasang LangChain dan kebergantungannya dengan menjalankan arahan berikut:

pip install langchain

Mengekodkan Ejen RAG

Buat Fungsi API

Pertama, anda memerlukan fungsi untuk berinteraksi dengan tika LLaMA tempatan anda. Begini cara anda boleh menyediakannya:

from requests import post as rpost

def call_llama(prompt):
    headers = {"Content-Type": "application/json"}
    payload = {
        "model": "llama3.1",
        "prompt": prompt,
        "stream": False,
    }

    response = rpost(
        "http://localhost:11434/api/generate",
        headers=headers,
        json=payload
    )
    return response.json()["response"]

Buat LLM LangChain

Seterusnya, integrasikan fungsi ini ke dalam kelas LLM tersuai dalam LangChain:

from langchain_core.language_models.llms import LLM

class LLaMa(LLM):
    def _call(self, prompt, **kwargs):
        return call_llama(prompt)

    @property
    def _llm_type(self):
        return "llama-3.1-8b"

Mengintegrasikan Ejen RAG

Menyediakan Retriever

Retriever bertanggungjawab untuk mengambil dokumen yang berkaitan berdasarkan pertanyaan pengguna. Begini cara untuk menyediakannya menggunakan FAISS untuk storan vektor dan pembenaman pra-latihan HuggingFace:

from langchain.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings

documents = [
    {"content": "What is your return policy? ..."},
    {"content": "How long does shipping take? ..."},
    # Add more documents as needed
]

texts = [doc["content"] for doc in documents]

retriever = FAISS.from_texts(
    texts,
    HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
).as_retriever(k=5)

Cipta Templat Prompt

Tentukan templat gesaan yang akan digunakan ejen RAG untuk menjana respons berdasarkan dokumen yang diambil:

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

faq_template = """
You are a chat agent for my E-Commerce Company. As a chat agent, it is your duty to help the human with their inquiry and make them a happy customer.

Help them, using the following context:
<context>
{context}
</context>
"""

faq_prompt = ChatPromptTemplate.from_messages([
    ("system", faq_template),
    MessagesPlaceholder("messages")
])

Buat Rantaian Dokumen dan Retriever

Gabungkan pengambilan dokumen dan penjanaan LLaMA ke dalam rantaian yang padu:

from langchain.chains.combine_documents import create_stuff_documents_chain

document_chain = create_stuff_documents_chain(LLaMa(), faq_prompt)

def parse_retriever_input(params):
    return params["messages"][-1].content

retrieval_chain = RunnablePassthrough.assign(
    context=parse_retriever_input | retriever
).assign(answer=document_chain)

Mulakan Pelayan Ollama Anda

Sebelum menjalankan ejen RAG anda, pastikan pelayan Ollama sedang aktif dan berjalan. Mulakan pelayan dengan arahan berikut:

ollama serve

Gesa Ejen RAG Anda

Kini, anda boleh menguji ejen RAG anda dengan menghantar pertanyaan:

from langchain.schema import HumanMessage

response = retrieval_chain.invoke({
    "messages": [
        HumanMessage("I received a damaged item. I want my money back.")
    ]
})

print(response)

Jawapan:
"Saya sangat kesal mendengar bahawa anda menerima item yang rosak. Mengikut polisi kami, jika anda menerima item yang rosak, sila hubungi pasukan khidmat pelanggan kami dengan segera dengan gambar kerosakan. Kami akan mengaturkan penggantian atau bayaran balik untuk anda. Adakah anda mahu saya membantu anda mendapatkan bayaran balik? Saya memerlukan beberapa maklumat daripada anda, seperti nombor pesanan anda dan butiran tentang item yang rosak Bolehkah anda memberikannya supaya saya boleh membantu memproses permintaan anda?"


Dengan mengikuti langkah-langkah ini, anda boleh mencipta ejen RAG tempatan berfungsi sepenuhnya yang mampu meningkatkan prestasi LLM anda dengan konteks masa nyata. Persediaan ini boleh disesuaikan dengan pelbagai domain dan tugas, menjadikannya penyelesaian serba boleh untuk sebarang aplikasi yang penjanaan sedar konteks adalah penting.

Atas ialah kandungan terperinci Cara Mencipta Ejen RAG Tempatan dengan Ollama dan LangChain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn