187 уншилтууд

Revisiting LangChain4J 6 сарын дараа

by Nicolas Fränkel11m2025/05/01
Read on Terminal Reader

Хэтэрхий урт; Унших

Энэ нийтлэл нь MCP сервер нь LangChain4J-ийн апп-ийн интеграцид төвлөрөг. Документацид нь тохиргоог хялбар байдаг боловч хэд хэдэн давуу тал байдаг.
featured image - Revisiting LangChain4J 6 сарын дараа
Nicolas Fränkel HackerNoon profile picture

Өнгөрсөн жил,Би бодож байлгарч эхэлсэнӨнгөрсөнХавтгай 4J. Энэ нь хурдан өсөлтийн төсөл юм, би шинэчлэлийг мэдэгдэхыг хүссэн. Би LangChain4J-д Model Context Protocol серверг интегрийг хэрхэн шалгана уу.

1 Бета хувилбар

Би хамгийн сүүлийн үеийн бичлэгийг 2024-ийн Арванхоёрдугаар сард бичсэн бөгөөд энэ үед боломжтой хамгийн сүүлийн үеийн хувилбар, v0.35-ийг ашиглаж байна. LangChain4J-ийг 1.0-ийг эхлүүлсэн.

Date

Release

September 25th, 2024

0.35.0

December 22th, 2024

1.0.0-alpha1

February 10th, 2025

1.0.0-beta1

March 13th, 2025

1.0.0-beta2

April 12th, 2025

1.0.0-beta3

Есдүгээр 25, 2024

Нийтэлсэн

Арванхоёрдугаар сар 22, 2024

1.0.0-альфа 1

Арванхоёрдугаар сар 10, 2025

1.0.0-Бет 1

Арваннэгдүгээр 13, 2025

1.0.0-Бетэ2

Аравдугаар сар 12, 2025

1.0.0-бета3 нь


LangChain4J дараахӨнгөрсөн. Хэрэглэгчид энэ үйл явцыг ашигласан бөгөөд ялангуяа өөрчлөлтийг танилцуулахын тулд. Миний тохиолдолд API-ийн өөрчлөлтийг хуваалцахын тулд миний кодыг шинэчлэх хэрэгтэй.

v0.35

v1.0.0-beta3

val s = Sinks.many()
.unicast()
.onBackpressureBuffer<String>()
chatBot.talk(m.sessionId, m.text)
.onNext(s::tryEmitNext)
.onError(s::tryEmitError)
.onComplete {
s.tryEmitComplete()
}.start()
return ServerResponse.ok().bodyAndAwait(
s.asFlux().asFlow()
)

val s = Sinks.many()
.unicast()
.onBackpressureBuffer<String>()
chatBot.talk(m.sessionId, m.text)
.onPartialResponse(s::tryEmitNext)
.onError(s::tryEmitError)
.onCompleteResponse {
s.tryEmitComplete()
}.start()
return ServerResponse.ok().bodyAndAwait(
s.asFlux().asFlow()
)

Тавтай морилно уу (
.Хувцаслалт()
.onBackpressureBuffer<String>()
chatBot.talk(m.sessionId, m.text)
.onДэлгэрэнгүй(s::tryEmitДэлгэрэнгүй)
.onError(s::TryEmitЭрүүлэгЭрүүлэг)
Бүртгүүлэх
Эдүүлбэр (
0 0 0 0
Тавтай морилно уу (
Тавтай морилно уу
)

Тавтай морилно уу (
.Хувцаслалт()
.onBackpressureBuffer<String>()
chatBot.talk(m.sessionId, m.text)
.onХуувцаслалтХувцаслалт(s::tryEmitNext)
.onError(s::TryEmitЭрүүлэгЭрүүлэг)
.onCompleteResponse {
Эдүүлбэр (
0 0 0 0
Тавтай морилно уу (
Тавтай морилно уу
)

Проект Reactor Integration

LangChain4J нь Project Reactor-ийн интеграцийг санал болгож байна; Би өмнөх хуваалцах үед энэ нь хязгаарлагддаг. Kotlin-ийн коррутин нь энэ нь код нь хялбардагa lot.

Би ашиглаж байнаAiServices, Тиймээс би өмнө LangChain4J-ийн интерфэйс Runtime-д имплементийг тодорхойлосон байна:


interface ChatBot {
    fun talk(@MemoryId sessionId: String, @UserMessage message: String): TokenStream
}


Бид дараах занжуулалтыг нэмнэ үү:


<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-reactor</artifactId>
    <version>1.0.0-beta3</version>
</dependency>


Одоо бид returning төрөл нь аFlux<String>АTokenStream. Энд шинэчлэгдсэн бүртгэл юм:


interface ChatBot {
    fun talk(@MemoryId sessionId: String, @UserMessage message: String): Flux<String>
}


Энэ нь үүсгэхийн тулдsinkҮүнээс гадна хязгааргүй. Бид дараах хэлбэрээр кодыг хялбарч болно:


val flux = chatBot.talk(m.sessionId, m.text)
ServerResponse.ok().bodyAndAwait(flux.asFlow())


Өнгөрсөн хоёр хоногийн debugging нь документыг уншихын тулд танд 2 цаг байлгах болно! Би эцсийн хийхгүй байна.

Model Context Protocol Server-ийг суулгах

Энэ хэсэгт, би <abbr title="Model Context Protocol">MCP</abbr> миний LangChain4J хэрэглээнд нэгтгэхийг хүсэж байна.

Өнгөрсөн Generation Retrieval

One needs a lot and a lot of resources to train a <abbr title="Large Language Model">LLM</abbr>: Энэ нь шууд цаг, мөнгө болгон хуваалцаж байна. Энэ шалтгаан нь компаниуд шинэ загварын хуваалцаж хязгаарлагдмал байна. Модел нь ач холбогдол нь цаг хугацааны харьцуулахад багасгах, мэдээлэл нь өөрчлөгдөж, LLM-ийн мэдээллийн сан нь байнгын байна. Үүнээс гадна, LLM-ийг албан ёсны өгөгдлийн талаар боловсруулсан байна – байнгын, хамгийн их компаниуд нь тэдний хувийн өгөгдлийг хайж хүсэж байна.


Retrieval-Augmented Generation нь дөрвөлжин үйл явц юм. Эхний аргаар, хэрэгсэл LLM дагуу өгөгдлийг анхаарах, векторын мэдээллийн санд хадгалах; Дараа нь хэрэгсэл LLM-ийг анхаарах үед өгөгдлийг нэмэлт өгөгдлийг ашигладаг.

Модель контекст протокол

LLM-ийн статик байгалийн хянах хамгийн сүүлийн үеийн арга нь MCP юм.


MCP нь програм хангамжийг LLM-ийг контекст болгон хэрхэн стандартизуулдаг нээлттэй протокол юм. MCP-ийг AI-ийн хэрэглээнд зориулсан USB-C порт болгон мэднэ үү. USB-C нь төхөөрөмжүүд нь янз бүрийн гадаргуу болон дагалдах хэрэгсэлтэй холбох стандарттай арга замыг санал болгож байна. MCP нь AI загварууд нь янз бүрийн өгөгдлийн эх үүсвэр, хэрэгсэлтэй холбох стандарттай арга замыг санал болгож байна.


-- Model Context Protocol нь эхэлнэ үү

MCP нь програм хангамжийг LLM-ийг контекст болгон хэрхэн стандартизуулдаг нээлттэй протокол юм. MCP-ийг AI-ийн хэрэглээнд зориулсан USB-C порт болгон мэднэ үү. USB-C нь төхөөрөмжүүд нь янз бүрийн гадаргуу болон дагалдах хэрэгсэлтэй холбох стандарттай арга замыг санал болгож байна. MCP нь AI загварууд нь янз бүрийн өгөгдлийн эх үүсвэр, хэрэгсэлтэй холбох стандарттай арга замыг санал болгож байна.


- - -Model Context Protocol нь эхлэх


MCP нь RAG-д хоёр ашигтай байдаг:


  • Data processed by a RAG is tailored for a model. If one wants to use a new model, one must re-execute the parsing phase. MCP standardizes the interactions between a client and a server, making them technology-independent.


  • RAG allows the reading of data. MCP allows any API call to either access data dynamically or execute actions!


MCP тодорхойлолтхоёр тээврийн альтернативКлиент-сервер холбооны талаар:


  • stdio: Клиент нь дор үйл явцыг эхлүүлсэн бөгөөд харилцаа холбоо стандарт дээр, стандарт дээр явдаг.
  • HTTP нь Server-Sent үйл явдал

Архитектур шийдэл

Үүнээс гадна тэжээлийн дараа бид одоо практик хэсэгт зориулагдсан байна. Энэ нь MCP сервер сонгоноос эхэлнэ.Эндсайн эх үүсвэр юм. Гэсэн хэдий ч, биалбан ёсны GitHub MCP серверЭнэ нь LangChain4J-ийн документуудтай байдаг.


GitHub MCP сервер ньСтадионытээвэрлэлт. Энэ нь бид бинар авах, хэрэглээнд эхлэх ёстой. Энэ нь HTTP тээвэрлэлт харьцуулахад хурдан юм, гэхдээ загваруудтай HTTP дуудлагатай нийт хугацаа, тооцооллын хугацаатай тул энэ нь чухал биш юм. Архитектур үзүүлэлтээс, би үйл явцтай тусгай компонент дуртай.


Зарим судалгааны дараа, биМэргэшсэн ProxyПроект. Энэ нь та stdio-аас HTTP эсвэл HTTP-аас stdio хооронд хуваалцах боломжийг олгодог. Энэ нь Docker зурагтай байдаг. Бид сервер болон прокси-ийг дараах хэлбэрээр нэгтгэж болноDockerfile:


FROM ghcr.io/sparfenyuk/mcp-proxy:latest

ENV VERSION=0.2.0
ENV ARCHIVE_NAME=github-mcp-server_Linux_x86_64.tar.gz

RUN wget https://github.com/github/github-mcp-server/releases/download/v$VERSION/$ARCHIVE_NAME -O /tmp/$ARCHIVE_NAME \ #1
    && tar -xzvf /tmp/$ARCHIVE_NAME -C /opt \                      #2
    && rm /tmp/$ARCHIVE_NAME                                       #3

RUN chmod +x /opt/github-mcp-server                                #4
  1. Архивууд татаж авах
  2. Экстракт
  3. Архивууд татаж авах
  4. Binary Executable хийх


Үзүүлэлт: We can't define theCMDбинар нь зөвхөн параметрүүдтэй порт, хост тохируулах боломжийг олгодог. Энэ шалтгаан нь бид runtime-д орлогог хуваалцах ёстой.docker-compose.yaml:


services:
  mcp-server:
    build:
      context: github-mcp-server
    env_file:
      - .env                                                       #1
    command:
      - --pass-environment                                         #2
      - --sse-port=8080                                            #3
      - --sse-host=0.0.0.0                                         #4
      - --                                                         #5
      - /opt/github-mcp-server                                     #6
      - --toolsets
      - all
      - stdio
  1. Бид GITHUB_PERSONAL_ACCESS_TOKEN байлгахын тулд GitHub-д баталгаажуулахын тулд үр дүнтэй токентэй байлгах хэрэгтэй
  2. Бүх байгаль орчны хувилбар нь субпроцесс руу дамжуулах
  3. Шууд порт тохируулах
  4. Ямар ч IP
  5. Прокси нь dash-ийн дараа stdio MCP сервертэй холбогдсон
  6. Үйлчилгээний сервер нь бүх боломжуудыг идэвхжүүлэх


Фото зураг нь/sseпорт 8080 дээр

Загварын шийдэл

кодлох хэсэг нь хамгийн хялбар юм.LangChain4J MCP-ийн документациболон дараах. төсөлд энэ нь дараах хэлбэрээр хуваалцах болно:


bean {
    val transport = HttpMcpTransport.Builder()
        .sseUrl(ref<ApplicationProperties>().mcp.url)              //1
        .logRequests(true)                                         //2
        .logResponses(true)                                        //2
        .build()
    val mcpClient = DefaultMcpClient.Builder()
        .transport(transport)
        .build()
    mcpClient.listTools().forEach { println(it) }                  //3
    McpToolProvider.builder()
        .mcpClients(listOf(mcpClient))
        .build()
}
bean {
    coRouter {
        val chatBot = AiServices
            .builder(ChatBot::class.java)
            .streamingChatLanguageModel(ref<StreamingChatLanguageModel>())
            .chatMemoryProvider { MessageWindowChatMemory.withMaxMessages(40) }
            .contentRetriever(EmbeddingStoreContentRetriever.from(ref<EmbeddingStore<TextSegment>>()))
            .toolProvider(ref<McpToolProvider>())                  //4
            .build()
        POST("/")(PromptHandler(chatBot)::handle)
    }
}
  1. Би ConfigurationProperty класс SSE URL-ийг параметрийг нэмсэн
  2. MCP протокол нь логтыг клиент руу дамжуулах арга юм.
  3. Хязгааргүй биш, гэхдээ энэ нь клиент нь сервертэй холбогдсон бөгөөд санал болгож буй хэрэгслүүд жагсаалцах боломжтой юм.
  4. AiServices дээр дээр үүсгэсэн MCP хэрэгсэл нийлүүлэгчдэд холбох


Энэ үед загварын MCP сервер нь бүртгэгдсэн хэрэгслүүдийн ямар ч нь харьцуулахад асуултуудыг дамжуулах ёстой.


curl -N -H 'Content-Type: application/json' localhost:8080 -d '{ "sessionId": "1", "text": "What are my top three most popular GitHub repos?" }'


Би хэд хэдэн удаа туршиж байна, би дараах хэлбэрээр асуултууд авсан:


Unfortunately, the provided text does not contain any information about your top three most popular GitHub repositories. The text appears to be a blog post or a personal website, and it mentions some of your projects and experiences with GitHub, but it does not provide any metrics or statistics on the popularity of your repositories.

If you want to know more about the popularity of your GitHub repositories, I would recommend checking out GitHub's own analytics tools, such as GitHub Insights or the Repository Insights API. These tools can provide information about the number of followers, stars, and forks for each repository, as well as other metrics like engagement and activity.


Загвар зүгээр л харьцуулагдсан хэрэгслүүд нь харьцуулахад харьцуулалттай боловч.

Хэрэглээний шийдэл

Би LangChain4J документыг хоёр удаа унших, гэхдээ ямар ч үр ашигтай. Би OpenAI болон бусад AI хэрэгслүүд нь ямар ч үр дүнтэй ашиглахын тулд туршиж байна. Ихэнх асуултууд нь энэ нь хайрцаг гарч ажиллах ёстой гэж баталсан. Зарим нь хэрэгслээр шууд зовох гэж нэрлэдэг бөгөөд энэ нь хэрэгцээг явах; нэг нь Ollama-ийн хэрэгслүүд дэмждэггүй гэж нэрлэдэг. Би Ollama-ийн блог шалгах: 2024 онд хэрэгслүүдийн дэмжлэг гэж нэрлэдэг. Би тавтай морилно уу, би юу хийж байна уу.


Зөөлөн архитектур нь илүү хөдөлгөөнт хэсгүүдийг танилцуулж байна. Би бүх дуудлага цуврал дээр ямар нэг зүйлийг хязгааргүй байж болохыг харуулж байна. Би MCP-ийн проксиг удаан,github-mcp-serverхэрэглээний зураг руу шууд, HTTP-аас stdio-д кодыг өөрчлөх. Энэ нь асуултуудыг сайжруулахгүй.


Би тавтай морилно уу гэж бодож байна үед би эх үүсвэр дээр дарна уу. Би copy-pastedДокументацийн дээж: Энэ нь зүгээр л ажиллаж байна! Энэ нь миний ха-ха цаг юм.


Загвар нь OpenAI ашигладаг, би Ollama ашигладаг. Би OpenAI, Mistral AI, Ollama нь MCP-ийг туршиж байна. OpenAI загвар нь зөвхөн MCP-ийг хамтран ажилладаг. Би дээрх хэлбэрийн харьцуулав:


curl -N -H 'Content-Type: application/json' localhost:8080 -d '{ "sessionId": "1", "text": "What are my top three most popular GitHub repos?" }'


Одоо, OpenAI зөв арга хэрэгсэлээр хүсэлтийг хуваалцах, би хүссэн хариу нь өгдөг:


Here are my findings regarding your top three most popular GitHub repositories:

1. **[opentelemetry-tracing](https://github.com/nfrankel/opentelemetry-tracing)**  
   - **Description**: Demo for end-to-end tracing via OpenTelemetry.  
   - **Stars**: 68  
   - **Forks**: 25  
   - **Open Issues**: 10  

2. **[kaadin](https://github.com/nfrankel/kaadin)**  
   - **Description**: Kotlin DSL for Vaadin.  
   - **Stars**: 44  
   - **Forks**: 12  
   - **Open Issues**: 3  

3. **[jvm-controller](https://github.com/nfrankel/jvm-controller)**  
   - **Description**: Example on how to write a Kubernetes controller in Java.  
   - **Stars**: 33  
   - **Forks**: 10  
   - **Open Issues**: 0  

These repositories demonstrate a range of your interests and contributions in the areas of observability, Kotlin development, and Kubernetes.%    


Бид MCP серверд автентичлалын токен дамжуулдаг бөгөөд энэ нь GitHub API-д дамжуулдаг бөгөөд энэ нь хэрэглэгч гэж нэрлэдэг гэж мэддэг.my reposЭнэ нь олон хэрэглэгчдэд зориулсан стандарт вэб програмуудыг ашиглах нь гайхамшигтай хэрэглээний тохиолдолд юм. Гэсэн хэдий ч, энэ нь ширээний хэрэглээний тохиолдолд маш тохиромжтой байдаг.


Өнгөрсөн асуулт,Эдүүлбэр, GitHub-д хамгийн алдартай репозиторийг олж авах, вэб програмуудтай холбоотой байдаг, учир нь тэдний контекстгүй байдаг – хэрэглэгчийн.

Баримтлал

Энэ нийтлэл нь MCP сервер нь LangChain4J-ийн апп-ийн интеграцид төвлөрөг. Документацид нь тохиргоог хялбар байдаг боловч хэд хэдэн давуу тал байдаг.


Эхний, MCP сервер таны архитектурт хэрхэн тохиромжтой вэ, энэ нь танд байна. Би маш сайн ашиглан энэ нь хуваалцахын тулд бүтээлч байх ёстойmcp-proxy. Дараа нь, LangChain4J нь хязгаарлагдмал ач холбогдолтой байж болох юм. Энэ нь танд хүчтэй ач холбогдолтой давхаргыг хангахын тулд бүх боломжийг олгодог, гэхдээ энэ доорх имплементацийг танд хуваалцах нь ач холбогдолтой биш юм. Би өгөгдөл нь энэ гэж нэрлэдэг гэж хүсч байна, гэхдээ би одоогийн хувилбар нь бета-д байна.


Би MCP-ийг бодит дэлхийд мэдэгдсэн бөгөөд энэ нь төслийн санаачлагад маш олон ширээг нээгдсэн.


Энэ бичлэгийн бүрэн эх үүсвэрийг олж болноGitHub нь.


To go further:


  • Model Context Protocol нь эхлэх
  • Awesome MCP сервер, хэрэглэгчид олж авах
  • LangChain4J - загварын контекст протокол (MCP)



Албан ёсны Posted on A Java Geek on April 27th, 2025

Ява Geek
L O A D I N G
. . . comments & more!

About Author

Nicolas Fränkel HackerNoon profile picture
Nicolas Fränkel@nfrankel
Dev Advocate | Developer & architect | Love learning and passing on what I learned!

TAG ҮҮ

ЭНЭ ӨГҮҮЛЛИЙГ ТОЛГОЙЛУУЛСАН...

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks